From 36dee78ceee9b51f8dc4f129d818731aa7e48a6c Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Tue, 28 Jan 2020 11:02:19 +0200 Subject: [PATCH 1/4] MXS-2850 Add test that reveals bug --- maxscale-system-test/masking_auto_firewall.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/maxscale-system-test/masking_auto_firewall.cpp b/maxscale-system-test/masking_auto_firewall.cpp index fcbb50bfa..ea8a73b9c 100644 --- a/maxscale-system-test/masking_auto_firewall.cpp +++ b/maxscale-system-test/masking_auto_firewall.cpp @@ -118,6 +118,9 @@ void run(TestConnections& test) // This should NOT succeed as a masked column is used in the statment. test_one(test, "select 1 UNION select a FROM masking_auto_firewall", Expect::FAILURE); + // This should NOT succeed as a masked column is used in the statment. + test_one(test, "select 1 UNION ALL select a FROM masking_auto_firewall", Expect::FAILURE); + // This should NOT succeed as '*' is used in the statment. test_one(test, "select 1 UNION select * FROM masking_auto_firewall", Expect::FAILURE); From 399f3129110de2a427758a62de3f6a51a5004e2d Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Tue, 28 Jan 2020 11:08:27 +0200 Subject: [PATCH 2/4] MXS-2850 Fix bug --- query_classifier/qc_sqlite/qc_sqlite.cc | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/query_classifier/qc_sqlite/qc_sqlite.cc b/query_classifier/qc_sqlite/qc_sqlite.cc index ae71ba208..6dc30e8c7 100644 --- a/query_classifier/qc_sqlite/qc_sqlite.cc +++ b/query_classifier/qc_sqlite/qc_sqlite.cc @@ -1247,6 +1247,11 @@ public: IGNORE_COMPOUND_SELECTS }; + bool is_significant_union(const Select* pSelect) + { + return ((pSelect->op == TK_UNION) || (pSelect->op == TK_ALL)) && pSelect->pPrior; + } + void update_field_infos_from_select(QcAliases& aliases, uint32_t context, const Select* pSelect, @@ -1343,7 +1348,7 @@ public: if (compound_approach == ANALYZE_COMPOUND_SELECTS) { - if (((pSelect->op == TK_UNION) || (pSelect->op == TK_ALL)) && pSelect->pPrior) + if (is_significant_union(pSelect)) { const Select* pPrior = pSelect->pPrior; @@ -2131,7 +2136,7 @@ public: } QcAliases aliases; - uint32_t context = (pSelect->op == TK_UNION && pSelect->pPrior) ? QC_FIELD_UNION : 0; + uint32_t context = is_significant_union(pSelect) ? QC_FIELD_UNION : 0; update_field_infos_from_select(aliases, context, pSelect, NULL); } From 9262e14aed7603b3b56da181ed0d29110863dac7 Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Tue, 28 Jan 2020 11:21:37 +0200 Subject: [PATCH 3/4] MXS-2851 Add test that reveals bug --- maxscale-system-test/masking_auto_firewall.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/maxscale-system-test/masking_auto_firewall.cpp b/maxscale-system-test/masking_auto_firewall.cpp index ea8a73b9c..f8672211d 100644 --- a/maxscale-system-test/masking_auto_firewall.cpp +++ b/maxscale-system-test/masking_auto_firewall.cpp @@ -87,6 +87,9 @@ void run(TestConnections& test) // This should NOT go through as a function is used with a masked column (that happens to be uppercase). test_one(test, "SELECT LENGTH(A), b FROM masking_auto_firewall", Expect::FAILURE); + // This should NOT go through as a function is used with a masked column. + test_one(test, "SELECT CAST(A as CHAR), b FROM masking_auto_firewall", Expect::FAILURE); + // This SHOULD go through as a function is NOT used with a masked column // in a prepared statement. test_one(test, "PREPARE ps1 FROM 'SELECT a, LENGTH(b) FROM masking_auto_firewall'", Expect::SUCCESS); From ea2665214fec8a42bb7ff3fb280d7d6730ac2eb3 Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Tue, 28 Jan 2020 12:10:24 +0200 Subject: [PATCH 4/4] MXS-2851 Fix bug --- query_classifier/qc_sqlite/qc_sqlite.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/query_classifier/qc_sqlite/qc_sqlite.cc b/query_classifier/qc_sqlite/qc_sqlite.cc index 6dc30e8c7..30b0e3142 100644 --- a/query_classifier/qc_sqlite/qc_sqlite.cc +++ b/query_classifier/qc_sqlite/qc_sqlite.cc @@ -917,6 +917,7 @@ public: case TK_BITAND: case TK_BITOR: case TK_CASE: + case TK_CAST: case TK_IN: case TK_ISNULL: case TK_MINUS: @@ -3976,6 +3977,9 @@ static const char* get_token_symbol(int token) case TK_CASE: return "case"; + case TK_CAST: + return "cast"; + case TK_IN: return "in";