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 389ba54b0..97894f06f 100644 --- a/query_classifier/qc_sqlite/sqlite-src-3110100/src/parse.y +++ b/query_classifier/qc_sqlite/sqlite-src-3110100/src/parse.y @@ -633,7 +633,7 @@ columnid(A) ::= nm(X). { /*KEY*/ /*LIKE_KW*/ LOCAL - MASTER /*MATCH*/ MERGE + MASTER /*MATCH*/ MERGE MODE // TODO: MOD is a keyword that should not decay into an id. However, now that is does, // TODO: also "mod(a, 2)" kind of usage will be accepted. Incorrect use will anyway be // TODO: rejected by the server. @@ -645,7 +645,7 @@ columnid(A) ::= nm(X). { PARTITIONS PASSWORD PREVIOUS QUERY QUICK RAISE RECURSIVE /*REINDEX*/ RELEASE /*RENAME*/ /*REPLACE*/ RESET 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. @@ -1045,7 +1045,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 c31357797..4e6ce4903 100644 --- a/query_classifier/qc_sqlite/sqlite-src-3110100/tool/mkkeywordhash.c +++ b/query_classifier/qc_sqlite/sqlite-src-3110100/tool/mkkeywordhash.c @@ -351,6 +351,7 @@ static Keyword aKeywordTable[] = { { "MASTER", "TK_MASTER", ALWAYS }, { "MERGE", "TK_MERGE", ALWAYS }, { "MOD", "TK_MOD", ALWAYS }, + { "MODE", "TK_MODE", ALWAYS }, { "NAMES", "TK_NAMES", ALWAYS }, #endif { "NATURAL", "TK_JOIN_KW", ALWAYS }, @@ -446,6 +447,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 }, diff --git a/query_classifier/test/expected.sql b/query_classifier/test/expected.sql index 6af2ee651..aca65af9b 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;