diff options
author | Alexander Barkov <bar@mariadb.com> | 2019-10-07 21:37:06 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2019-10-07 23:17:21 +0400 |
commit | 6afb2a37fd186318dee1467a7a9bc92179bcb601 (patch) | |
tree | 48df41c919e5333cca0ad69d259123fa10f5f451 | |
parent | e0117f11200f7fe124b53e212a30c09ad9506d6a (diff) | |
download | mariadb-git-6afb2a37fd186318dee1467a7a9bc92179bcb601.tar.gz |
MDEV-20768 Turn INET functions into a function collection plugin
-rw-r--r-- | libmysqld/CMakeLists.txt | 2 | ||||
-rwxr-xr-x | mysql-test/mysql-test-run.pl | 1 | ||||
-rw-r--r-- | plugin/type_inet/CMakeLists.txt | 18 | ||||
-rw-r--r-- | plugin/type_inet/item_inetfunc.cc (renamed from sql/item_inetfunc.cc) | 2 | ||||
-rw-r--r-- | plugin/type_inet/item_inetfunc.h (renamed from sql/item_inetfunc.h) | 1 | ||||
-rw-r--r-- | plugin/type_inet/mysql-test/type_inet/func_inet_plugin.result | 31 | ||||
-rw-r--r-- | plugin/type_inet/mysql-test/type_inet/func_inet_plugin.test | 27 | ||||
-rw-r--r-- | plugin/type_inet/plugin.cc | 190 | ||||
-rw-r--r-- | plugin/type_inet/sql_type_inet.cc (renamed from sql/sql_type_inet.cc) | 2 | ||||
-rw-r--r-- | plugin/type_inet/sql_type_inet.h (renamed from sql/sql_type_inet.h) | 0 | ||||
-rw-r--r-- | sql/CMakeLists.txt | 3 | ||||
-rw-r--r-- | sql/item_create.cc | 194 |
12 files changed, 278 insertions, 193 deletions
diff --git a/libmysqld/CMakeLists.txt b/libmysqld/CMakeLists.txt index 7e75669daa6..c179575f006 100644 --- a/libmysqld/CMakeLists.txt +++ b/libmysqld/CMakeLists.txt @@ -116,9 +116,7 @@ SET(SQL_EMBEDDED_SOURCES emb_qcache.cc libmysqld.c lib_sql.cc ../sql/sql_mode.cc ../sql/sql_type_json.cc ../sql/sql_type_geom.cc - ../sql/sql_type_inet.cc ../sql/table_cache.cc ../sql/mf_iocache_encr.cc - ../sql/item_inetfunc.cc ../sql/wsrep_dummy.cc ../sql/encryption.cc ../sql/item_windowfunc.cc ../sql/sql_window.cc ../sql/sql_cte.cc diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index c67cf55b55f..47fa0d4cc2d 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -203,6 +203,7 @@ my @DEFAULT_SUITES= qw( rpl- sys_vars- sql_sequence- + type_inet- unit- vcol- versioning- diff --git a/plugin/type_inet/CMakeLists.txt b/plugin/type_inet/CMakeLists.txt new file mode 100644 index 00000000000..d2a9d9f5fb0 --- /dev/null +++ b/plugin/type_inet/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2019, MariaDB corporation. All rights reserved. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA + +MYSQL_ADD_PLUGIN(type_inet + plugin.cc item_inetfunc.cc sql_type_inet.cc + MANDATORY RECOMPILE_FOR_EMBEDDED) diff --git a/sql/item_inetfunc.cc b/plugin/type_inet/item_inetfunc.cc index 93608dd0d2c..50bd82817e0 100644 --- a/sql/item_inetfunc.cc +++ b/plugin/type_inet/item_inetfunc.cc @@ -1,5 +1,6 @@ /* Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. Copyright (c) 2014 MariaDB Foundation + Copyright (c) 2019 MariaDB Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -14,6 +15,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */ +#define MYSQL_SERVER #include "mariadb.h" #include "item_inetfunc.h" #include "sql_type_inet.h" diff --git a/sql/item_inetfunc.h b/plugin/type_inet/item_inetfunc.h index 8cfb4cd278c..94255426f68 100644 --- a/sql/item_inetfunc.h +++ b/plugin/type_inet/item_inetfunc.h @@ -3,6 +3,7 @@ /* Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. Copyright (c) 2014 MariaDB Foundation + Copyright (c) 2019 MariaDB Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/plugin/type_inet/mysql-test/type_inet/func_inet_plugin.result b/plugin/type_inet/mysql-test/type_inet/func_inet_plugin.result new file mode 100644 index 00000000000..4663ae485e2 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/func_inet_plugin.result @@ -0,0 +1,31 @@ +# +# Start of 10.5 tests +# +# +# MDEV-20768 Turn INET functions into a function collection plugin +# +SELECT +PLUGIN_NAME, +PLUGIN_VERSION, +PLUGIN_STATUS, +PLUGIN_TYPE, +PLUGIN_AUTHOR, +PLUGIN_DESCRIPTION, +PLUGIN_LICENSE, +PLUGIN_MATURITY, +PLUGIN_AUTH_VERSION +FROM INFORMATION_SCHEMA.PLUGINS +WHERE PLUGIN_TYPE='FUNCTION COLLECTION' + AND PLUGIN_NAME='func_inet'; +PLUGIN_NAME func_inet +PLUGIN_VERSION 1.0 +PLUGIN_STATUS ACTIVE +PLUGIN_TYPE FUNCTION COLLECTION +PLUGIN_AUTHOR MariaDB Corporation +PLUGIN_DESCRIPTION Function collection test +PLUGIN_LICENSE GPL +PLUGIN_MATURITY Experimental +PLUGIN_AUTH_VERSION 1.0 +# +# End of 10.5 tests +# diff --git a/plugin/type_inet/mysql-test/type_inet/func_inet_plugin.test b/plugin/type_inet/mysql-test/type_inet/func_inet_plugin.test new file mode 100644 index 00000000000..8047e7f1513 --- /dev/null +++ b/plugin/type_inet/mysql-test/type_inet/func_inet_plugin.test @@ -0,0 +1,27 @@ +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-20768 Turn INET functions into a function collection plugin +--echo # + +--vertical_results +SELECT + PLUGIN_NAME, + PLUGIN_VERSION, + PLUGIN_STATUS, + PLUGIN_TYPE, + PLUGIN_AUTHOR, + PLUGIN_DESCRIPTION, + PLUGIN_LICENSE, + PLUGIN_MATURITY, + PLUGIN_AUTH_VERSION +FROM INFORMATION_SCHEMA.PLUGINS + WHERE PLUGIN_TYPE='FUNCTION COLLECTION' + AND PLUGIN_NAME='func_inet'; +--horizontal_results + +--echo # +--echo # End of 10.5 tests +--echo # diff --git a/plugin/type_inet/plugin.cc b/plugin/type_inet/plugin.cc new file mode 100644 index 00000000000..f76a786573b --- /dev/null +++ b/plugin/type_inet/plugin.cc @@ -0,0 +1,190 @@ +/* Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. + Copyright (c) 2014 MariaDB Foundation + Copyright (c) 2019 MariaDB Corporation + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */ + +#define MYSQL_SERVER +#include "mariadb.h" +#include "sql_class.h" +#include "sql_type_inet.h" +#include "item_inetfunc.h" +#include <mysql/plugin_data_type.h> +#include <mysql/plugin_function_collection.h> + + +/*************************************************************************/ + +class Create_func_inet_ntoa : public Create_func_arg1 +{ +public: + Item *create_1_arg(THD *thd, Item *arg1) override + { + return new (thd->mem_root) Item_func_inet_ntoa(thd, arg1); + } + static Create_func_inet_ntoa s_singleton; +protected: + Create_func_inet_ntoa() {} + virtual ~Create_func_inet_ntoa() {} +}; + + +class Create_func_inet_aton : public Create_func_arg1 +{ +public: + Item *create_1_arg(THD *thd, Item *arg1) override + { + return new (thd->mem_root) Item_func_inet_aton(thd, arg1); + } + static Create_func_inet_aton s_singleton; +protected: + Create_func_inet_aton() {} + virtual ~Create_func_inet_aton() {} +}; + + +class Create_func_inet6_aton : public Create_func_arg1 +{ +public: + Item *create_1_arg(THD *thd, Item *arg1) override + { + return new (thd->mem_root) Item_func_inet6_aton(thd, arg1); + } + static Create_func_inet6_aton s_singleton; +protected: + Create_func_inet6_aton() {} + virtual ~Create_func_inet6_aton() {} +}; + + +class Create_func_inet6_ntoa : public Create_func_arg1 +{ +public: + Item *create_1_arg(THD *thd, Item *arg1) override + { + return new (thd->mem_root) Item_func_inet6_ntoa(thd, arg1); + } + static Create_func_inet6_ntoa s_singleton; +protected: + Create_func_inet6_ntoa() {} + virtual ~Create_func_inet6_ntoa() {} +}; + + +class Create_func_is_ipv4 : public Create_func_arg1 +{ +public: + Item *create_1_arg(THD *thd, Item *arg1) override + { + return new (thd->mem_root) Item_func_is_ipv4(thd, arg1); + } + static Create_func_is_ipv4 s_singleton; +protected: + Create_func_is_ipv4() {} + virtual ~Create_func_is_ipv4() {} +}; + + +class Create_func_is_ipv6 : public Create_func_arg1 +{ +public: + Item *create_1_arg(THD *thd, Item *arg1) override + { + return new (thd->mem_root) Item_func_is_ipv6(thd, arg1); + } + static Create_func_is_ipv6 s_singleton; +protected: + Create_func_is_ipv6() {} + virtual ~Create_func_is_ipv6() {} +}; + + +class Create_func_is_ipv4_compat : public Create_func_arg1 +{ +public: + Item *create_1_arg(THD *thd, Item *arg1) override + { + return new (thd->mem_root) Item_func_is_ipv4_compat(thd, arg1); + } + static Create_func_is_ipv4_compat s_singleton; +protected: + Create_func_is_ipv4_compat() {} + virtual ~Create_func_is_ipv4_compat() {} +}; + + +class Create_func_is_ipv4_mapped : public Create_func_arg1 +{ +public: + Item *create_1_arg(THD *thd, Item *arg1) override + { + return new (thd->mem_root) Item_func_is_ipv4_mapped(thd, arg1); + } + static Create_func_is_ipv4_mapped s_singleton; +protected: + Create_func_is_ipv4_mapped() {} + virtual ~Create_func_is_ipv4_mapped() {} +}; + + +Create_func_inet_ntoa Create_func_inet_ntoa::s_singleton; +Create_func_inet6_aton Create_func_inet6_aton::s_singleton; +Create_func_inet6_ntoa Create_func_inet6_ntoa::s_singleton; +Create_func_inet_aton Create_func_inet_aton::s_singleton; +Create_func_is_ipv4 Create_func_is_ipv4::s_singleton; +Create_func_is_ipv6 Create_func_is_ipv6::s_singleton; +Create_func_is_ipv4_compat Create_func_is_ipv4_compat::s_singleton; +Create_func_is_ipv4_mapped Create_func_is_ipv4_mapped::s_singleton; + + +#define BUILDER(F) & F::s_singleton + + +static Native_func_registry func_array[] = +{ + {{STRING_WITH_LEN("INET_ATON")}, BUILDER(Create_func_inet_aton)}, + {{STRING_WITH_LEN("INET_NTOA")}, BUILDER(Create_func_inet_ntoa)}, + {{STRING_WITH_LEN("INET6_ATON")}, BUILDER(Create_func_inet6_aton)}, + {{STRING_WITH_LEN("INET6_NTOA")}, BUILDER(Create_func_inet6_ntoa)}, + {{STRING_WITH_LEN("IS_IPV4")}, BUILDER(Create_func_is_ipv4)}, + {{STRING_WITH_LEN("IS_IPV6")}, BUILDER(Create_func_is_ipv6)}, + {{STRING_WITH_LEN("IS_IPV4_COMPAT")}, BUILDER(Create_func_is_ipv4_compat)}, + {{STRING_WITH_LEN("IS_IPV4_MAPPED")}, BUILDER(Create_func_is_ipv4_mapped)} +}; + + +static Plugin_function_collection + plugin_descriptor_function_collection_inet( + MariaDB_FUNCTION_COLLECTION_INTERFACE_VERSION, + Native_func_registry_array(func_array, array_elements(func_array))); + +/*************************************************************************/ + +maria_declare_plugin(type_inet) +{ + MariaDB_FUNCTION_COLLECTION_PLUGIN, // the plugin type (see include/mysql/plugin.h) + &plugin_descriptor_function_collection_inet, // pointer to type-specific plugin descriptor + "func_inet", // plugin name + "MariaDB Corporation", // plugin author + "Function collection test", // the plugin description + PLUGIN_LICENSE_GPL, // the plugin license (see include/mysql/plugin.h) + 0, // Pointer to plugin initialization function + 0, // Pointer to plugin deinitialization function + 0x0100, // Numeric version 0xAABB means AA.BB veriosn + NULL, // Status variables + NULL, // System variables + "1.0", // String version representation + MariaDB_PLUGIN_MATURITY_EXPERIMENTAL // Maturity(see include/mysql/plugin.h)*/ +} +maria_declare_plugin_end; diff --git a/sql/sql_type_inet.cc b/plugin/type_inet/sql_type_inet.cc index f4432571199..66db71b7683 100644 --- a/sql/sql_type_inet.cc +++ b/plugin/type_inet/sql_type_inet.cc @@ -1,5 +1,6 @@ /* Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. Copyright (c) 2014 MariaDB Foundation + Copyright (c) 2019 MariaDB Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -14,6 +15,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */ +#define MYSQL_SERVER #include "mariadb.h" #include "my_net.h" #include "sql_class.h" // THD, SORT_FIELD_ATTR diff --git a/sql/sql_type_inet.h b/plugin/type_inet/sql_type_inet.h index db3349c2581..db3349c2581 100644 --- a/sql/sql_type_inet.h +++ b/plugin/type_inet/sql_type_inet.h diff --git a/sql/CMakeLists.txt b/sql/CMakeLists.txt index 801805c9a2a..7e780e066f9 100644 --- a/sql/CMakeLists.txt +++ b/sql/CMakeLists.txt @@ -119,7 +119,7 @@ SET (SQL_SOURCE sql_profile.cc event_parse_data.cc sql_alter.cc sql_signal.cc mdl.cc sql_admin.cc transaction.cc sys_vars.cc sql_truncate.cc datadict.cc - sql_reload.cc item_inetfunc.cc + sql_reload.cc # added in MariaDB: sql_explain.cc @@ -137,7 +137,6 @@ SET (SQL_SOURCE semisync_master_ack_receiver.cc sql_type.cc sql_mode.cc sql_type_json.cc sql_type_geom.cc - sql_type_inet.cc item_windowfunc.cc sql_window.cc sql_cte.cc item_vers.cc diff --git a/sql/item_create.cc b/sql/item_create.cc index f0a7b5e7f2a..e8eb76dfc12 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -33,7 +33,6 @@ #include "set_var.h" #include "sp_head.h" #include "sp.h" -#include "item_inetfunc.h" #include "sql_time.h" #include "sql_type_geom.h" #include <mysql/plugin_function_collection.h> @@ -92,7 +91,8 @@ class Plugin_find_native_func_builder_param bool find_native_function_builder(THD *thd, const Plugin_function_collection *pfc) { - return ((builder= pfc->find_native_function_builder(thd, name))) == NULL; + // plugin_foreach() will stop iterating when this function returns TRUE + return ((builder= pfc->find_native_function_builder(thd, name))) != NULL; } static my_bool find_in_plugin(THD *thd, plugin_ref plugin, void *data) { @@ -111,9 +111,9 @@ public: { } Create_func *find(THD *thd) { - if (plugin_foreach(thd, - Plugin_find_native_func_builder_param::find_in_plugin, - MariaDB_FUNCTION_COLLECTION_PLUGIN, this)) + if (!plugin_foreach(thd, + Plugin_find_native_func_builder_param::find_in_plugin, + MariaDB_FUNCTION_COLLECTION_PLUGIN, this)) return NULL; return builder; } @@ -907,110 +907,6 @@ protected: }; -class Create_func_inet_ntoa : public Create_func_arg1 -{ -public: - virtual Item *create_1_arg(THD *thd, Item *arg1); - - static Create_func_inet_ntoa s_singleton; - -protected: - Create_func_inet_ntoa() {} - virtual ~Create_func_inet_ntoa() {} -}; - - -class Create_func_inet_aton : public Create_func_arg1 -{ -public: - virtual Item *create_1_arg(THD *thd, Item *arg1); - - static Create_func_inet_aton s_singleton; - -protected: - Create_func_inet_aton() {} - virtual ~Create_func_inet_aton() {} -}; - - -class Create_func_inet6_aton : public Create_func_arg1 -{ -public: - virtual Item *create_1_arg(THD *thd, Item *arg1); - - static Create_func_inet6_aton s_singleton; - -protected: - Create_func_inet6_aton() {} - virtual ~Create_func_inet6_aton() {} -}; - - -class Create_func_inet6_ntoa : public Create_func_arg1 -{ -public: - virtual Item *create_1_arg(THD *thd, Item *arg1); - - static Create_func_inet6_ntoa s_singleton; - -protected: - Create_func_inet6_ntoa() {} - virtual ~Create_func_inet6_ntoa() {} -}; - - -class Create_func_is_ipv4 : public Create_func_arg1 -{ -public: - virtual Item *create_1_arg(THD *thd, Item *arg1); - - static Create_func_is_ipv4 s_singleton; - -protected: - Create_func_is_ipv4() {} - virtual ~Create_func_is_ipv4() {} -}; - - -class Create_func_is_ipv6 : public Create_func_arg1 -{ -public: - virtual Item *create_1_arg(THD *thd, Item *arg1); - - static Create_func_is_ipv6 s_singleton; - -protected: - Create_func_is_ipv6() {} - virtual ~Create_func_is_ipv6() {} -}; - - -class Create_func_is_ipv4_compat : public Create_func_arg1 -{ -public: - virtual Item *create_1_arg(THD *thd, Item *arg1); - - static Create_func_is_ipv4_compat s_singleton; - -protected: - Create_func_is_ipv4_compat() {} - virtual ~Create_func_is_ipv4_compat() {} -}; - - -class Create_func_is_ipv4_mapped : public Create_func_arg1 -{ -public: - virtual Item *create_1_arg(THD *thd, Item *arg1); - - static Create_func_is_ipv4_mapped s_singleton; - -protected: - Create_func_is_ipv4_mapped() {} - virtual ~Create_func_is_ipv4_mapped() {} -}; - - class Create_func_instr : public Create_func_arg2 { public: @@ -3685,78 +3581,6 @@ Create_func_ifnull::create_2_arg(THD *thd, Item *arg1, Item *arg2) } -Create_func_inet_ntoa Create_func_inet_ntoa::s_singleton; - -Item* -Create_func_inet_ntoa::create_1_arg(THD *thd, Item *arg1) -{ - return new (thd->mem_root) Item_func_inet_ntoa(thd, arg1); -} - - -Create_func_inet6_aton Create_func_inet6_aton::s_singleton; - -Item* -Create_func_inet6_aton::create_1_arg(THD *thd, Item *arg1) -{ - return new (thd->mem_root) Item_func_inet6_aton(thd, arg1); -} - - -Create_func_inet6_ntoa Create_func_inet6_ntoa::s_singleton; - -Item* -Create_func_inet6_ntoa::create_1_arg(THD *thd, Item *arg1) -{ - return new (thd->mem_root) Item_func_inet6_ntoa(thd, arg1); -} - - -Create_func_inet_aton Create_func_inet_aton::s_singleton; - -Item* -Create_func_inet_aton::create_1_arg(THD *thd, Item *arg1) -{ - return new (thd->mem_root) Item_func_inet_aton(thd, arg1); -} - - -Create_func_is_ipv4 Create_func_is_ipv4::s_singleton; - -Item* -Create_func_is_ipv4::create_1_arg(THD *thd, Item *arg1) -{ - return new (thd->mem_root) Item_func_is_ipv4(thd, arg1); -} - - -Create_func_is_ipv6 Create_func_is_ipv6::s_singleton; - -Item* -Create_func_is_ipv6::create_1_arg(THD *thd, Item *arg1) -{ - return new (thd->mem_root) Item_func_is_ipv6(thd, arg1); -} - - -Create_func_is_ipv4_compat Create_func_is_ipv4_compat::s_singleton; - -Item* -Create_func_is_ipv4_compat::create_1_arg(THD *thd, Item *arg1) -{ - return new (thd->mem_root) Item_func_is_ipv4_compat(thd, arg1); -} - - -Create_func_is_ipv4_mapped Create_func_is_ipv4_mapped::s_singleton; - -Item* -Create_func_is_ipv4_mapped::create_1_arg(THD *thd, Item *arg1) -{ - return new (thd->mem_root) Item_func_is_ipv4_mapped(thd, arg1); -} - - Create_func_instr Create_func_instr::s_singleton; Item* @@ -5681,14 +5505,6 @@ static Native_func_registry func_array[] = { { STRING_WITH_LEN("GREATEST") }, BUILDER(Create_func_greatest)}, { { STRING_WITH_LEN("HEX") }, BUILDER(Create_func_hex)}, { { STRING_WITH_LEN("IFNULL") }, BUILDER(Create_func_ifnull)}, - { { STRING_WITH_LEN("INET_ATON") }, BUILDER(Create_func_inet_aton)}, - { { STRING_WITH_LEN("INET_NTOA") }, BUILDER(Create_func_inet_ntoa)}, - { { STRING_WITH_LEN("INET6_ATON") }, BUILDER(Create_func_inet6_aton)}, - { { STRING_WITH_LEN("INET6_NTOA") }, BUILDER(Create_func_inet6_ntoa)}, - { { STRING_WITH_LEN("IS_IPV4") }, BUILDER(Create_func_is_ipv4)}, - { { STRING_WITH_LEN("IS_IPV6") }, BUILDER(Create_func_is_ipv6)}, - { { STRING_WITH_LEN("IS_IPV4_COMPAT") }, BUILDER(Create_func_is_ipv4_compat)}, - { { STRING_WITH_LEN("IS_IPV4_MAPPED") }, BUILDER(Create_func_is_ipv4_mapped)}, { { STRING_WITH_LEN("INSTR") }, BUILDER(Create_func_instr)}, { { STRING_WITH_LEN("ISNULL") }, BUILDER(Create_func_isnull)}, { { STRING_WITH_LEN("IS_FREE_LOCK") }, BUILDER(Create_func_is_free_lock)}, |