From a5637a311c8d92a412a2c2d21168952b3a0f9971 Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Thu, 18 May 2017 11:49:27 +0300 Subject: [PATCH] MXS-1196: Recognize builtin Oracle functions --- query_classifier/qc_sqlite/builtin_functions.c | 18 +++++++++++++++++- query_classifier/qc_sqlite/builtin_functions.h | 2 +- query_classifier/qc_sqlite/qc_sqlite.c | 2 +- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/query_classifier/qc_sqlite/builtin_functions.c b/query_classifier/qc_sqlite/builtin_functions.c index 37fde1477..f529b26d7 100644 --- a/query_classifier/qc_sqlite/builtin_functions.c +++ b/query_classifier/qc_sqlite/builtin_functions.c @@ -368,6 +368,16 @@ static const char* BUILTIN_FUNCTIONS[] = const size_t N_BUILTIN_FUNCTIONS = sizeof(BUILTIN_FUNCTIONS) / sizeof(BUILTIN_FUNCTIONS[0]); + +static const char* ORACLE_FUNCTIONS[] = +{ + "nvl", + "nvl2" +}; + +const size_t N_ORACLE_FUNCTIONS = sizeof(ORACLE_FUNCTIONS) / sizeof(ORACLE_FUNCTIONS[0]); + + // NOTE: sort_compare and search_compare are not identical, so don't // NOTE: optimize either of them away. static int sort_compare(const void* key, const void* value) @@ -389,6 +399,7 @@ void init_builtin_functions() ss_dassert(!unit.inited); qsort(BUILTIN_FUNCTIONS, N_BUILTIN_FUNCTIONS, sizeof(char*), sort_compare); + qsort(ORACLE_FUNCTIONS, N_ORACLE_FUNCTIONS, sizeof(char*), sort_compare); unit.inited = true; } @@ -399,11 +410,16 @@ void finish_builtin_functions() unit.inited = false; } -bool is_builtin_readonly_function(const char* key) +bool is_builtin_readonly_function(const char* key, bool check_oracle) { ss_dassert(unit.inited); char* value = bsearch(key, BUILTIN_FUNCTIONS, N_BUILTIN_FUNCTIONS, sizeof(char*), search_compare); + if (!value && check_oracle) + { + value = bsearch(key, ORACLE_FUNCTIONS, N_ORACLE_FUNCTIONS, sizeof(char*), search_compare); + } + return value ? true : false; } diff --git a/query_classifier/qc_sqlite/builtin_functions.h b/query_classifier/qc_sqlite/builtin_functions.h index 9c0da9e47..92c4159ff 100644 --- a/query_classifier/qc_sqlite/builtin_functions.h +++ b/query_classifier/qc_sqlite/builtin_functions.h @@ -14,7 +14,7 @@ extern "C" { void init_builtin_functions(); void finish_builtin_functions(); -bool is_builtin_readonly_function(const char* zToken); +bool is_builtin_readonly_function(const char* zToken, bool check_oracle); #ifdef __cplusplus } diff --git a/query_classifier/qc_sqlite/qc_sqlite.c b/query_classifier/qc_sqlite/qc_sqlite.c index fb3da873d..ea48b0a39 100644 --- a/query_classifier/qc_sqlite/qc_sqlite.c +++ b/query_classifier/qc_sqlite/qc_sqlite.c @@ -1187,7 +1187,7 @@ static void update_field_infos(QC_SQLITE_INFO* info, { info->type_mask |= (QUERY_TYPE_READ | QUERY_TYPE_MASTER_READ); } - else if (!is_builtin_readonly_function(zToken)) + else if (!is_builtin_readonly_function(zToken, this_unit.sql_mode == QC_SQL_MODE_ORACLE)) { info->type_mask |= QUERY_TYPE_WRITE; }