From 4bf2b27b3e11acda334cc97c6e27bdfef77cba8f Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Wed, 31 May 2017 13:57:01 +0300 Subject: [PATCH] MXS-1275: Accept @@[SESSION|GLOBAL].sql_mode = ... --- .../MySQL/MySQLClient/setsqlmodeparser.hh | 23 ++++++++- .../MySQLClient/test/test_setsqlmodeparser.cc | 50 +++++++++++++++++-- 2 files changed, 68 insertions(+), 5 deletions(-) diff --git a/server/modules/protocol/MySQL/MySQLClient/setsqlmodeparser.hh b/server/modules/protocol/MySQL/MySQLClient/setsqlmodeparser.hh index 97afebdd7..6ecfe96b7 100644 --- a/server/modules/protocol/MySQL/MySQLClient/setsqlmodeparser.hh +++ b/server/modules/protocol/MySQL/MySQLClient/setsqlmodeparser.hh @@ -39,8 +39,10 @@ public: UNUSED_FIRST = 0xFF, TK_DEFAULT, TK_GLOBAL, + TK_GLOBAL_VAR, TK_ORACLE, TK_SESSION, + TK_SESSION_VAR, TK_SET, TK_SQL_MODE, }; @@ -353,6 +355,18 @@ private: rv = parse_set(pSql_mode); break; + case TK_GLOBAL_VAR: + case TK_SESSION_VAR: + if (next_token() == '.') + { + rv = parse_set(pSql_mode); + } + else + { + rv = ERROR; + } + break; + case TK_SQL_MODE: if (next_token() == '=') { @@ -561,14 +575,19 @@ private: case '@': if (is_next_alpha('S', 2)) { - token = expect_token(MXS_CP_EXPECT_TOKEN("@@SESSION"), TK_SESSION); + token = expect_token(MXS_CP_EXPECT_TOKEN("@@SESSION"), TK_SESSION_VAR); } else if (is_next_alpha('G', 2)) { - token = expect_token(MXS_CP_EXPECT_TOKEN("@@GLOBAL"), TK_GLOBAL); + token = expect_token(MXS_CP_EXPECT_TOKEN("@@GLOBAL"), TK_GLOBAL_VAR); + } + else if (is_next_alpha('L', 2)) + { + token = expect_token(MXS_CP_EXPECT_TOKEN("@@LOCAL"), TK_SESSION_VAR); } break; + case '.': case '\'': case '"': case '`': diff --git a/server/modules/protocol/MySQL/MySQLClient/test/test_setsqlmodeparser.cc b/server/modules/protocol/MySQL/MySQLClient/test/test_setsqlmodeparser.cc index 33454a286..b620c04e6 100644 --- a/server/modules/protocol/MySQL/MySQLClient/test/test_setsqlmodeparser.cc +++ b/server/modules/protocol/MySQL/MySQLClient/test/test_setsqlmodeparser.cc @@ -60,6 +60,16 @@ struct TEST_CASE P::IS_SET_SQL_MODE, P::DEFAULT }, + { + "SET SQL_MODE=DEFAULT;", + P::IS_SET_SQL_MODE, + P::DEFAULT + }, + { + "SET SQL_MODE=DEFAULT; ", + P::IS_SET_SQL_MODE, + P::DEFAULT + }, { "-- This is a comment\nSET SQL_MODE=DEFAULT", P::IS_SET_SQL_MODE, @@ -135,6 +145,31 @@ struct TEST_CASE P::IS_SET_SQL_MODE, P::ORACLE }, + { + "SET @@GLOBAL.SQL_MODE=ORACLE", + P::IS_SET_SQL_MODE, + P::ORACLE + }, + { + "SET @@SESSION.SQL_MODE=ORACLE", + P::IS_SET_SQL_MODE, + P::ORACLE + }, + { + "SET @@LOCAL.SQL_MODE=ORACLE", + P::IS_SET_SQL_MODE, + P::ORACLE + }, + { + "SET @@LOCAL . SQL_MODE = ORACLE", + P::IS_SET_SQL_MODE, + P::ORACLE + }, + { + "SET @@SESSION.blah = 1234, @@GLOBAL.blahblah = something, sql_mode=ORACLE", + P::IS_SET_SQL_MODE, + P::ORACLE + }, }; const int N_TEST_CASES = sizeof(test_cases)/sizeof(test_cases[0]); @@ -286,6 +321,15 @@ int test() rv = EXIT_FAILURE; } + if (rv == EXIT_SUCCESS) + { + cout << "OK" << endl; + } + else + { + cout << "ERROR" << endl; + } + return rv; } @@ -294,7 +338,7 @@ int test() int main(int argc, char* argv[]) { - int rc = EXIT_SUCCESS; + int rv = EXIT_SUCCESS; srand(time(NULL)); @@ -304,7 +348,7 @@ int main(int argc, char* argv[]) if (mxs_log_init(NULL, ".", MXS_LOG_TARGET_DEFAULT)) { - rc = test(); + rv = test(); mxs_log_finish(); } @@ -313,5 +357,5 @@ int main(int argc, char* argv[]) cerr << "error: Could not initialize log." << endl; } - return rc; + return rv; }