revision-id: 4cf8bd79c59f23bc2c11804723143423da037738 (mariadb-10.3.5-75-g4cf8bd7) parent(s): ae6355f56ea1496a2de2ea271f95c89e47705ef0 committer: Alexey Botchkov timestamp: 2018-04-23 16:43:25 +0400 message: MDEV-14024 PCRE2. server code switched to the PCRE2 features. --- CMakeLists.txt | 2 +- client/CMakeLists.txt | 2 +- client/mysqltest.cc | 2 +- cmake/pcre.cmake | 22 +-- config.h.cmake | 1 + extra/mariabackup/CMakeLists.txt | 4 +- extra/mariabackup/xb_regex.h | 2 +- libmysqld/CMakeLists.txt | 2 +- libmysqld/examples/CMakeLists.txt | 2 +- .../sys_vars/r/sysvars_server_notembedded.result | 2 +- sql/CMakeLists.txt | 2 +- sql/item_cmpfunc.cc | 168 +++++---------------- sql/item_cmpfunc.h | 29 ++-- sql/item_strfunc.cc | 14 -- sql/item_strfunc.h | 2 - sql/mysqld.cc | 17 --- sql/mysqld.h | 2 - sql/sys_vars.cc | 16 +- storage/mroonga/CMakeLists.txt | 4 +- 19 files changed, 81 insertions(+), 214 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0813cf2..b59fb23 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -324,7 +324,7 @@ IF(NOT HAVE_CXX_NEW) ENDIF() # Find header files from the bundled libraries -# (yassl, readline, pcre, etc) +# (yassl, readline, pcre2, etc) # before the ones installed in the system SET(CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE ON) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index e0d34b9..02579ca 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -45,7 +45,7 @@ ENDIF(UNIX) MYSQL_ADD_EXECUTABLE(mysqltest mysqltest.cc COMPONENT Test) SET_SOURCE_FILES_PROPERTIES(mysqltest.cc PROPERTIES COMPILE_FLAGS "-DTHREADS") -TARGET_LINK_LIBRARIES(mysqltest ${CLIENT_LIB} pcre pcreposix) +TARGET_LINK_LIBRARIES(mysqltest ${CLIENT_LIB} pcre2-8 pcre2-posix) SET_TARGET_PROPERTIES(mysqltest PROPERTIES ENABLE_EXPORTS TRUE) diff --git a/client/mysqltest.cc b/client/mysqltest.cc index efc25f3..bcabcbb 100644 --- a/client/mysqltest.cc +++ b/client/mysqltest.cc @@ -45,7 +45,7 @@ #include <stdarg.h> #include <violite.h> #define PCRE_STATIC 1 /* Important on Windows */ -#include "pcreposix.h" /* pcreposix regex library */ +#include "pcre2posix.h" /* pcreposix regex library */ #ifdef HAVE_SYS_WAIT_H #include <sys/wait.h> #endif diff --git a/cmake/pcre.cmake b/cmake/pcre.cmake index 4c11392..25ecbae 100644 --- a/cmake/pcre.cmake +++ b/cmake/pcre.cmake @@ -5,24 +5,16 @@ SET(WITH_PCRE "auto" CACHE STRING MACRO (CHECK_PCRE) IF(WITH_PCRE STREQUAL "system" OR WITH_PCRE STREQUAL "auto") - CHECK_LIBRARY_EXISTS(pcre pcre_stack_guard "" HAVE_PCRE_STACK_GUARD) - IF(NOT CMAKE_CROSSCOMPILING) - SET(CMAKE_REQUIRED_LIBRARIES "pcre") - CHECK_C_SOURCE_RUNS(" - #include <pcre.h> - int main() { - return -pcre_exec(NULL, NULL, NULL, -999, -999, 0, NULL, 0) < 256; - }" PCRE_STACK_SIZE_OK) - SET(CMAKE_REQUIRED_LIBRARIES) - ENDIF() + CHECK_LIBRARY_EXISTS(pcre2-8 pcre2_match "" HAVE_PCRE2) ENDIF() - IF(NOT HAVE_PCRE_STACK_GUARD OR NOT PCRE_STACK_SIZE_OK OR - WITH_PCRE STREQUAL "bundled") + IF(NOT HAVE_PCRE2 OR WITH_PCRE STREQUAL "bundled") IF (WITH_PCRE STREQUAL "system") - MESSAGE(FATAL_ERROR "system pcre is not found or unusable") + MESSAGE(FATAL_ERROR "system pcre2-8 library is not found or unusable") ENDIF() - SET(PCRE_INCLUDES ${CMAKE_BINARY_DIR}/pcre ${CMAKE_SOURCE_DIR}/pcre) - ADD_SUBDIRECTORY(pcre) + SET(PCRE_INCLUDES ${CMAKE_BINARY_DIR}/pcre2 ${CMAKE_SOURCE_DIR}/pcre2 + ${CMAKE_BINARY_DIR}/pcre2/src ${CMAKE_SOURCE_DIR}/pcre2/src) + SET(PCRE_BUILD_TESTS OFF CACHE BOOL "Build the test") + ADD_SUBDIRECTORY(pcre2) ENDIF() ENDMACRO() diff --git a/config.h.cmake b/config.h.cmake index 4d14b62..b039e39 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -552,6 +552,7 @@ #define PACKAGE_VERSION "@VERSION@" #define VERSION "@VERSION@" #define PROTOCOL_VERSION 10 +#define PCRE2_CODE_UNIT_WIDTH 8 #define MALLOC_LIBRARY "@MALLOC_LIBRARY@" diff --git a/extra/mariabackup/CMakeLists.txt b/extra/mariabackup/CMakeLists.txt index f92da3f..a787251 100644 --- a/extra/mariabackup/CMakeLists.txt +++ b/extra/mariabackup/CMakeLists.txt @@ -37,7 +37,7 @@ INCLUDE_DIRECTORIES( ) IF(NOT HAVE_SYSTEM_REGEX) - INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/pcre) + INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/pcre2 ${CMAKE_SOURCE_DIR}/pcre2/src) ENDIF() IF(WITH_WSREP) @@ -92,7 +92,7 @@ ADD_SUBDIRECTORY(crc) TARGET_LINK_LIBRARIES(mariabackup sql crc) IF(NOT HAVE_SYSTEM_REGEX) - TARGET_LINK_LIBRARIES(mariabackup pcreposix) + TARGET_LINK_LIBRARIES(mariabackup pcre2-posix) ENDIF() diff --git a/extra/mariabackup/xb_regex.h b/extra/mariabackup/xb_regex.h index 2e07e43..6277d04 100644 --- a/extra/mariabackup/xb_regex.h +++ b/extra/mariabackup/xb_regex.h @@ -25,7 +25,7 @@ my_regex is used on Windows and native calls are used on POSIX platforms. */ #ifdef HAVE_SYSTEM_REGEX #include <regex.h> #else -#include <pcreposix.h> +#include <pcre2posix.h> #endif typedef regex_t* xb_regex_t; diff --git a/libmysqld/CMakeLists.txt b/libmysqld/CMakeLists.txt index 718e832..29ddc2a 100644 --- a/libmysqld/CMakeLists.txt +++ b/libmysqld/CMakeLists.txt @@ -145,7 +145,7 @@ ENDIF() SET(LIBS - dbug strings mysys mysys_ssl pcre vio + dbug strings mysys mysys_ssl pcre2-8 vio ${ZLIB_LIBRARY} ${SSL_LIBRARIES} ${LIBWRAP} ${LIBCRYPT} ${LIBDL} ${MYSQLD_STATIC_PLUGIN_LIBS} diff --git a/libmysqld/examples/CMakeLists.txt b/libmysqld/examples/CMakeLists.txt index d47638a..c2f7766 100644 --- a/libmysqld/examples/CMakeLists.txt +++ b/libmysqld/examples/CMakeLists.txt @@ -34,7 +34,7 @@ ENDIF(UNIX) MYSQL_ADD_EXECUTABLE(mysqltest_embedded ../../client/mysqltest.cc COMPONENT Test) -TARGET_LINK_LIBRARIES(mysqltest_embedded mysqlserver pcre pcreposix) +TARGET_LINK_LIBRARIES(mysqltest_embedded mysqlserver pcre2-8 pcre2-posix) IF(CMAKE_GENERATOR MATCHES "Xcode") # It does not seem possible to tell Xcode the resulting target might need diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result index 67786cc..4d1d677 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result @@ -695,7 +695,7 @@ VARIABLE_COMMENT Default flags for the regex library NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL -ENUM_VALUE_LIST DOTALL,DUPNAMES,EXTENDED,EXTRA,MULTILINE,UNGREEDY +ENUM_VALUE_LIST DOTALL,DUPNAMES,EXTENDED,EXTENDED_MORE,EXTRA,MULTILINE,UNGREEDY READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME DEFAULT_STORAGE_ENGINE diff --git a/sql/CMakeLists.txt b/sql/CMakeLists.txt index c7c4df2..6c461a7 100644 --- a/sql/CMakeLists.txt +++ b/sql/CMakeLists.txt @@ -177,7 +177,7 @@ ADD_LIBRARY(sql STATIC ${SQL_SOURCE}) ADD_DEPENDENCIES(sql GenServerSource) DTRACE_INSTRUMENT(sql) TARGET_LINK_LIBRARIES(sql ${MYSQLD_STATIC_PLUGIN_LIBS} - mysys mysys_ssl dbug strings vio pcre + mysys mysys_ssl dbug strings vio pcre2-8 ${LIBWRAP} ${LIBCRYPT} ${LIBDL} ${CMAKE_THREAD_LIBS_INIT} ${WSREP_LIB} ${SSL_LIBRARIES} diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 89aa307..2b3afed 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -5481,15 +5481,6 @@ int Regexp_processor_pcre::default_regex_flags() return default_regex_flags_pcre(current_thd); } -void Regexp_processor_pcre::set_recursion_limit(THD *thd) -{ - long stack_used; - DBUG_ASSERT(thd == current_thd); - stack_used= available_stack_size(thd->thread_stack, &stack_used); - m_pcre_extra.match_limit_recursion= - (ulong)((my_thread_stack_size - STACK_MIN_SIZE - stack_used)/my_pcre_frame_size); -} - /** Convert string to lib_charset, if needed. @@ -5523,8 +5514,8 @@ String *Regexp_processor_pcre::convert_if_needed(String *str, String *converter) bool Regexp_processor_pcre::compile(String *pattern, bool send_error) { - const char *pcreErrorStr; - int pcreErrorOffset; + int pcreErrorNumber; + PCRE2_SIZE pcreErrorOffset; if (is_compiled()) { @@ -5537,19 +5528,32 @@ bool Regexp_processor_pcre::compile(String *pattern, bool send_error) if (!(pattern= convert_if_needed(pattern, &pattern_converter))) return true; - m_pcre= pcre_compile(pattern->c_ptr_safe(), m_library_flags, - &pcreErrorStr, &pcreErrorOffset, NULL); + m_pcre= pcre2_compile((PCRE2_SPTR8) pattern->ptr(), pattern->length(), + m_library_flags, + &pcreErrorNumber, &pcreErrorOffset, NULL); if (m_pcre == NULL) { if (send_error) { char buff[MAX_FIELD_WIDTH]; - my_snprintf(buff, sizeof(buff), "%s at offset %d", pcreErrorStr, pcreErrorOffset); + int lmsg= pcre2_get_error_message(pcreErrorNumber, + (PCRE2_UCHAR8 *)buff, sizeof(buff)); + if (lmsg >= 0) + my_snprintf(buff+lmsg, sizeof(buff)-lmsg, + " at offset %d", pcreErrorOffset); my_error(ER_REGEXP_ERROR, MYF(0), buff); } return true; } + + m_pcre_match_data= pcre2_match_data_create_from_pattern(m_pcre, NULL); + if (m_pcre_match_data == NULL) + { + my_error(ER_OUT_OF_RESOURCES, MYF(0)); + return true; + } + return false; } @@ -5570,124 +5574,43 @@ bool Regexp_processor_pcre::compile(Item *item, bool send_error) */ void Regexp_processor_pcre::pcre_exec_warn(int rc) const { - char buf[64]; - const char *errmsg= NULL; + PCRE2_UCHAR8 buf[128]; THD *thd= current_thd; - - /* - Make a descriptive message only for those pcre_exec() error codes - that can actually happen in MariaDB. - */ - switch (rc) - { - case PCRE_ERROR_NULL: - errmsg= "pcre_exec: null argument passed"; - break; - case PCRE_ERROR_BADOPTION: - errmsg= "pcre_exec: bad option"; - break; - case PCRE_ERROR_BADMAGIC: - errmsg= "pcre_exec: bad magic - not a compiled regex"; - break; - case PCRE_ERROR_UNKNOWN_OPCODE: - errmsg= "pcre_exec: error in compiled regex"; - break; - case PCRE_ERROR_NOMEMORY: - errmsg= "pcre_exec: Out of memory"; - break; - case PCRE_ERROR_NOSUBSTRING: - errmsg= "pcre_exec: no substring"; - break; - case PCRE_ERROR_MATCHLIMIT: - errmsg= "pcre_exec: match limit exceeded"; - break; - case PCRE_ERROR_CALLOUT: - errmsg= "pcre_exec: callout error"; - break; - case PCRE_ERROR_BADUTF8: - errmsg= "pcre_exec: Invalid utf8 byte sequence in the subject string"; - break; - case PCRE_ERROR_BADUTF8_OFFSET: - errmsg= "pcre_exec: Started at invalid location within utf8 byte sequence"; - break; - case PCRE_ERROR_PARTIAL: - errmsg= "pcre_exec: partial match"; - break; - case PCRE_ERROR_INTERNAL: - errmsg= "pcre_exec: internal error"; - break; - case PCRE_ERROR_BADCOUNT: - errmsg= "pcre_exec: ovesize is negative"; - break; - case PCRE_ERROR_RECURSIONLIMIT: - my_snprintf(buf, sizeof(buf), "pcre_exec: recursion limit of %ld exceeded", - m_pcre_extra.match_limit_recursion); - errmsg= buf; - break; - case PCRE_ERROR_BADNEWLINE: - errmsg= "pcre_exec: bad newline options"; - break; - case PCRE_ERROR_BADOFFSET: - errmsg= "pcre_exec: start offset negative or greater than string length"; - break; - case PCRE_ERROR_SHORTUTF8: - errmsg= "pcre_exec: ended in middle of utf8 sequence"; - break; - case PCRE_ERROR_JIT_STACKLIMIT: - errmsg= "pcre_exec: insufficient stack memory for JIT compile"; - break; - case PCRE_ERROR_RECURSELOOP: - errmsg= "pcre_exec: Recursion loop detected"; - break; - case PCRE_ERROR_BADMODE: - errmsg= "pcre_exec: compiled pattern passed to wrong bit library function"; - break; - case PCRE_ERROR_BADENDIANNESS: - errmsg= "pcre_exec: compiled pattern passed to wrong endianness processor"; - break; - case PCRE_ERROR_JIT_BADOPTION: - errmsg= "pcre_exec: bad jit option"; - break; - case PCRE_ERROR_BADLENGTH: - errmsg= "pcre_exec: negative length"; - break; - default: - /* - As other error codes should normally not happen, - we just report the error code without textual description - of the code. - */ - my_snprintf(buf, sizeof(buf), "pcre_exec: Internal error (%d)", rc); - errmsg= buf; - } + int errlen= pcre2_get_error_message(rc, buf, sizeof(buf)); push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, - ER_REGEXP_ERROR, ER_THD(thd, ER_REGEXP_ERROR), errmsg); + ER_REGEXP_ERROR, ER_THD(thd, ER_REGEXP_ERROR), + (errlen > 0) ? (const char *) buf : "Unknown PCRE error."); } /** Call pcre_exec() and send a warning if pcre_exec() returned with an error. */ -int Regexp_processor_pcre::pcre_exec_with_warn(const pcre *code, - const pcre_extra *extra, +int Regexp_processor_pcre::pcre_exec_with_warn(const pcre2_code *code, + pcre2_match_data *data, const char *subject, int length, int startoffset, - int options, int *ovector, - int ovecsize) + uint options) { - int rc= pcre_exec(code, extra, subject, length, - startoffset, options, ovector, ovecsize); + int rc= pcre2_match(code, (PCRE2_SPTR8) subject, (PCRE2_SIZE) length, + (PCRE2_SIZE) startoffset, options, data, NULL); DBUG_EXECUTE_IF("pcre_exec_error_123", rc= -123;); - if (rc < PCRE_ERROR_NOMATCH) + if (rc < PCRE2_ERROR_NOMATCH) + { pcre_exec_warn(rc); + m_SubStrVec= NULL; + } + else + m_SubStrVec= pcre2_get_ovector_pointer(data); + return rc; } bool Regexp_processor_pcre::exec(const char *str, size_t length, size_t offset) { - m_pcre_exec_rc= pcre_exec_with_warn(m_pcre, &m_pcre_extra, str, (int)length, (int)offset, 0, - m_SubStrVec, array_elements(m_SubStrVec)); + m_pcre_exec_rc= pcre_exec_with_warn(m_pcre, m_pcre_match_data, + str, (int)length, (int)offset, 0); return false; } @@ -5697,10 +5620,8 @@ bool Regexp_processor_pcre::exec(String *str, int offset, { if (!(str= convert_if_needed(str, &subject_converter))) return true; - m_pcre_exec_rc= pcre_exec_with_warn(m_pcre, &m_pcre_extra, - str->c_ptr_safe(), str->length(), - offset, 0, - m_SubStrVec, array_elements(m_SubStrVec)); + m_pcre_exec_rc= pcre_exec_with_warn(m_pcre, m_pcre_match_data, + str->ptr(), str->length(), offset, 0); if (m_pcre_exec_rc > 0) { uint i; @@ -5750,12 +5671,6 @@ void Regexp_processor_pcre::fix_owner(Item_func *owner, } -bool Item_func_regex::fix_fields(THD *thd, Item **ref) -{ - re.set_recursion_limit(thd); - return Item_bool_func::fix_fields(thd, ref); -} - void Item_func_regex::fix_length_and_dec() { @@ -5782,13 +5697,6 @@ longlong Item_func_regex::val_int() } -bool Item_func_regexp_instr::fix_fields(THD *thd, Item **ref) -{ - re.set_recursion_limit(thd); - return Item_int_func::fix_fields(thd, ref); -} - - void Item_func_regexp_instr::fix_length_and_dec() { diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index 3d11a22..797c54a 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -25,7 +25,7 @@ #include "item_func.h" /* Item_int_func, Item_bool_func */ #define PCRE_STATIC 1 /* Important on Windows */ -#include "pcre.h" /* pcre header file */ +#include "pcre2.h" /* pcre header file */ #include "item.h" extern Item_result item_cmp_type(Item_result a,Item_result b); @@ -2728,8 +2728,8 @@ class Item_func_like :public Item_bool_func2 class Regexp_processor_pcre { - pcre *m_pcre; - pcre_extra m_pcre_extra; + pcre2_code *m_pcre; + pcre2_match_data *m_pcre_match_data; bool m_conversion_is_needed; bool m_is_const; int m_library_flags; @@ -2737,34 +2737,33 @@ class Regexp_processor_pcre CHARSET_INFO *m_library_charset; String m_prev_pattern; int m_pcre_exec_rc; - int m_SubStrVec[30]; + PCRE2_SIZE *m_SubStrVec; void pcre_exec_warn(int rc) const; - int pcre_exec_with_warn(const pcre *code, const pcre_extra *extra, + int pcre_exec_with_warn(const pcre2_code *code, + pcre2_match_data *data, const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize); + uint options); public: String *convert_if_needed(String *src, String *converter); String subject_converter; String pattern_converter; String replace_converter; Regexp_processor_pcre() : - m_pcre(NULL), m_conversion_is_needed(true), m_is_const(0), + m_pcre(NULL), m_pcre_match_data(NULL), + m_conversion_is_needed(true), m_is_const(0), m_library_flags(0), m_data_charset(&my_charset_utf8_general_ci), m_library_charset(&my_charset_utf8_general_ci) { - m_pcre_extra.flags= PCRE_EXTRA_MATCH_LIMIT_RECURSION; - m_pcre_extra.match_limit_recursion= 100L; } int default_regex_flags(); - void set_recursion_limit(THD *); void init(CHARSET_INFO *data_charset, int extra_flags) { m_library_flags= default_regex_flags() | extra_flags | (data_charset != &my_charset_bin ? - (PCRE_UTF8 | PCRE_UCP) : 0) | + (PCRE2_UTF | PCRE2_UCP) : 0) | ((data_charset->state & - (MY_CS_BINSORT | MY_CS_CSSORT)) ? 0 : PCRE_CASELESS); + (MY_CS_BINSORT | MY_CS_CSSORT)) ? 0 : PCRE2_CASELESS); // Convert text data to utf-8. m_library_charset= data_charset == &my_charset_bin ? @@ -2800,11 +2799,13 @@ class Regexp_processor_pcre void reset() { m_pcre= NULL; + m_pcre_match_data= NULL; m_prev_pattern.length(0); } void cleanup() { - pcre_free(m_pcre); + pcre2_match_data_free(m_pcre_match_data); + pcre2_code_free(m_pcre); reset(); } bool is_compiled() const { return m_pcre != NULL; } @@ -2829,7 +2830,6 @@ class Item_func_regex :public Item_bool_func DBUG_VOID_RETURN; } longlong val_int(); - bool fix_fields(THD *thd, Item **ref); void fix_length_and_dec(); const char *func_name() const { return "regexp"; } enum precedence precedence() const { return CMP_PRECEDENCE; } @@ -2879,7 +2879,6 @@ class Item_func_regexp_instr :public Item_long_func DBUG_VOID_RETURN; } longlong val_int(); - bool fix_fields(THD *thd, Item **ref); void fix_length_and_dec(); const char *func_name() const { return "regexp_instr"; } Item *get_copy(THD *thd) diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index c6b0ae7..0a1480e 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1276,13 +1276,6 @@ void Item_func_replace::fix_length_and_dec() /*********************************************************************/ -bool Item_func_regexp_replace::fix_fields(THD *thd, Item **ref) -{ - re.set_recursion_limit(thd); - return Item_str_func::fix_fields(thd, ref); -} - - void Item_func_regexp_replace::fix_length_and_dec() { if (agg_arg_charsets_for_string_result_with_comparison(collation, args, 3)) @@ -1418,13 +1411,6 @@ String *Item_func_regexp_replace::val_str(String *str) } -bool Item_func_regexp_substr::fix_fields(THD *thd, Item **ref) -{ - re.set_recursion_limit(thd); - return Item_str_func::fix_fields(thd, ref); -} - - void Item_func_regexp_substr::fix_length_and_dec() { if (agg_arg_charsets_for_string_result_with_comparison(collation, args, 2)) diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 4e1514c..3606151 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -376,7 +376,6 @@ class Item_func_regexp_replace :public Item_str_func DBUG_VOID_RETURN; } String *val_str(String *str); - bool fix_fields(THD *thd, Item **ref); void fix_length_and_dec(); const char *func_name() const { return "regexp_replace"; } Item *get_copy(THD *thd) { return 0;} @@ -398,7 +397,6 @@ class Item_func_regexp_substr :public Item_str_func DBUG_VOID_RETURN; } String *val_str(String *str); - bool fix_fields(THD *thd, Item **ref); void fix_length_and_dec(); const char *func_name() const { return "regexp_substr"; } Item *get_copy(THD *thd) { return 0; } diff --git a/sql/mysqld.cc b/sql/mysqld.cc index fe2b9c8..b735123 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -111,7 +111,6 @@ #include "sp_rcontext.h" #include "sp_cache.h" #include "sql_reload.h" // reload_acl_and_cache -#include "pcre.h" #ifdef HAVE_POLL_H #include <poll.h> @@ -3758,21 +3757,6 @@ static void init_libstrings() #endif } -ulonglong my_pcre_frame_size; - -static void init_pcre() -{ - pcre_malloc= pcre_stack_malloc= my_str_malloc_mysqld; - pcre_free= pcre_stack_free= my_free; - pcre_stack_guard= check_enough_stack_size_slow; - /* See http://pcre.org/original/doc/html/pcrestack.html */ - my_pcre_frame_size= -pcre_exec(NULL, NULL, NULL, -999, -999, 0, NULL, 0); - // pcre can underestimate its stack usage. Use a safe value, as in the manual - set_if_bigger(my_pcre_frame_size, 500); - my_pcre_frame_size += 16; // Again, safety margin, see the manual -} - - /** Initialize one of the global date/time format variables. @@ -4560,7 +4544,6 @@ static int init_common_variables() if (item_create_init()) return 1; item_init(); - init_pcre(); /* Process a comma-separated character set list and choose the first available character set. This is mostly for diff --git a/sql/mysqld.h b/sql/mysqld.h index 670e136..183757b 100644 --- a/sql/mysqld.h +++ b/sql/mysqld.h @@ -574,8 +574,6 @@ extern pthread_t signal_thread; extern struct st_VioSSLFd * ssl_acceptor_fd; #endif /* HAVE_OPENSSL */ -extern ulonglong my_pcre_frame_size; - /* The following variables were under INNODB_COMPABILITY_HOOKS */ diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 524ce97..f2c9205 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -5672,19 +5672,21 @@ static const char *default_regex_flags_names[]= "DOTALL", // (?s) . matches anything including NL "DUPNAMES", // (?J) Allow duplicate names for subpatterns "EXTENDED", // (?x) Ignore white space and # comments - "EXTRA", // (?X) extra features (e.g. error on unknown escape character) + "EXTENDED_MORE",//(?xx) Ignore white space and # comments inside cheracter + "EXTRA", // means nothing since PCRE2 "MULTILINE", // (?m) ^ and $ match newlines within data "UNGREEDY", // (?U) Invert greediness of quantifiers 0 }; static const int default_regex_flags_to_pcre[]= { - PCRE_DOTALL, - PCRE_DUPNAMES, - PCRE_EXTENDED, - PCRE_EXTRA, - PCRE_MULTILINE, - PCRE_UNGREEDY, + PCRE2_DOTALL, + PCRE2_DUPNAMES, + PCRE2_EXTENDED, + PCRE2_EXTENDED_MORE, + 0, /* EXTRA flag not available since PCRE2 */ + PCRE2_MULTILINE, + PCRE2_UNGREEDY, 0 }; int default_regex_flags_pcre(const THD *thd) diff --git a/storage/mroonga/CMakeLists.txt b/storage/mroonga/CMakeLists.txt index 5d8e8c1..57d12a1 100644 --- a/storage/mroonga/CMakeLists.txt +++ b/storage/mroonga/CMakeLists.txt @@ -189,8 +189,8 @@ else() set(MYSQL_VARIANT "MySQL") endif() -if(EXISTS "${MYSQL_SOURCE_DIR}/pcre") - set(MYSQL_REGEX_INCLUDE_DIR "${MYSQL_SOURCE_DIR}/pcre") +if(EXISTS "${MYSQL_SOURCE_DIR}/pcre2") + set(MYSQL_REGEX_INCLUDE_DIR "${MYSQL_SOURCE_DIR}/pcre2/src") else() set(MYSQL_REGEX_INCLUDE_DIR "${MYSQL_SOURCE_DIR}/regex") endif()