From a14c359d08cb1dd3cfccb93d8165bd7b6edfb798 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Eeden?= Date: Fri, 8 Feb 2019 12:24:12 +0100 Subject: [PATCH 1/2] Also call processor for FUNC_ITEM in visit_item This allows a post-parse plugin to act on function items in addition to literals. --- sql/parser_service.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/sql/parser_service.cc b/sql/parser_service.cc index 9c323a85496..d036dc9a823 100644 --- a/sql/parser_service.cc +++ b/sql/parser_service.cc @@ -70,6 +70,7 @@ class Service_visitor: public Select_lex_visitor case Item::NULL_ITEM: case Item::VARBIN_ITEM: case Item::CACHE_ITEM: + case Item::FUNC_ITEM: return m_processor(item, m_arg); default: break; From b773a7779f49aa56be63821d677a4ac213de8354 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Eeden?= Date: Sun, 3 Mar 2019 15:38:27 +0100 Subject: [PATCH 2/2] Add function to get the type id of the item in the parser service --- include/mysql/service_parser.h | 15 +++++++++++++++ include/mysql/services.h.pp | 8 +++++--- sql/parser_service.cc | 5 +++++ sql/sql_plugin_services.h | 1 + 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/include/mysql/service_parser.h b/include/mysql/service_parser.h index 3cf7c8b84c8..8c763c23778 100644 --- a/include/mysql/service_parser.h +++ b/include/mysql/service_parser.h @@ -173,6 +173,17 @@ extern struct mysql_parser_service_st { MYSQL_LEX_STRING (*mysql_item_string)(MYSQL_ITEM item); + /** + Returns the MYSQL_ITEM type as integer + + @param item The item to get the type of. + + @return The type as integer + + */ + int (*mysql_item_type)(MYSQL_ITEM item); + + /** Frees a string buffer allocated by the server. @@ -244,6 +255,9 @@ extern struct mysql_parser_service_st { #define mysql_parser_item_string(item) \ mysql_parser_service->mysql_item_string(item) +#define mysql_parser_item_type(item) \ + mysql_parser_service->mysql_item_type(item) + #define mysql_parser_free_string(string) \ mysql_parser_service->mysql_free_string(string) @@ -273,6 +287,7 @@ int mysql_parser_extract_prepared_params(MYSQL_THD thd, int *positions); int mysql_parser_visit_tree(MYSQL_THD thd, parse_node_visit_function processor, unsigned char* arg); MYSQL_LEX_STRING mysql_parser_item_string(MYSQL_ITEM item); +int mysql_parser_item_type(MYSQL_ITEM item); void mysql_parser_free_string(MYSQL_LEX_STRING string); MYSQL_LEX_STRING mysql_parser_get_query(MYSQL_THD thd); MYSQL_LEX_STRING mysql_parser_get_normalized_query(MYSQL_THD thd); diff --git a/include/mysql/services.h.pp b/include/mysql/services.h.pp index c0c581a6ab9..f42a94015b3 100644 --- a/include/mysql/services.h.pp +++ b/include/mysql/services.h.pp @@ -393,6 +393,7 @@ int (*mysql_visit_tree)(void* thd, parse_node_visit_function processor, unsigned char* arg); MYSQL_LEX_STRING (*mysql_item_string)(MYSQL_ITEM item); + int (*mysql_item_type)(MYSQL_ITEM item); void (*mysql_free_string)(MYSQL_LEX_STRING string); MYSQL_LEX_STRING (*mysql_get_query)(void* thd); MYSQL_LEX_STRING (*mysql_get_normalized_query)(void* thd); @@ -416,6 +417,7 @@ int mysql_parser_visit_tree(void* thd, parse_node_visit_function processor, unsigned char* arg); MYSQL_LEX_STRING mysql_parser_item_string(MYSQL_ITEM item); +int mysql_parser_item_type(MYSQL_ITEM item); void mysql_parser_free_string(MYSQL_LEX_STRING string); MYSQL_LEX_STRING mysql_parser_get_query(void* thd); MYSQL_LEX_STRING mysql_parser_get_normalized_query(void* thd); @@ -494,13 +496,13 @@ int (*my_key_store_func)(const char *, const char *, const char *, const void *, size_t); int (*my_key_fetch_func)(const char *, char **, const char *, void **, - size_t *); + size_t *); int (*my_key_remove_func)(const char *, const char *); int (*my_key_generate_func)(const char *, const char *, const char *, - size_t); + size_t); } *mysql_keyring_service; int my_key_store(const char *, const char *, const char *, const void *, size_t); int my_key_fetch(const char *, char **, const char *, void **, - size_t *); + size_t *); int my_key_remove(const char *, const char *); int my_key_generate(const char *, const char *, const char *, size_t); diff --git a/sql/parser_service.cc b/sql/parser_service.cc index d036dc9a823..bdfb72ec5aa 100644 --- a/sql/parser_service.cc +++ b/sql/parser_service.cc @@ -363,6 +363,11 @@ MYSQL_LEX_STRING mysql_parser_item_string(MYSQL_ITEM item) return res; } +extern "C" +int mysql_parser_item_type(MYSQL_ITEM item) +{ + return item->type(); +} extern "C" void mysql_parser_free_string(MYSQL_LEX_STRING string) diff --git a/sql/sql_plugin_services.h b/sql/sql_plugin_services.h index 203279edea3..c0fa7e630ee 100644 --- a/sql/sql_plugin_services.h +++ b/sql/sql_plugin_services.h @@ -121,6 +121,7 @@ static struct mysql_parser_service_st parser_handler= mysql_parser_extract_prepared_params, mysql_parser_visit_tree, mysql_parser_item_string, + mysql_parser_item_type, mysql_parser_free_string, mysql_parser_get_query, mysql_parser_get_normalized_query