From 383d53edbcaee7762e5e90473cda361b9c9e29d3 Mon Sep 17 00:00:00 2001 From: Sutou Kouhei Date: Tue, 4 Jun 2024 17:38:14 +0900 Subject: [PATCH] MDEV-21166 Add Mroonga initialized check to Mroonga UDFs Mroonga UDFs can't be used without loading Mroonga. --- storage/mroonga/ha_mroonga.cpp | 6 ++++ storage/mroonga/mrn.hpp | 29 +++++++++++++++++++ storage/mroonga/sources.am | 1 + storage/mroonga/udf/mrn_udf_command.cpp | 10 +++++++ storage/mroonga/udf/mrn_udf_escape.cpp | 10 +++++++ .../mroonga/udf/mrn_udf_highlight_html.cpp | 9 ++++++ .../udf/mrn_udf_last_insert_grn_id.cpp | 8 +++++ storage/mroonga/udf/mrn_udf_normalize.cpp | 10 +++++++ storage/mroonga/udf/mrn_udf_query_expand.cpp | 10 +++++++ storage/mroonga/udf/mrn_udf_snippet.cpp | 8 +++++ storage/mroonga/udf/mrn_udf_snippet_html.cpp | 9 ++++++ 11 files changed, 110 insertions(+) create mode 100644 storage/mroonga/mrn.hpp diff --git a/storage/mroonga/ha_mroonga.cpp b/storage/mroonga/ha_mroonga.cpp index 2077b0b8863..75f2387beab 100644 --- a/storage/mroonga/ha_mroonga.cpp +++ b/storage/mroonga/ha_mroonga.cpp @@ -20,6 +20,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ +#include "mrn.hpp" #include "mrn_mysql.h" #include "mrn_mysql_compat.h" @@ -296,6 +297,7 @@ static PSI_mutex_info mrn_mutexes[] = #endif /* global variables */ +bool mrn_initialized = false; handlerton *mrn_hton_ptr; HASH mrn_open_tables; mysql_mutex_t mrn_open_tables_mutex; @@ -1957,6 +1959,8 @@ static int mrn_init(void *p) mrn::PathMapper::default_mysql_data_home_path = mysql_data_home; #endif + mrn_initialized = true; + return 0; error_allocated_long_term_share_hash_init: @@ -2051,6 +2055,8 @@ static int mrn_deinit(void *p) mysql_mutex_destroy(&mrn_query_log_mutex); mysql_mutex_destroy(&mrn_log_mutex); + mrn_initialized = false; + return 0; } diff --git a/storage/mroonga/mrn.hpp b/storage/mroonga/mrn.hpp new file mode 100644 index 00000000000..41d3a5df4be --- /dev/null +++ b/storage/mroonga/mrn.hpp @@ -0,0 +1,29 @@ +/* + Copyright (C) 2024 Sutou Kouhei + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +extern bool mrn_initialized; + +#ifdef __cplusplus +} +#endif diff --git a/storage/mroonga/sources.am b/storage/mroonga/sources.am index c7ddcfa5acc..20ab3e6eb7f 100644 --- a/storage/mroonga/sources.am +++ b/storage/mroonga/sources.am @@ -1,4 +1,5 @@ sources = \ + mrn.hpp \ mrn_macro.hpp \ mrn_constants.hpp \ ha_mroonga.cpp \ diff --git a/storage/mroonga/udf/mrn_udf_command.cpp b/storage/mroonga/udf/mrn_udf_command.cpp index 10123c6252d..46911c56e25 100644 --- a/storage/mroonga/udf/mrn_udf_command.cpp +++ b/storage/mroonga/udf/mrn_udf_command.cpp @@ -19,6 +19,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ +#include #include #include #include @@ -51,6 +52,15 @@ MRN_API my_bool mroonga_command_init(UDF_INIT *init, UDF_ARGS *args, CommandInfo *info = NULL; init->ptr = NULL; + + if (!mrn_initialized) + { + snprintf(message, + MYSQL_ERRMSG_SIZE, + "mroonga_command(): Mroonga isn't initialized"); + goto error; + } + if (args->arg_count == 0) { grn_snprintf(message, MYSQL_ERRMSG_SIZE, diff --git a/storage/mroonga/udf/mrn_udf_escape.cpp b/storage/mroonga/udf/mrn_udf_escape.cpp index 72182790fea..55a3639565e 100644 --- a/storage/mroonga/udf/mrn_udf_escape.cpp +++ b/storage/mroonga/udf/mrn_udf_escape.cpp @@ -17,6 +17,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ +#include #include #include #include @@ -44,6 +45,15 @@ MRN_API my_bool mroonga_escape_init(UDF_INIT *init, UDF_ARGS *args, bool script_mode = false; init->ptr = NULL; + + if (!mrn_initialized) + { + snprintf(message, + MYSQL_ERRMSG_SIZE, + "mroonga_escape(): Mroonga isn't initialized"); + goto error; + } + if (!(1 <= args->arg_count && args->arg_count <= 2)) { snprintf(message, MYSQL_ERRMSG_SIZE, diff --git a/storage/mroonga/udf/mrn_udf_highlight_html.cpp b/storage/mroonga/udf/mrn_udf_highlight_html.cpp index 12f54a7d16a..d986777caff 100644 --- a/storage/mroonga/udf/mrn_udf_highlight_html.cpp +++ b/storage/mroonga/udf/mrn_udf_highlight_html.cpp @@ -17,6 +17,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ +#include #include #include #include @@ -211,6 +212,14 @@ MRN_API my_bool mroonga_highlight_html_init(UDF_INIT *init, init->ptr = NULL; + if (!mrn_initialized) + { + snprintf(message, + MYSQL_ERRMSG_SIZE, + "mroonga_highlight_html(): Mroonga isn't initialized"); + goto error; + } + if (args->arg_count < 1) { snprintf(message, MYSQL_ERRMSG_SIZE, "mroonga_highlight_html(): wrong number of arguments: %u for 1+", diff --git a/storage/mroonga/udf/mrn_udf_last_insert_grn_id.cpp b/storage/mroonga/udf/mrn_udf_last_insert_grn_id.cpp index 46176bc8641..f40dcf0055f 100644 --- a/storage/mroonga/udf/mrn_udf_last_insert_grn_id.cpp +++ b/storage/mroonga/udf/mrn_udf_last_insert_grn_id.cpp @@ -19,6 +19,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ +#include #include #include #include @@ -29,6 +30,13 @@ MRN_BEGIN_DECLS MRN_API my_bool last_insert_grn_id_init(UDF_INIT *init, UDF_ARGS *args, char *message) { + if (!mrn_initialized) + { + snprintf(message, + MYSQL_ERRMSG_SIZE, + "last_insert_grn_id(): Mroonga isn't initialized"); + return 1; + } if (args->arg_count != 0) { strcpy(message, "last_insert_grn_id must not have arguments"); return 1; diff --git a/storage/mroonga/udf/mrn_udf_normalize.cpp b/storage/mroonga/udf/mrn_udf_normalize.cpp index 303623516f1..0ebee2ff608 100644 --- a/storage/mroonga/udf/mrn_udf_normalize.cpp +++ b/storage/mroonga/udf/mrn_udf_normalize.cpp @@ -18,6 +18,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ +#include #include #include #include @@ -53,6 +54,15 @@ MRN_API my_bool mroonga_normalize_init(UDF_INIT *init, UDF_ARGS *args, String *result_str = NULL; init->ptr = NULL; + + if (!mrn_initialized) + { + snprintf(message, + MYSQL_ERRMSG_SIZE, + "mroonga_normalize(): Mroonga isn't initialized"); + goto error; + } + if (!(1 <= args->arg_count && args->arg_count <= 2)) { sprintf(message, "mroonga_normalize(): Incorrect number of arguments: %u for 1..2", diff --git a/storage/mroonga/udf/mrn_udf_query_expand.cpp b/storage/mroonga/udf/mrn_udf_query_expand.cpp index 03bef3215c7..76a5dad53b4 100644 --- a/storage/mroonga/udf/mrn_udf_query_expand.cpp +++ b/storage/mroonga/udf/mrn_udf_query_expand.cpp @@ -17,6 +17,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ +#include #include #include #include @@ -74,6 +75,15 @@ MRN_API my_bool mroonga_query_expand_init(UDF_INIT *init, MRN_DBUG_ENTER_FUNCTION(); init->ptr = NULL; + + if (!mrn_initialized) + { + snprintf(message, + MYSQL_ERRMSG_SIZE, + "mroonga_query_expand(): Mroonga isn't initialized"); + goto error; + } + if (args->arg_count != 4) { sprintf(message, "mroonga_query_expand(): wrong number of arguments: %u for 4", diff --git a/storage/mroonga/udf/mrn_udf_snippet.cpp b/storage/mroonga/udf/mrn_udf_snippet.cpp index a4b37d03a4f..45e539f0093 100644 --- a/storage/mroonga/udf/mrn_udf_snippet.cpp +++ b/storage/mroonga/udf/mrn_udf_snippet.cpp @@ -19,6 +19,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ +#include #include #include #include @@ -135,6 +136,13 @@ MRN_API my_bool mroonga_snippet_init(UDF_INIT *init, UDF_ARGS *args, char *messa st_mrn_snip_info *snip_info = NULL; bool can_open_snippet = TRUE; init->ptr = NULL; + if (!mrn_initialized) + { + snprintf(message, + MYSQL_ERRMSG_SIZE, + "mroonga_snippet(): Mroonga isn't initialized"); + goto error; + } if (args->arg_count < 11 || (args->arg_count - 11) % 3) { sprintf(message, "Incorrect number of arguments for mroonga_snippet(): %u", diff --git a/storage/mroonga/udf/mrn_udf_snippet_html.cpp b/storage/mroonga/udf/mrn_udf_snippet_html.cpp index 311c91bf665..ba0cdadda99 100644 --- a/storage/mroonga/udf/mrn_udf_snippet_html.cpp +++ b/storage/mroonga/udf/mrn_udf_snippet_html.cpp @@ -17,6 +17,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ +#include #include #include #include @@ -194,6 +195,14 @@ MRN_API my_bool mroonga_snippet_html_init(UDF_INIT *init, init->ptr = NULL; + if (!mrn_initialized) + { + snprintf(message, + MYSQL_ERRMSG_SIZE, + "mroonga_snippet_html(): Mroonga isn't initialized"); + goto error; + } + if (args->arg_count < 1) { snprintf(message, MYSQL_ERRMSG_SIZE, "mroonga_snippet_html(): wrong number of arguments: %u for 1+",