MXS-1849 Fix handling of show tables queries in schemarouter

There was a bug in handling of the "show tables from" queries that
caused multiple results to the client. These queries are now handled
correctly.
This commit is contained in:
Marko 2018-06-27 16:44:55 +03:00
parent bfd3d2975d
commit 293279366f
2 changed files with 39 additions and 30 deletions

View File

@ -341,6 +341,14 @@ int32_t SchemaRouterSession::routeQuery(GWBUF* pPacket)
gwbuf_free(pPacket);
return ret;
}
else if (qc_query_is_type(type, QUERY_TYPE_SHOW_TABLES))
{
if (send_tables(pPacket))
{
gwbuf_free(pPacket);
return 1;
}
}
else if (detect_show_shards(pPacket))
{
if (send_shards())
@ -1482,26 +1490,7 @@ SERVER* SchemaRouterSession::get_shard_target(GWBUF* buffer, uint32_t qtype)
MXS_FREE(databases);
}
/* Check if the query is a show tables query with a specific database */
if (qc_query_is_type(qtype, QUERY_TYPE_SHOW_TABLES))
{
char *query = modutil_get_SQL(buffer);
char *tmp;
if ((tmp = strcasestr(query, "from")))
{
const char *delim = "` \n\t;";
char *saved, *tok = strtok_r(tmp, delim, &saved);
tok = strtok_r(NULL, delim, &saved);
if (tok)
{
send_tables(tok);
}
}
MXS_FREE(query);
}
else if (buffer->hint && buffer->hint->type == HINT_ROUTE_TO_NAMED_SERVER)
if (buffer->hint && buffer->hint->type == HINT_ROUTE_TO_NAMED_SERVER)
{
for (SSRBackendList::iterator it = m_backends.begin(); it != m_backends.end(); it++)
{
@ -1673,9 +1662,26 @@ bool SchemaRouterSession::send_databases()
return rval;
}
bool SchemaRouterSession::send_tables(std::string database)
bool SchemaRouterSession::send_tables(GWBUF* pPacket)
{
char *query = modutil_get_SQL(pPacket);
char *tmp;
bool rval = false;
std::string database;
if ((tmp = strcasestr(query, "from")))
{
const char *delim = "` \n\t;";
char *saved, *tok = strtok_r(tmp, delim, &saved);
tok = strtok_r(NULL, delim, &saved);
database = tok;
}
if (database.empty())
{
MXS_FREE(query);
return rval;
}
ServerMap tablelist;
std::list<std::string> list;
m_shard.get_content(tablelist);
@ -1695,16 +1701,19 @@ bool SchemaRouterSession::send_tables(std::string database)
list.push_back(table);
}
}
RESULTSET* resultset = resultset_create(result_set_cb, &list);
if (resultset_add_column(resultset, "Table", MYSQL_DATABASE_MAXLEN,
COL_TYPE_VARCHAR))
if (!list.empty())
{
resultset_stream_mysql(resultset, m_client);
rval = true;
}
resultset_free(resultset);
RESULTSET* resultset = resultset_create(result_set_cb, &list);
if (resultset_add_column(resultset, "Table", MYSQL_DATABASE_MAXLEN,
COL_TYPE_VARCHAR))
{
resultset_stream_mysql(resultset, m_client);
rval = true;
}
resultset_free(resultset);
}
MXS_FREE(query);
return rval;
}

View File

@ -140,7 +140,7 @@ private:
/** Shard mapping functions */
bool send_databases();
bool send_shards();
bool send_tables(std::string db);
bool send_tables(GWBUF* pPacket);
void query_databases();
int inspect_mapping_states(SSRBackend& bref, GWBUF** wbuf);
enum showdb_response parse_mapping_response(SSRBackend& bref, GWBUF** buffer);