MXS-1048: Handle backquoted database names
The schemarouter didn't expect backquoted database names for SHOW TABLE and USE statements.
This commit is contained in:
@ -531,8 +531,9 @@ char* get_shard_target_name(ROUTER_INSTANCE* router,
|
|||||||
query = modutil_get_SQL(buffer);
|
query = modutil_get_SQL(buffer);
|
||||||
if ((tmp = strcasestr(query, "from")))
|
if ((tmp = strcasestr(query, "from")))
|
||||||
{
|
{
|
||||||
char *saved, *tok = strtok_r(tmp, " ;", &saved);
|
const char *delim = "` \n\t;";
|
||||||
tok = strtok_r(NULL, " ;", &saved);
|
char *saved, *tok = strtok_r(tmp, delim, &saved);
|
||||||
|
tok = strtok_r(NULL, delim, &saved);
|
||||||
ss_dassert(tok != NULL);
|
ss_dassert(tok != NULL);
|
||||||
tmp = (char*) hashtable_fetch(ht, tok);
|
tmp = (char*) hashtable_fetch(ht, tok);
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
bool extract_database(GWBUF* buf, char* str)
|
bool extract_database(GWBUF* buf, char* str)
|
||||||
{
|
{
|
||||||
uint8_t* packet;
|
uint8_t* packet;
|
||||||
char *saved,*tok,*query = NULL;
|
char *saved, *tok, *query = NULL;
|
||||||
bool succp = true;
|
bool succp = true;
|
||||||
unsigned int plen;
|
unsigned int plen;
|
||||||
|
|
||||||
@ -31,33 +31,37 @@ bool extract_database(GWBUF* buf, char* str)
|
|||||||
plen = gw_mysql_get_byte3(packet) - 1;
|
plen = gw_mysql_get_byte3(packet) - 1;
|
||||||
|
|
||||||
/** Copy database name from MySQL packet to session */
|
/** Copy database name from MySQL packet to session */
|
||||||
if(qc_get_operation(buf) == QUERY_OP_CHANGE_DB)
|
if (qc_get_operation(buf) == QUERY_OP_CHANGE_DB)
|
||||||
{
|
{
|
||||||
|
const char *delim = "` \n\t;";
|
||||||
|
|
||||||
query = modutil_get_SQL(buf);
|
query = modutil_get_SQL(buf);
|
||||||
tok = strtok_r(query," ;",&saved);
|
tok = strtok_r(query, delim, &saved);
|
||||||
if(tok == NULL || strcasecmp(tok,"use") != 0)
|
|
||||||
|
if (tok == NULL || strcasecmp(tok, "use") != 0)
|
||||||
{
|
{
|
||||||
MXS_ERROR("extract_database: Malformed chage database packet.");
|
MXS_ERROR("extract_database: Malformed chage database packet.");
|
||||||
succp = false;
|
succp = false;
|
||||||
goto retblock;
|
goto retblock;
|
||||||
}
|
}
|
||||||
|
|
||||||
tok = strtok_r(NULL," ;",&saved);
|
tok = strtok_r(NULL, delim, &saved);
|
||||||
if(tok == NULL)
|
|
||||||
|
if (tok == NULL)
|
||||||
{
|
{
|
||||||
MXS_ERROR("extract_database: Malformed chage database packet.");
|
MXS_ERROR("extract_database: Malformed change database packet.");
|
||||||
succp = false;
|
succp = false;
|
||||||
goto retblock;
|
goto retblock;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy(str,tok,MYSQL_DATABASE_MAXLEN);
|
strncpy(str, tok, MYSQL_DATABASE_MAXLEN);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
memcpy(str,packet + 5,plen);
|
memcpy(str, packet + 5, plen);
|
||||||
memset(str + plen,0,1);
|
memset(str + plen, 0, 1);
|
||||||
}
|
}
|
||||||
retblock:
|
retblock:
|
||||||
free(query);
|
free(query);
|
||||||
return succp;
|
return succp;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user