From 9b36ba5e0a465b8f57dcacd4cfcdad32e1854aa8 Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Sat, 24 Feb 2018 17:02:51 +0200 Subject: [PATCH] MXS-1677: Don't assume all queries are in text form After a temporary table is created, readwritesplit will check whether a query drops or targets that temporary table. The check for query type was missing from the table dropping part of the code. The temporary table read part was checking that the query is a text form query. Added a debug assertion to the query parsing function in qc_sqlite to catch this type of interface misuse. --- query_classifier/qc_sqlite/qc_sqlite.cc | 1 + server/modules/routing/readwritesplit/rwsplit_route_stmt.cc | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/query_classifier/qc_sqlite/qc_sqlite.cc b/query_classifier/qc_sqlite/qc_sqlite.cc index ad0b10bac..713586cdc 100644 --- a/query_classifier/qc_sqlite/qc_sqlite.cc +++ b/query_classifier/qc_sqlite/qc_sqlite.cc @@ -3544,6 +3544,7 @@ static bool parse_query(GWBUF* query, uint32_t collect) { MXS_ERROR("The provided buffer does not contain a COM_QUERY, but a %s.", STRPACKETTYPE(MYSQL_GET_COMMAND(data))); + ss_dassert(!true); } } else diff --git a/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc b/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc index 8917d77f7..a9d6890c9 100644 --- a/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc +++ b/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc @@ -834,10 +834,10 @@ handle_multi_temp_and_load(RWSplitSession *rses, GWBUF *querybuf, /** * Check if the query has anything to do with temporary tables. */ - if (rses->have_tmp_tables) + if (rses->have_tmp_tables && is_packet_a_query(packet_type)) { check_drop_tmp_table(rses, querybuf); - if (is_packet_a_query(packet_type) && is_read_tmp_table(rses, querybuf, *qtype)) + if (is_read_tmp_table(rses, querybuf, *qtype)) { *qtype |= QUERY_TYPE_MASTER_READ; }