From 0dd5ed23d38827b5a8b3979a8dd38502f5f8bced Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Tue, 16 Feb 2021 08:35:22 +0200 Subject: [PATCH] MXS-3404 Fix problem by extending parser --- .../qc_sqlite/sqlite-src-3110100/src/parse.y | 13 ++++++++++++- .../sqlite-src-3110100/tool/mkkeywordhash.c | 6 ++++++ query_classifier/test/maxscale.test | 3 ++- 3 files changed, 20 insertions(+), 2 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 577009e52..34c169635 100644 --- a/query_classifier/qc_sqlite/sqlite-src-3110100/src/parse.y +++ b/query_classifier/qc_sqlite/sqlite-src-3110100/src/parse.y @@ -646,7 +646,7 @@ columnid(A) ::= nm(X). { QUERY QUICK RAISE RECURSIVE /*REINDEX*/ RELEASE /*RENAME*/ /*REPLACE*/ RESET RESTRICT ROLLBACK ROLLUP ROW SAVEPOINT SELECT_OPTIONS_KW /*SEQUENCE*/ SHARE SLAVE /*START*/ STATEMENT STATUS - TABLES TEMP TEMPTABLE /*TRIGGER*/ + TABLES TEMP TEMPTABLE /*TRIGGER*/ TRIM TRIM_ARG /*TRUNCATE*/ // TODO: UNSIGNED is a reserved word and should not automatically convert into an identifer. // TODO: However, if not here then rules such as CAST need to be modified. @@ -2130,6 +2130,17 @@ expr(A) ::= keyword_as_function(X) LP distinct(D) exprlist(Y) RP(E). { A.pExpr->flags |= EP_Distinct; } } + +trim_arg1_opt ::= TRIM_ARG. +trim_arg1_opt ::= . + +trim_arg2 ::= INTEGER|STRING. + +expr(A) ::= TRIM(X) LP trim_arg1_opt trim_arg2 FROM expr(Y) RP(Z). { + ExprList* pArgs = sqlite3ExprListAppend(pParse, NULL, Y.pExpr); + A.pExpr = sqlite3ExprFunction(pParse, pArgs, &X); + spanSet(&A, &X, &Z); +} %endif expr(A) ::= id(X) LP STAR RP(E) wf_opt. { A.pExpr = sqlite3ExprFunction(pParse, 0, &X); 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 80470dff1..5b4acb929 100644 --- a/query_classifier/qc_sqlite/sqlite-src-3110100/tool/mkkeywordhash.c +++ b/query_classifier/qc_sqlite/sqlite-src-3110100/tool/mkkeywordhash.c @@ -176,6 +176,7 @@ static Keyword aKeywordTable[] = { { "BETWEEN", "TK_BETWEEN", ALWAYS }, #ifdef MAXSCALE { "BINARY", "TK_BINARY", ALWAYS }, + { "BOTH", "TK_TRIM_ARG", ALWAYS }, #endif { "BY", "TK_BY", ALWAYS }, #ifdef MAXSCALE @@ -336,6 +337,7 @@ static Keyword aKeywordTable[] = { { "KEY", "TK_KEY", ALWAYS }, #ifdef MAXSCALE { "KEYS", "TK_KEYS", ALWAYS }, + { "LEADING", "TK_TRIM_ARG" , ALWAYS }, #endif { "LEFT", "TK_JOIN_KW", ALWAYS }, { "LIKE", "TK_LIKE_KW", ALWAYS }, @@ -479,9 +481,13 @@ static Keyword aKeywordTable[] = { { "TIES", "TK_TIES", ANALYZE }, #endif { "TO", "TK_TO", ALWAYS }, +#ifdef MAXSCALE + { "TRAILING", "TK_TRIM_ARG", ALWAYS }, +#endif { "TRANSACTION", "TK_TRANSACTION", ALWAYS }, { "TRIGGER", "TK_TRIGGER", TRIGGER }, #ifdef MAXSCALE + { "TRIM", "TK_TRIM", ALWAYS }, { "TRUNCATE", "TK_TRUNCATE", ALWAYS }, { "UNBOUNDED", "TK_UNBOUNDED", ALWAYS }, #endif diff --git a/query_classifier/test/maxscale.test b/query_classifier/test/maxscale.test index 1eb3d3b45..e7a3af5e1 100644 --- a/query_classifier/test/maxscale.test +++ b/query_classifier/test/maxscale.test @@ -165,4 +165,5 @@ OPTIMIZE LOCAL TABLE t WAIT 42; USE `test`; # MXS-3404 -SELECT rdba_test() AS crmid, trim(LEADING 0 FROM @@server_id); +# qc_mysqlembedded claims that "trim(LEADING ...)" is ltrim, to avoid that we use BOTH. +SELECT rdba_test() AS crmid, trim(BOTH 0 FROM @@server_id);