Merge branch '2.3' into develop
This commit is contained in:
@ -749,7 +749,7 @@ public:
|
||||
|
||||
if (should_collect_database)
|
||||
{
|
||||
zCollected_database = update_database_names(database);
|
||||
zCollected_database = update_database_names(database, nDatabase);
|
||||
}
|
||||
|
||||
if (pAliases && zCollected_table && zAlias)
|
||||
@ -2281,11 +2281,7 @@ public:
|
||||
// TODO: certain what a returned database actually refers to
|
||||
// TODO: so better not to provide a name until there is a
|
||||
// TODO: specific op.
|
||||
char database[pDatabase->n + 1];
|
||||
strncpy(database, pDatabase->z, pDatabase->n);
|
||||
database[pDatabase->n] = 0;
|
||||
|
||||
update_database_names(database);
|
||||
update_database_names(pDatabase->z, pDatabase->n);
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
@ -2369,7 +2365,7 @@ public:
|
||||
exposed_sqlite3ExprDelete(pParse->db, pExprSpan->pExpr);
|
||||
}
|
||||
|
||||
void maxscaleExplain(Parse* pParse, Token* pNext)
|
||||
void maxscaleExplainTable(Parse* pParse, SrcList* pList)
|
||||
{
|
||||
mxb_assert(this_thread.initialized);
|
||||
|
||||
@ -2377,28 +2373,24 @@ public:
|
||||
m_type_mask = QUERY_TYPE_READ;
|
||||
m_operation = QUERY_OP_SHOW;
|
||||
|
||||
if (pNext)
|
||||
for (int i = 0; i < pList->nSrc; ++i)
|
||||
{
|
||||
if (pNext->z)
|
||||
if (pList->a[i].zName)
|
||||
{
|
||||
const char EXTENDED[] = "EXTENDED";
|
||||
const char PARTITIONS[] = "PARTITIONS";
|
||||
const char FORMAT[] = "FORMAT";
|
||||
const char FOR[] = "FOR";
|
||||
|
||||
#define MATCHES_KEYWORD(t, k) ((t->n == sizeof(k) - 1) && (strncasecmp(t->z, k, t->n) == 0))
|
||||
|
||||
if (MATCHES_KEYWORD(pNext, EXTENDED)
|
||||
|| MATCHES_KEYWORD(pNext, PARTITIONS)
|
||||
|| MATCHES_KEYWORD(pNext, FORMAT)
|
||||
|| MATCHES_KEYWORD(pNext, FOR))
|
||||
{
|
||||
m_operation = QUERY_OP_EXPLAIN;
|
||||
}
|
||||
update_names(pList->a[i].zDatabase, pList->a[i].zName, pList->a[i].zAlias, nullptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void maxscaleExplain(Parse* pParse)
|
||||
{
|
||||
mxb_assert(this_thread.initialized);
|
||||
|
||||
m_status = QC_QUERY_PARSED;
|
||||
m_type_mask = QUERY_TYPE_READ;
|
||||
m_operation = QUERY_OP_EXPLAIN;
|
||||
}
|
||||
|
||||
void maxscaleFlush(Parse* pParse, Token* pWhat)
|
||||
{
|
||||
mxb_assert(this_thread.initialized);
|
||||
@ -3053,7 +3045,21 @@ public:
|
||||
switch (pShow->what)
|
||||
{
|
||||
case MXS_SHOW_COLUMNS:
|
||||
m_type_mask = QUERY_TYPE_READ;
|
||||
{
|
||||
m_type_mask = QUERY_TYPE_READ;
|
||||
const char* zDatabase = nullptr;
|
||||
size_t nDatabase = 0;
|
||||
|
||||
if (pShow->pDatabase)
|
||||
{
|
||||
zDatabase = pShow->pDatabase->z;
|
||||
nDatabase = pShow->pDatabase->n;
|
||||
|
||||
update_database_names(zDatabase, nDatabase);
|
||||
}
|
||||
|
||||
update_table_names(zDatabase, nDatabase, pShow->pName->z, pShow->pName->n);
|
||||
}
|
||||
break;
|
||||
|
||||
case MXS_SHOW_CREATE_SEQUENCE:
|
||||
@ -3113,11 +3119,7 @@ public:
|
||||
m_type_mask = QUERY_TYPE_SHOW_TABLES;
|
||||
if (pShow->pDatabase->z)
|
||||
{
|
||||
char db[pShow->pDatabase->n + 1];
|
||||
strncpy(db, pShow->pDatabase->z, pShow->pDatabase->n);
|
||||
db[pShow->pDatabase->n] = 0;
|
||||
|
||||
update_database_names(db);
|
||||
update_database_names(pShow->pDatabase->z, pShow->pDatabase->n);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -3302,11 +3304,13 @@ private:
|
||||
return pz;
|
||||
}
|
||||
|
||||
const char* table_name_collected(const char* zTable)
|
||||
const char* table_name_collected(const char* zTable, size_t nTable)
|
||||
{
|
||||
size_t i = 0;
|
||||
|
||||
while ((i < m_table_names.size()) && (strcmp(m_table_names[i], zTable) != 0))
|
||||
while ((i < m_table_names.size())
|
||||
&& (strlen(m_table_names[i]) != nTable
|
||||
|| (strncmp(m_table_names[i], zTable, nTable) != 0)))
|
||||
{
|
||||
++i;
|
||||
}
|
||||
@ -3326,11 +3330,13 @@ private:
|
||||
return (i != m_table_fullnames.size()) ? m_table_fullnames[i] : NULL;
|
||||
}
|
||||
|
||||
const char* database_name_collected(const char* zDatabase)
|
||||
const char* database_name_collected(const char* zDatabase, size_t nDatabase)
|
||||
{
|
||||
size_t i = 0;
|
||||
|
||||
while ((i < m_database_names.size()) && (strcmp(m_database_names[i], zDatabase) != 0))
|
||||
while ((i < m_database_names.size())
|
||||
&& (strlen(m_database_names[i]) != nDatabase
|
||||
|| (strncmp(m_database_names[i], zDatabase, nDatabase) != 0)))
|
||||
{
|
||||
++i;
|
||||
}
|
||||
@ -3345,11 +3351,11 @@ private:
|
||||
{
|
||||
mxb_assert(zTable && nTable);
|
||||
|
||||
const char* zCollected_table = table_name_collected(zTable);
|
||||
const char* zCollected_table = table_name_collected(zTable, nTable);
|
||||
|
||||
if (!zCollected_table)
|
||||
{
|
||||
char* zCopy = MXS_STRDUP_A(zTable);
|
||||
char* zCopy = MXS_STRNDUP_A(zTable, nTable);
|
||||
|
||||
m_table_names.push_back(zCopy);
|
||||
|
||||
@ -3360,7 +3366,8 @@ private:
|
||||
|
||||
if (nDatabase)
|
||||
{
|
||||
strcpy(fullname, zDatabase);
|
||||
strncpy(fullname, zDatabase, nDatabase);
|
||||
fullname[nDatabase] = 0;
|
||||
strcat(fullname, ".");
|
||||
}
|
||||
else
|
||||
@ -3368,7 +3375,7 @@ private:
|
||||
fullname[0] = 0;
|
||||
}
|
||||
|
||||
strcat(fullname, zTable);
|
||||
strncat(fullname, zTable, nTable);
|
||||
|
||||
if (!table_fullname_collected(fullname))
|
||||
{
|
||||
@ -3380,16 +3387,16 @@ private:
|
||||
return zCollected_table;
|
||||
}
|
||||
|
||||
const char* update_database_names(const char* zDatabase)
|
||||
const char* update_database_names(const char* zDatabase, size_t nDatabase)
|
||||
{
|
||||
mxb_assert(zDatabase);
|
||||
mxb_assert(strlen(zDatabase) != 0);
|
||||
|
||||
const char* zCollected_database = database_name_collected(zDatabase);
|
||||
const char* zCollected_database = database_name_collected(zDatabase, nDatabase);
|
||||
|
||||
if (!zCollected_database)
|
||||
{
|
||||
char* zCopy = MXS_STRDUP_A(zDatabase);
|
||||
char* zCopy = MXS_STRNDUP_A(zDatabase, nDatabase);
|
||||
|
||||
m_database_names.push_back(zCopy);
|
||||
|
||||
@ -3486,7 +3493,8 @@ extern void maxscaleDo(Parse*, ExprList* pEList);
|
||||
extern void maxscaleDrop(Parse*, int what, Token* pDatabase, Token* pName);
|
||||
extern void maxscaleExecute(Parse*, Token* pName, int type_mask);
|
||||
extern void maxscaleExecuteImmediate(Parse*, Token* pName, ExprSpan* pExprSpan, int type_mask);
|
||||
extern void maxscaleExplain(Parse*, Token* pNext);
|
||||
extern void maxscaleExplainTable(Parse*, SrcList* pList);
|
||||
extern void maxscaleExplain(Parse*);
|
||||
extern void maxscaleFlush(Parse*, Token* pWhat);
|
||||
extern void maxscaleHandler(Parse*, mxs_handler_t, SrcList* pFullName, Token* pName);
|
||||
extern void maxscaleLoadData(Parse*, SrcList* pFullName, int local);
|
||||
@ -4412,14 +4420,24 @@ void maxscaleExecuteImmediate(Parse* pParse, Token* pName, ExprSpan* pExprSpan,
|
||||
QC_EXCEPTION_GUARD(pInfo->maxscaleExecuteImmediate(pParse, pName, pExprSpan, type_mask));
|
||||
}
|
||||
|
||||
void maxscaleExplain(Parse* pParse, Token* pNext)
|
||||
void maxscaleExplainTable(Parse* pParse, SrcList* pList)
|
||||
{
|
||||
QC_TRACE();
|
||||
|
||||
QcSqliteInfo* pInfo = this_thread.pInfo;
|
||||
mxb_assert(pInfo);
|
||||
|
||||
QC_EXCEPTION_GUARD(pInfo->maxscaleExplain(pParse, pNext));
|
||||
QC_EXCEPTION_GUARD(pInfo->maxscaleExplainTable(pParse, pList));
|
||||
}
|
||||
|
||||
void maxscaleExplain(Parse* pParse)
|
||||
{
|
||||
QC_TRACE();
|
||||
|
||||
QcSqliteInfo* pInfo = this_thread.pInfo;
|
||||
mxb_assert(pInfo);
|
||||
|
||||
QC_EXCEPTION_GUARD(pInfo->maxscaleExplain(pParse));
|
||||
}
|
||||
|
||||
void maxscaleFlush(Parse* pParse, Token* pWhat)
|
||||
|
||||
Reference in New Issue
Block a user