From 1dd06c3ebcf97efbd71f17296756f05adb80cdc6 Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Thu, 18 Jun 2020 10:06:51 +0300 Subject: [PATCH 1/2] MXS-2996 Add test that reveals problem SELECT * FROM test LOCK IN SHARE MODE SELECT * FROM test FOR SHARE should be classified as QUERY_TYPE_WRITE. --- query_classifier/test/expected.sql | 2 ++ query_classifier/test/input.sql | 2 ++ 2 files changed, 4 insertions(+) diff --git a/query_classifier/test/expected.sql b/query_classifier/test/expected.sql index ab6b488ef..2a6db7fe5 100644 --- a/query_classifier/test/expected.sql +++ b/query_classifier/test/expected.sql @@ -36,3 +36,5 @@ QUERY_TYPE_WRITE QUERY_TYPE_READ QUERY_TYPE_WRITE QUERY_TYPE_WRITE +QUERY_TYPE_WRITE +QUERY_TYPE_WRITE diff --git a/query_classifier/test/input.sql b/query_classifier/test/input.sql index f488d8b92..351c27a1c 100644 --- a/query_classifier/test/input.sql +++ b/query_classifier/test/input.sql @@ -36,3 +36,5 @@ SET PASSWORD FOR 'user'@'10.0.0.1'='*C50EB75D7CB4C76B5264218B92BC69E6815B057A'; SELECT UTC_TIMESTAMP(); SELECT COUNT(IF(!c.ispackage, 1, NULL)) as cnt FROM test FOR UPDATE; SELECT handler FROM abc FOR UPDATE; +SELECT * FROM test LOCK IN SHARE MODE; +SELECT * FROM test FOR SHARE; From 9fb5336615abd665daa9431a0aafd6fb97cc6df4 Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Thu, 18 Jun 2020 10:17:08 +0300 Subject: [PATCH 2/2] MXS-2996 Fix classification of "SELECT ... LOCK IN SHARE MODE" And also of "SELECT ... FOR SHARE" --- .../qc_sqlite/sqlite-src-3110100/src/parse.y | 10 +++++++--- .../qc_sqlite/sqlite-src-3110100/tool/mkkeywordhash.c | 2 ++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/query_classifier/qc_sqlite/sqlite-src-3110100/src/parse.y b/query_classifier/qc_sqlite/sqlite-src-3110100/src/parse.y index 75b8401b4..2deedf381 100644 --- a/query_classifier/qc_sqlite/sqlite-src-3110100/src/parse.y +++ b/query_classifier/qc_sqlite/sqlite-src-3110100/src/parse.y @@ -630,14 +630,14 @@ columnid(A) ::= nm(X). { IF IMMEDIATE INITIALLY INSTEAD /*KEY*/ /*LIKE_KW*/ - MASTER /*MATCH*/ MERGE + MASTER /*MATCH*/ MERGE MODE NAMES NEXT NO OF OFFSET OPEN PARTITIONS PASSWORD PREVIOUS QUICK RAISE RECURSIVE /*REINDEX*/ RELEASE /*RENAME*/ /*REPLACE*/ RESTRICT ROLLBACK ROLLUP ROW - SAVEPOINT SELECT_OPTIONS_KW /*SEQUENCE*/ SLAVE /*START*/ STATEMENT STATUS + SAVEPOINT SELECT_OPTIONS_KW /*SEQUENCE*/ SHARE SLAVE /*START*/ STATEMENT STATUS TABLES TEMP TEMPTABLE /*TRIGGER*/ /*TRUNCATE*/ // TODO: UNSIGNED is a reserved word and should not automatically convert into an identifer. @@ -1036,7 +1036,11 @@ select(A) ::= with(W) selectnowith(X). { %ifdef MAXSCALE selectnowithsuffix(A) ::= selectnowith(X). {A = X;} -selectnowithsuffix(A) ::= selectnowith(X) FOR UPDATE. { +for_something ::= FOR UPDATE. +for_something ::= FOR SHARE. +for_something ::= LOCK IN SHARE MODE. + +selectnowithsuffix(A) ::= selectnowith(X) for_something. { A = X; maxscale_set_type_mask(QUERY_TYPE_WRITE); } diff --git a/query_classifier/qc_sqlite/sqlite-src-3110100/tool/mkkeywordhash.c b/query_classifier/qc_sqlite/sqlite-src-3110100/tool/mkkeywordhash.c index fb224da7a..94d4e0e60 100644 --- a/query_classifier/qc_sqlite/sqlite-src-3110100/tool/mkkeywordhash.c +++ b/query_classifier/qc_sqlite/sqlite-src-3110100/tool/mkkeywordhash.c @@ -348,6 +348,7 @@ static Keyword aKeywordTable[] = { #ifdef MAXSCALE { "MASTER", "TK_MASTER", ALWAYS }, { "MERGE", "TK_MERGE", ALWAYS }, + { "MODE", "TK_MODE", ALWAYS }, { "NAMES", "TK_NAMES", ALWAYS }, #endif { "NATURAL", "TK_JOIN_KW", ALWAYS }, @@ -436,6 +437,7 @@ static Keyword aKeywordTable[] = { #ifdef MAXSCALE { "SESSION", "TK_SESSION", ALWAYS }, { "SEPARATOR", "TK_SEPARATOR", ALWAYS }, + { "SHARE", "TK_SHARE", ALWAYS }, { "SHOW", "TK_SHOW", ALWAYS }, { "SLAVE", "TK_SLAVE", ALWAYS }, { "SPATIAL", "TK_SPATIAL", ALWAYS },