From a85ce2e915aa001042fba1ee6d0336270c7dadae Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Sat, 11 Mar 2017 12:05:07 +0200 Subject: [PATCH] Take TrxBoundaryParser into use --- server/core/query_classifier.cc | 13 +++++++++++-- server/core/test/testtrxtracking.cc | 25 +++++++++++++++++++++---- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/server/core/query_classifier.cc b/server/core/query_classifier.cc index ad10c665c..33590c2df 100644 --- a/server/core/query_classifier.cc +++ b/server/core/query_classifier.cc @@ -18,6 +18,7 @@ #include #include #include +#include "maxscale/trxboundaryparser.hh" #include "../core/maxscale/modules.h" @@ -244,7 +245,8 @@ bool qc_process_init(uint32_t kind) } else if (strcmp(parse_using, "QC_TRX_PARSE_USING_PARSER") == 0) { - ss_dassert(!true); + qc_trx_parse_using = QC_TRX_PARSE_USING_PARSER; + MXS_NOTICE("Transaction detection using custom PARSER."); } else { @@ -1065,6 +1067,13 @@ static uint32_t qc_get_trx_type_mask_using_regex(GWBUF* stmt) return type_mask; } +static uint32_t qc_get_trx_type_mask_using_parser(GWBUF* stmt) +{ + maxscale::TrxBoundaryParser parser; + + return parser.type_mask_of(stmt); +} + uint32_t qc_get_trx_type_mask_using(GWBUF* stmt, qc_trx_parse_using_t use) { uint32_t type_mask = 0; @@ -1080,7 +1089,7 @@ uint32_t qc_get_trx_type_mask_using(GWBUF* stmt, qc_trx_parse_using_t use) break; case QC_TRX_PARSE_USING_PARSER: - ss_dassert(false); + type_mask = qc_get_trx_type_mask_using_parser(stmt); break; default: diff --git a/server/core/test/testtrxtracking.cc b/server/core/test/testtrxtracking.cc index 3c63a4923..4a475dfb9 100644 --- a/server/core/test/testtrxtracking.cc +++ b/server/core/test/testtrxtracking.cc @@ -16,7 +16,7 @@ #include #include #include -#include "../../server/core/maxscale/query_classifier.h" +#include "../core/maxscale/query_classifier.h" using namespace std; @@ -51,6 +51,11 @@ uint32_t get_regex_trx_type_mask(GWBUF* pBuf) return qc_get_trx_type_mask_using(pBuf, QC_TRX_PARSE_USING_REGEX); } +uint32_t get_parser_trx_type_mask(GWBUF* pBuf) +{ + return qc_get_trx_type_mask_using(pBuf, QC_TRX_PARSE_USING_PARSER); +} + } namespace @@ -76,19 +81,21 @@ struct test_case { "START TRANSACTION", QUERY_TYPE_BEGIN_TRX }, { "START TRANSACTION", QUERY_TYPE_BEGIN_TRX }, + { "START TRANSACTION READ ONLY", QUERY_TYPE_BEGIN_TRX | QUERY_TYPE_READ }, { "START TRANSACTION READ ONLY", QUERY_TYPE_BEGIN_TRX | QUERY_TYPE_READ }, - { "START TRANSACTION READ ONLY ", QUERY_TYPE_BEGIN_TRX | QUERY_TYPE_READ }, - { "START TRANSACTION READ ONLY ", QUERY_TYPE_BEGIN_TRX | QUERY_TYPE_READ }, + { "START TRANSACTION READ ONLY", QUERY_TYPE_BEGIN_TRX | QUERY_TYPE_READ }, + { "START TRANSACTION READ ONLY", QUERY_TYPE_BEGIN_TRX | QUERY_TYPE_READ }, + { "START TRANSACTION READ WRITE", QUERY_TYPE_BEGIN_TRX | QUERY_TYPE_WRITE }, { "START TRANSACTION READ WRITE", QUERY_TYPE_BEGIN_TRX | QUERY_TYPE_WRITE }, { "START TRANSACTION READ WRITE", QUERY_TYPE_BEGIN_TRX | QUERY_TYPE_WRITE }, { "START TRANSACTION READ WRITE", QUERY_TYPE_BEGIN_TRX | QUERY_TYPE_WRITE }, + { "START TRANSACTION WITH CONSISTENT SNAPSHOT", QUERY_TYPE_BEGIN_TRX }, { "START TRANSACTION WITH CONSISTENT SNAPSHOT", QUERY_TYPE_BEGIN_TRX }, { "START TRANSACTION WITH CONSISTENT SNAPSHOT", QUERY_TYPE_BEGIN_TRX }, { "START TRANSACTION WITH CONSISTENT SNAPSHOT", QUERY_TYPE_BEGIN_TRX }, - { "START TRANSACTION WITH CONSISTENT SNAPSHOT", QUERY_TYPE_BEGIN_TRX }, { "START TRANSACTION WITH CONSISTENT SNAPSHOT", QUERY_TYPE_BEGIN_TRX }, { "SET AUTOCOMMIT=true", QUERY_TYPE_COMMIT|QUERY_TYPE_ENABLE_AUTOCOMMIT }, @@ -97,6 +104,7 @@ struct test_case { "SET AUTOCOMMIT =true", QUERY_TYPE_COMMIT|QUERY_TYPE_ENABLE_AUTOCOMMIT }, { "SET AUTOCOMMIT = true", QUERY_TYPE_COMMIT|QUERY_TYPE_ENABLE_AUTOCOMMIT }, { "SET AUTOCOMMIT = true", QUERY_TYPE_COMMIT|QUERY_TYPE_ENABLE_AUTOCOMMIT }, + { "SET AUTOCOMMIT=1", QUERY_TYPE_COMMIT|QUERY_TYPE_ENABLE_AUTOCOMMIT }, { "SET AUTOCOMMIT=1", QUERY_TYPE_COMMIT|QUERY_TYPE_ENABLE_AUTOCOMMIT }, { "SET AUTOCOMMIT =1", QUERY_TYPE_COMMIT|QUERY_TYPE_ENABLE_AUTOCOMMIT }, @@ -110,6 +118,7 @@ struct test_case { "SET AUTOCOMMIT =false", QUERY_TYPE_BEGIN_TRX|QUERY_TYPE_DISABLE_AUTOCOMMIT }, { "SET AUTOCOMMIT = false", QUERY_TYPE_BEGIN_TRX|QUERY_TYPE_DISABLE_AUTOCOMMIT }, { "SET AUTOCOMMIT = false", QUERY_TYPE_BEGIN_TRX|QUERY_TYPE_DISABLE_AUTOCOMMIT }, + { "SET AUTOCOMMIT=0", QUERY_TYPE_BEGIN_TRX|QUERY_TYPE_DISABLE_AUTOCOMMIT }, { "SET AUTOCOMMIT=0", QUERY_TYPE_BEGIN_TRX|QUERY_TYPE_DISABLE_AUTOCOMMIT }, { "SET AUTOCOMMIT =0", QUERY_TYPE_BEGIN_TRX|QUERY_TYPE_DISABLE_AUTOCOMMIT }, @@ -277,6 +286,14 @@ int main(int argc, char* argv[]) } cout << endl; + cout << "Parser" << endl; + cout << "======" << endl; + if (!test(get_parser_trx_type_mask)) + { + rc = EXIT_FAILURE; + } + cout << endl; + qc_process_end(QC_INIT_BOTH); } else