diff --git a/storage/mroonga/CMakeLists.txt b/storage/mroonga/CMakeLists.txt index e5d0abe5dcd..3b88d942165 100644 --- a/storage/mroonga/CMakeLists.txt +++ b/storage/mroonga/CMakeLists.txt @@ -39,11 +39,6 @@ if(BIG_ENDIAN) endif() endif() -if(CMAKE_SYSTEM_NAME STREQUAL "SunOS") - message(STATUS "Mroonga is not supported on Solaris") - return() -endif() - if(MSVC) if(MSVC_VERSION LESS 1800) set(MRN_OLD_MSVC_MESSAGE "Mroonga supports only MSVC 2013 or later") @@ -115,6 +110,8 @@ if(MRN_GROONGA_BUNDLED) add_subdirectory("${MRN_BUNDLED_GROONGA_RELATIVE_DIR}") else() + set(MRN_GROONGA_EMBED OFF) + file(READ ${MRN_SOURCE_DIR}/required_groonga_version REQUIRED_GROONGA_VERSION) string(STRIP "${REQUIRED_GROONGA_VERSION}" REQUIRED_GROONGA_VERSION) @@ -323,8 +320,7 @@ set(MRN_ALL_SOURCES if(MRN_BUNDLED) mysql_add_plugin(mroonga ${MRN_ALL_SOURCES} - STORAGE_ENGINE MODULE_ONLY DISABLED # see MDEV-7246 - RECOMPILE_FOR_EMBEDDED + STORAGE_ENGINE MODULE_ONLY LINK_LIBRARIES ${MRN_LIBRARIES}) else() add_library(mroonga MODULE ${MRN_ALL_SOURCES}) @@ -334,28 +330,33 @@ else() option(WITH_DEBUG "Enable debug options" OFF) if(WITH_DEBUG) - add_definitions("-DSAFE_MUTEX") + set_property(TARGET mroonga APPEND PROPERTY + COMPILE_DEFINITIONS "SAFE_MUTEX") if(CMAKE_COMPILER_IS_GNUCXX) set(MRN_C_COMPILE_FLAGS "${MRN_C_COMPILE_FLAGS} -g3 -O0") set(MRN_CXX_COMPILE_FLAGS "${MRN_CXX_COMPILE_FLAGS} -g3 -O0") endif() else() - add_definitions("-DDBUG_OFF") + set_property(TARGET mroonga APPEND PROPERTY + COMPILE_DEFINITIONS "DBUG_OFF") endif() option(WITH_DEBUG_FULL "Enable full debug options" OFF) if(WITH_DEBUG_FULL) - add_definitions("-DSAFE_MUTEX" "SAFEMALLOC") + set_property(TARGET mroonga APPEND PROPERTY + COMPILE_DEFINITIONS "SAFE_MUTEX" "SAFEMALLOC") endif() option(DISABLE_FAST_MUTEXES "Force disabling fast mutex" OFF) if(DISABLE_FAST_MUTEXES) - add_definitions("-DFORCE_FAST_MUTEX_DISABLED=1") + set_property(TARGET mroonga APPEND PROPERTY + COMPILE_DEFINITIONS "FORCE_FAST_MUTEX_DISABLED=1") endif() option(WITH_FAST_MUTEXES "Enable fast mutex" OFF) if(WITH_FAST_MUTEXES) - add_definitions("-DMY_PTHREAD_FASTMUTEX") + set_property(TARGET mroonga APPEND PROPERTY + COMPILE_DEFINITIONS "MY_PTHREAD_FASTMUTEX") endif() if(CMAKE_COMPILER_IS_GNUCXX) @@ -381,7 +382,8 @@ else() COMPILE_FLAGS "${MRN_CXX_COMPILE_FLAGS}") set_source_files_properties(${LIBMRN_NO_MYSQL_SOURCES} PROPERTIES COMPILE_FLAGS "${MRN_CXX_COMPILE_FLAGS}") - add_definitions("-DMYSQL_DYNAMIC_PLUGIN") + set_property(TARGET mroonga APPEND PROPERTY + COMPILE_DEFINITIONS "MYSQL_DYNAMIC_PLUGIN") set_target_properties(mroonga PROPERTIES PREFIX "" OUTPUT_NAME "ha_mroonga") @@ -390,16 +392,33 @@ else() endif() if(GROONGA_NORMALIZER_MYSQL_FOUND) - add_definitions("-DWITH_GROONGA_NORMALIZER_MYSQL=1") + set_property(TARGET mroonga APPEND PROPERTY + COMPILE_DEFINITIONS "WITH_GROONGA_NORMALIZER_MYSQL=1") if(MRN_GROONGA_NORMALIZER_MYSQL_EMBED) - add_definitions("-DMRN_GROONGA_NORMALIZER_MYSQL_EMBED") + set_property(TARGET mroonga APPEND PROPERTY + COMPILE_DEFINITIONS "MRN_GROONGA_NORMALIZER_MYSQL_EMBEDDED") else() - add_definitions("-DGROONGA_NORMALIZER_MYSQL_PLUGIN_NAME=\"normalizers/mysql\"") + set_property(TARGET mroonga APPEND PROPERTY + COMPILE_DEFINITIONS "GROONGA_NORMALIZER_MYSQL_PLUGIN_NAME=\"normalizers/mysql\"") endif() endif() -set(MRN_DEFAULT_PARSER "TokenBigram" CACHE STRING "The default fulltext parser") -add_definitions("-DMRN_PARSER_DEFAULT=\"${MRN_DEFAULT_PARSER}\"") +if(MRN_GROONGA_EMBED) + set_property(TARGET mroonga APPEND PROPERTY + COMPILE_DEFINITIONS "MRN_GROONGA_EMBEDDED") +endif() + +set(MRN_DEFAULT_PARSER "" CACHE STRING + "The default fulltext parser (Deprecated. Use MRN_DEFAULT_TOKENIZER instead.)") +set(MRN_DEFAULT_TOKENIZER "" CACHE STRING + "The default tokenizer for fulltext index") +if(NOT ${MRN_DEFAULT_TOKENIZER} STREQUAL "") + set_property(TARGET mroonga APPEND PROPERTY + COMPILE_DEFINITIONS "MRN_DEFAULT_TOKENIZER=\"${MRN_DEFAULT_TOKENIZER}\"") +elseif(NOT ${MRN_DEFAULT_PARSER} STREQUAL "") + set_property(TARGET mroonga APPEND PROPERTY + COMPILE_DEFINITIONS "MRN_DEFAULT_TOKENIZER=\"${MRN_DEFAULT_PARSER}\"") +endif() configure_file( "${PROJECT_SOURCE_DIR}/mrn_version.h.in" diff --git a/storage/mroonga/appveyor.yml b/storage/mroonga/appveyor.yml index de368b85660..038d590054e 100644 --- a/storage/mroonga/appveyor.yml +++ b/storage/mroonga/appveyor.yml @@ -3,16 +3,16 @@ clone_depth: 10 install: - cd .. - choco install -y curl 7zip.commandline - - curl -O http://mirror.jmu.edu/pub/mariadb/mariadb-10.0.17/source/mariadb-10.0.17.tar.gz - - 7z x mariadb-10.0.17.tar.gz - - 7z x mariadb-10.0.17.tar > nul - - cd mariadb-10.0.17 + - curl -O http://mirror.jmu.edu/pub/mariadb/mariadb-10.0.20/source/mariadb-10.0.20.tar.gz + - 7z x mariadb-10.0.20.tar.gz + - 7z x mariadb-10.0.20.tar > nul + - cd mariadb-10.0.20 - rmdir /S /Q storage\mroonga\ - move ..\mroonga storage\mroonga - git clone --quiet --depth 1 https://github.com/groonga/groonga.git ..\groonga - cd ..\groonga - git submodule update --init - - cd ..\mariadb-10.0.17 + - cd ..\mariadb-10.0.20 - rmdir /S /Q ..\groonga\test\ - mkdir storage\mroonga\vendor - move ..\groonga storage\mroonga\vendor\groonga diff --git a/storage/mroonga/build/makefiles/gettext.am b/storage/mroonga/build/makefiles/gettext.am index 9706b485dd1..9cea8ce63c1 100644 --- a/storage/mroonga/build/makefiles/gettext.am +++ b/storage/mroonga/build/makefiles/gettext.am @@ -1,6 +1,8 @@ include $(top_srcdir)/doc/files.am include $(top_srcdir)/build/makefiles/sphinx-build.am +CLEANFILES = + EXTRA_DIST += \ $(po_files) @@ -11,9 +13,11 @@ endif if DOCUMENT_BUILDABLE BUILT_SOURCES += \ + mo-build-stamp +CLEANFILES += \ pot-build-stamp \ edit-po-build-stamp \ - $(mo_files) + mo-build-stamp endif SUFFIXES += .pot .po .mo .edit @@ -47,8 +51,8 @@ SUFFIXES += .pot .po .mo .edit msgfmt -o $@ $< if DOCUMENT_BUILDABLE -update: pot-build-stamp edit-po-build-stamp -build: update $(mo_files) +update: edit-po-build-stamp +build: mo-build-stamp else update: build: @@ -68,6 +72,15 @@ pot-build-stamp: $(absolute_source_files) $(MAKE) gettext @touch $@ -edit-po-build-stamp: $(absolute_source_files) +edit-po-build-stamp: pot-build-stamp $(MAKE) $(edit_po_files) @touch $@ + +mo_build_stamp_dependencies = edit-po-build-stamp +if DOCUMENT_BUILDABLE +mo_build_stamp_dependencies += $(edit_po_files) +endif + +mo-build-stamp: $(mo_build_stamp_dependencies) + $(MAKE) $(mo_files) + @touch $@ diff --git a/storage/mroonga/build/makefiles/sphinx.am b/storage/mroonga/build/makefiles/sphinx.am index f84fb23b739..c68f62e26ec 100644 --- a/storage/mroonga/build/makefiles/sphinx.am +++ b/storage/mroonga/build/makefiles/sphinx.am @@ -106,7 +106,7 @@ help: @echo " doctest to run all doctests embedded in the documentation (if enabled)" man: man-build-stamp -html: html-build-stamp +html: html-recursive html-build-stamp dirhtml: dirhtml-build-stamp pickle: pickle-build-stamp json: json-build-stamp diff --git a/storage/mroonga/configure.ac b/storage/mroonga/configure.ac index dc127c17838..f60b481e0ea 100644 --- a/storage/mroonga/configure.ac +++ b/storage/mroonga/configure.ac @@ -309,20 +309,30 @@ CONFIG_OPTION_GROONGA_NORMALIZER_MYSQL AC_ARG_WITH(default_parser, [AS_HELP_STRING([--with-default-parser=PARSER], - [specify the default fulltext parser like + [Deprecated. Use --with-default-tokenizer=TOKENIZER instead. + specify the default fulltext parser like --with-default-parser=TokenMecab. (default: TokenBigram)])], [default_parser=$withval], [default_parser=no]) if test x"$default_parser" != x"no"; then - AC_DEFINE_UNQUOTED(MRN_PARSER_DEFAULT, + AC_DEFINE_UNQUOTED(MRN_TOKENIZER_DEFAULT, "$default_parser", - "specified default fulltext parser") - MRN_DEFAULT_PARSER=$default_parser -else - MRN_DEFAULT_PARSER=TokenBigram + "specified the default tokenizer for fulltext index") +fi + +AC_ARG_WITH(default_tokenizer, + [AS_HELP_STRING([--with-default-tokenizer=TOKENIZER], + [specify the default tokenizer for fulltext index like + --with-default-tokenizer=TokenMecab. + (default: TokenBigram)])], + [default_tokenizer=$withval], + [default_tokenizer=no]) +if test x"$default_tokenizer" != x"no"; then + AC_DEFINE_UNQUOTED(MRN_DEFAULT_TOKENIZER, + "$default_tokenizer", + "specified the default tokenizer for fulltext index") fi -AC_SUBST(MRN_DEFAULT_PARSER) AC_ARG_ENABLE(fast_mutexes, [AS_HELP_STRING([--disable-fast-mutexes], diff --git a/storage/mroonga/ha_mroonga.cpp b/storage/mroonga/ha_mroonga.cpp index 83f03fcb272..a94278e19c2 100644 --- a/storage/mroonga/ha_mroonga.cpp +++ b/storage/mroonga/ha_mroonga.cpp @@ -27,14 +27,11 @@ #pragma implementation #endif -#if MYSQL_VERSION_ID >= 50500 -# include -# include -# include -# include -# include -#endif - +#include +#include +#include +#include +#include #include #include @@ -102,6 +99,10 @@ # include #endif +#ifdef MRN_SUPPORT_CUSTOM_OPTIONS +# include +#endif + // for debug #define MRN_CLASS_NAME "ha_mroonga" @@ -110,7 +111,11 @@ #define MRN_LONG_TEXT_SIZE (1 << 31) // 2Gbytes #ifdef MRN_HAVE_TDC_LOCK_TABLE_SHARE -# define mrn_open_mutex(share) &((share)->tdc.LOCK_table_share) +# ifdef MRN_TABLE_SHARE_TDC_IS_POINTER +# define mrn_open_mutex(share) &((share)->tdc->LOCK_table_share) +# else +# define mrn_open_mutex(share) &((share)->tdc.LOCK_table_share) +# endif # define mrn_open_mutex_lock(share) do { \ TABLE_SHARE *share_ = share; \ if (share_ && share_->tmp_table == NO_TMP_TABLE) { \ @@ -156,24 +161,10 @@ static mysql_mutex_t *mrn_LOCK_open; # define mrn_declare_plugin(NAME) maria_declare_plugin(NAME) # define mrn_declare_plugin_end maria_declare_plugin_end # define MRN_PLUGIN_LAST_VALUES MRN_VERSION, MariaDB_PLUGIN_MATURITY_STABLE -# if MYSQL_VERSION_ID >= 100000 -# define MRN_ABORT_ON_WARNING(thd) thd_kill_level(thd) -# else -# define MRN_ABORT_ON_WARNING(thd) thd->abort_on_warning -# endif #else # define mrn_declare_plugin(NAME) mysql_declare_plugin(NAME) # define mrn_declare_plugin_end mysql_declare_plugin_end -# ifdef MRN_PLUGIN_HAVE_FLAGS -# define MRN_PLUGIN_LAST_VALUES NULL, 0 -# else -# define MRN_PLUGIN_LAST_VALUES NULL -# endif -# if MYSQL_VERSION_ID >= 50706 -# define MRN_ABORT_ON_WARNING(thd) false -# else -# define MRN_ABORT_ON_WARNING(thd) thd->abort_on_warning -# endif +# define MRN_PLUGIN_LAST_VALUES NULL, 0 #endif #if MYSQL_VERSION_ID >= 100007 && defined(MRN_MARIADB_P) @@ -267,9 +258,7 @@ uint grn_atoui(const char *nptr, const char *end, const char **rest); # ifdef MRN_TABLE_SHARE_HAVE_LOCK_SHARE PSI_mutex_key *mrn_table_share_lock_share; # endif -# ifdef MRN_TABLE_SHARE_HAVE_LOCK_HA_DATA PSI_mutex_key *mrn_table_share_lock_ha_data; -# endif # endif static PSI_mutex_key mrn_open_tables_mutex_key; static PSI_mutex_key mrn_long_term_share_mutex_key; @@ -357,11 +346,6 @@ static const char *mrn_inspect_thr_lock_type(enum thr_lock_type lock_type) case TL_WRITE_ALLOW_WRITE: inspected = "TL_WRITE_ALLOW_WRITE"; break; -#ifdef MRN_HAVE_TL_WRITE_ALLOW_READ - case TL_WRITE_ALLOW_READ: - inspected = "TL_WRITE_ALLOW_READ"; - break; -#endif #ifdef MRN_HAVE_TL_WRITE_CONCURRENT_DEFAULT case TL_WRITE_CONCURRENT_DEFAULT: inspected = "TL_WRITE_CONCURRENT_DEFAULT"; @@ -524,19 +508,15 @@ static const char *mrn_inspect_extra_function(enum ha_extra_function operation) case HA_EXTRA_PREPARE_FOR_RENAME: inspected = "HA_EXTRA_PREPARE_FOR_RENAME"; break; -#ifdef MRN_HAVE_HA_EXTRA_ADD_CHILDREN_LIST case HA_EXTRA_ADD_CHILDREN_LIST: inspected = "HA_EXTRA_ADD_CHILDREN_LIST"; break; -#endif case HA_EXTRA_ATTACH_CHILDREN: inspected = "HA_EXTRA_ATTACH_CHILDREN"; break; -#ifdef MRN_HAVE_HA_EXTRA_IS_ATTACHED_CHILDREN case HA_EXTRA_IS_ATTACHED_CHILDREN: inspected = "HA_EXTRA_IS_ATTACHED_CHILDREN"; break; -#endif case HA_EXTRA_DETACH_CHILDREN: inspected = "HA_EXTRA_DETACH_CHILDREN"; break; @@ -597,7 +577,7 @@ static bool mrn_log_file_opened = false; static grn_log_level mrn_log_level_default = GRN_LOG_DEFAULT_LEVEL; static ulong mrn_log_level = mrn_log_level_default; -char *mrn_default_parser = NULL; +char *mrn_default_tokenizer = NULL; char *mrn_default_wrapper_engine = NULL; static int mrn_lock_timeout = grn_get_lock_timeout(); static char *mrn_libgroonga_version = const_cast(grn_get_version()); @@ -630,6 +610,11 @@ static TYPELIB mrn_boolean_mode_syntax_flags_typelib = { NULL }; #endif +#ifdef MRN_GROONGA_EMBEDDED +static my_bool mrn_libgroonga_embedded = TRUE; +#else +static my_bool mrn_libgroonga_embedded = FALSE; +#endif typedef enum { MRN_ACTION_ON_ERROR_ERROR, @@ -836,8 +821,8 @@ static MYSQL_SYSVAR_STR(log_file, mrn_log_file_path, mrn_log_file_update, MRN_LOG_FILE_PATH); -static void mrn_default_parser_update(THD *thd, struct st_mysql_sys_var *var, - void *var_ptr, const void *save) +static void mrn_default_tokenizer_update(THD *thd, struct st_mysql_sys_var *var, + void *var_ptr, const void *save) { MRN_DBUG_ENTER_FUNCTION(); const char *new_value = *((const char **)save); @@ -848,12 +833,12 @@ static void mrn_default_parser_update(THD *thd, struct st_mysql_sys_var *var, mrn_change_encoding(&ctx, system_charset_info); if (strcmp(*old_value_ptr, new_value) == 0) { GRN_LOG(&ctx, GRN_LOG_NOTICE, - "default parser isn't changed " - "because the requested default parser isn't different: <%s>", + "default tokenizer for fulltext index isn't changed " + "because the requested default tokenizer isn't different: <%s>", new_value); } else { GRN_LOG(&ctx, GRN_LOG_NOTICE, - "default fulltext parser is changed: <%s> -> <%s>", + "default tokenizer for fulltext index is changed: <%s> -> <%s>", *old_value_ptr, new_value); } @@ -869,12 +854,20 @@ static void mrn_default_parser_update(THD *thd, struct st_mysql_sys_var *var, DBUG_VOID_RETURN; } -static MYSQL_SYSVAR_STR(default_parser, mrn_default_parser, +static MYSQL_SYSVAR_STR(default_parser, mrn_default_tokenizer, PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_MEMALLOC, - "default fulltext parser", + "default fulltext parser " + "(Deprecated. Use mroonga_default_tokenizer instead.)", NULL, - mrn_default_parser_update, - MRN_PARSER_DEFAULT); + mrn_default_tokenizer_update, + MRN_DEFAULT_TOKENIZER); + +static MYSQL_SYSVAR_STR(default_tokenizer, mrn_default_tokenizer, + PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_MEMALLOC, + "default tokenizer for fulltext index", + NULL, + mrn_default_tokenizer_update, + MRN_DEFAULT_TOKENIZER); static MYSQL_THDVAR_BOOL( dry_write, /* name */ @@ -1084,11 +1077,19 @@ static MYSQL_THDVAR_INT(max_n_records_for_estimate, INT_MAX, 0); +static MYSQL_SYSVAR_BOOL(libgroonga_embedded, mrn_libgroonga_embedded, + PLUGIN_VAR_NOCMDARG | PLUGIN_VAR_READONLY, + "Whether libgroonga is embedded or not", + NULL, + NULL, + mrn_libgroonga_embedded); + static struct st_mysql_sys_var *mrn_system_variables[] = { MYSQL_SYSVAR(log_level), MYSQL_SYSVAR(log_file), MYSQL_SYSVAR(default_parser), + MYSQL_SYSVAR(default_tokenizer), MYSQL_SYSVAR(dry_write), MYSQL_SYSVAR(enable_optimization), MYSQL_SYSVAR(match_escalation_threshold), @@ -1105,6 +1106,7 @@ static struct st_mysql_sys_var *mrn_system_variables[] = MYSQL_SYSVAR(boolean_mode_syntax_flags), #endif MYSQL_SYSVAR(max_n_records_for_estimate), + MYSQL_SYSVAR(libgroonga_embedded), NULL }; @@ -1213,7 +1215,7 @@ static int mrn_close_connection(handlerton *hton, THD *thd) MRN_DBUG_ENTER_FUNCTION(); void *p = *thd_ha_data(thd, mrn_hton_ptr); if (p) { - mrn_clear_alter_share(thd); + mrn_clear_slot_data(thd); free(p); *thd_ha_data(thd, mrn_hton_ptr) = (void *) NULL; { @@ -1409,13 +1411,14 @@ static grn_builtin_type mrn_grn_type_from_field(grn_ctx *ctx, Field *field, return type; } -grn_obj_flags mrn_parse_grn_column_create_flags(THD *thd, - grn_ctx *ctx, - const char *flag_names, - uint flag_names_length) +static bool mrn_parse_grn_column_create_flags(THD *thd, + grn_ctx *ctx, + const char *flag_names, + uint flag_names_length, + grn_obj_flags *column_flags) { - grn_obj_flags flags = 0; const char *flag_names_end = flag_names + flag_names_length; + bool found = false; while (flag_names < flag_names_end) { uint rest_length = flag_names_end - flag_names; @@ -1425,14 +1428,17 @@ grn_obj_flags mrn_parse_grn_column_create_flags(THD *thd, continue; } if (rest_length >= 13 && !memcmp(flag_names, "COLUMN_SCALAR", 13)) { - flags |= GRN_OBJ_COLUMN_SCALAR; + *column_flags |= GRN_OBJ_COLUMN_SCALAR; flag_names += 13; + found = true; } else if (rest_length >= 13 && !memcmp(flag_names, "COLUMN_VECTOR", 13)) { - flags |= GRN_OBJ_COLUMN_VECTOR; + *column_flags |= GRN_OBJ_COLUMN_VECTOR; flag_names += 13; + found = true; } else if (rest_length >= 13 && !memcmp(flag_names, "COMPRESS_ZLIB", 13)) { if (mrn_libgroonga_support_zlib) { - flags |= GRN_OBJ_COMPRESS_ZLIB; + *column_flags |= GRN_OBJ_COMPRESS_ZLIB; + found = true; } else { push_warning_printf(thd, MRN_SEVERITY_WARNING, ER_MRN_UNSUPPORTED_COLUMN_FLAG_NUM, @@ -1442,7 +1448,8 @@ grn_obj_flags mrn_parse_grn_column_create_flags(THD *thd, flag_names += 13; } else if (rest_length >= 12 && !memcmp(flag_names, "COMPRESS_LZ4", 12)) { if (mrn_libgroonga_support_lz4) { - flags |= GRN_OBJ_COMPRESS_LZ4; + *column_flags |= GRN_OBJ_COMPRESS_LZ4; + found = true; } else { push_warning_printf(thd, MRN_SEVERITY_WARNING, ER_MRN_UNSUPPORTED_COLUMN_FLAG_NUM, @@ -1459,20 +1466,18 @@ grn_obj_flags mrn_parse_grn_column_create_flags(THD *thd, push_warning_printf(thd, MRN_SEVERITY_WARNING, ER_MRN_INVALID_COLUMN_FLAG_NUM, ER_MRN_INVALID_COLUMN_FLAG_STR, - invalid_flag_name, - "COLUMN_SCALAR"); - flags |= GRN_OBJ_COLUMN_SCALAR; + invalid_flag_name); break; } } - return flags; + return found; } -bool mrn_parse_grn_index_column_flags(THD *thd, - grn_ctx *ctx, - const char *flag_names, - uint flag_names_length, - grn_obj_flags *index_column_flags) +static bool mrn_parse_grn_index_column_flags(THD *thd, + grn_ctx *ctx, + const char *flag_names, + uint flag_names_length, + grn_obj_flags *index_column_flags) { const char *flag_names_end = flag_names + flag_names_length; bool found = false; @@ -1588,6 +1593,24 @@ static uint mrn_alter_table_flags(uint flags) } #endif +#ifdef MRN_SUPPORT_CUSTOM_OPTIONS +static ha_create_table_option mrn_field_options[] = +{ + HA_FOPTION_STRING("GROONGA_TYPE", groonga_type), + HA_FOPTION_STRING("FLAGS", flags), + HA_FOPTION_END +}; + +static ha_create_table_option mrn_index_options[] = +{ + HA_IOPTION_STRING("TOKENIZER", tokenizer), + HA_IOPTION_STRING("NORMALIZER", normalizer), + HA_IOPTION_STRING("TOKEN_FILTERS", token_filters), + HA_IOPTION_STRING("FLAGS", flags), + HA_IOPTION_END +}; +#endif + static int mrn_init(void *p) { // init handlerton @@ -1605,6 +1628,10 @@ static int mrn_init(void *p) hton->flush_logs = mrn_flush_logs; #ifdef MRN_HAVE_HTON_ALTER_TABLE_FLAGS hton->alter_table_flags = mrn_alter_table_flags; +#endif +#ifdef MRN_SUPPORT_CUSTOM_OPTIONS + hton->field_options = mrn_field_options; + hton->index_options = mrn_index_options; #endif mrn_hton_ptr = hton; @@ -1629,11 +1656,9 @@ static int mrn_init(void *p) (PSI_mutex_key *)GetProcAddress(current_module, MRN_TABLE_SHARE_LOCK_SHARE_PROC); # endif -# ifdef MRN_TABLE_SHARE_HAVE_LOCK_HA_DATA - mrn_table_share_lock_ha_data = - (PSI_mutex_key *)GetProcAddress(current_module, - MRN_TABLE_SHARE_LOCK_HA_DATA_PROC); -# endif + mrn_table_share_lock_ha_data = + (PSI_mutex_key *)GetProcAddress(current_module, + MRN_TABLE_SHARE_LOCK_HA_DATA_PROC); # endif #else mrn_binlog_filter = binlog_filter; @@ -1790,7 +1815,7 @@ static int mrn_deinit(void *p) mrn::Lock lock(&mrn_allocated_thds_mutex); while ((tmp_thd = (THD *) my_hash_element(&mrn_allocated_thds, 0))) { - mrn_clear_alter_share(tmp_thd); + mrn_clear_slot_data(tmp_thd); void *slot_ptr = mrn_get_slot_data(tmp_thd, false); if (slot_ptr) free(slot_ptr); *thd_ha_data(tmp_thd, mrn_hton_ptr) = (void *) NULL; @@ -2367,10 +2392,10 @@ const char *ha_mroonga::table_type() const const char *ha_mroonga::index_type(uint key_nr) { MRN_DBUG_ENTER_METHOD(); - KEY key_info = table->s->key_info[key_nr]; - if (key_info.algorithm == HA_KEY_ALG_FULLTEXT) { + KEY *key_info = &(table->s->key_info[key_nr]); + if (key_info->algorithm == HA_KEY_ALG_FULLTEXT) { DBUG_RETURN("FULLTEXT"); - } else if (key_info.algorithm == HA_KEY_ALG_HASH) { + } else if (key_info->algorithm == HA_KEY_ALG_HASH) { DBUG_RETURN("HASH"); } else { DBUG_RETURN("BTREE"); @@ -2655,9 +2680,10 @@ ulonglong ha_mroonga::table_flags() const ulong ha_mroonga::wrapper_index_flags(uint idx, uint part, bool all_parts) const { ulong index_flags; - KEY key = table_share->key_info[idx]; + KEY *key = &(table_share->key_info[idx]); MRN_DBUG_ENTER_METHOD(); - if (key.algorithm == HA_KEY_ALG_BTREE || key.algorithm == HA_KEY_ALG_UNDEF) { + if (key->algorithm == HA_KEY_ALG_BTREE || + key->algorithm == HA_KEY_ALG_UNDEF) { MRN_SET_WRAP_SHARE_KEY(share, table->s); MRN_SET_WRAP_TABLE_KEY(this, table); index_flags = wrap_handler->index_flags(idx, part, all_parts); @@ -2673,18 +2699,27 @@ ulong ha_mroonga::storage_index_flags(uint idx, uint part, bool all_parts) const { MRN_DBUG_ENTER_METHOD(); ulong flags; - KEY key = table_share->key_info[idx]; - if (key.algorithm == HA_KEY_ALG_BTREE || key.algorithm == HA_KEY_ALG_UNDEF) { + KEY *key = &(table_share->key_info[idx]); + if (key->algorithm == HA_KEY_ALG_BTREE || + key->algorithm == HA_KEY_ALG_UNDEF) { flags = HA_READ_NEXT | HA_READ_PREV | HA_READ_RANGE; bool need_normalize_p = false; - Field *field = &key.key_part[part].field[0]; + // TODO: MariaDB 10.1 passes key->user_defined_key_parts as part + // for ORDER BY DESC. We just it fallback to part = 0. We may use + // it for optimization in the future. + // + // See also: test_if_order_by_key() in sql/sql_select.cc. + if (KEY_N_KEY_PARTS(key) == part) { + part = 0; + } + Field *field = &(key->key_part[part].field[0]); if (field && should_normalize(field)) { need_normalize_p = true; } if (!need_normalize_p) { flags |= HA_KEYREAD_ONLY; } - if (KEY_N_KEY_PARTS(&key) > 1 || !need_normalize_p) { + if (KEY_N_KEY_PARTS(key) > 1 || !need_normalize_p) { flags |= HA_READ_ORDER; } } else { @@ -2697,11 +2732,11 @@ ulong ha_mroonga::index_flags(uint idx, uint part, bool all_parts) const { MRN_DBUG_ENTER_METHOD(); - KEY key = table_share->key_info[idx]; - if (key.algorithm == HA_KEY_ALG_FULLTEXT) { + KEY *key = &(table_share->key_info[idx]); + if (key->algorithm == HA_KEY_ALG_FULLTEXT) { DBUG_RETURN(HA_ONLY_WHOLE_INDEX | HA_KEY_SCAN_NOT_ROR); } - if (mrn_is_geo_key(&key)) { + if (mrn_is_geo_key(key)) { DBUG_RETURN(HA_ONLY_WHOLE_INDEX | HA_KEY_SCAN_NOT_ROR); } @@ -2833,9 +2868,23 @@ int ha_mroonga::wrapper_create(const char *name, TABLE *table, share = tmp_share; MRN_SET_WRAP_SHARE_KEY(tmp_share, table->s); MRN_SET_WRAP_TABLE_KEY(this, table); - if (!(hnd = - tmp_share->hton->create(tmp_share->hton, table->s, - current_thd->mem_root))) +#ifdef MRN_SUPPORT_CUSTOM_OPTIONS + if (parse_engine_table_options(ha_thd(), tmp_share->hton, table->s)) { + MRN_SET_BASE_SHARE_KEY(tmp_share, table->s); + MRN_SET_BASE_TABLE_KEY(this, table); + share = NULL; + if (wrap_key_info) + { + my_free(wrap_key_info); + wrap_key_info = NULL; + } + base_key_info = NULL; + error = MRN_GET_ERROR_NUMBER; + DBUG_RETURN(error); + } +#endif + hnd = get_new_handler(table->s, current_thd->mem_root, tmp_share->hton); + if (!hnd) { MRN_SET_BASE_SHARE_KEY(tmp_share, table->s); MRN_SET_BASE_TABLE_KEY(this, table); @@ -2848,7 +2897,6 @@ int ha_mroonga::wrapper_create(const char *name, TABLE *table, base_key_info = NULL; DBUG_RETURN(HA_ERR_OUT_OF_MEM); } - hnd->init(); error = hnd->ha_create(name, table, info); MRN_SET_BASE_SHARE_KEY(tmp_share, table->s); MRN_SET_BASE_TABLE_KEY(this, table); @@ -2856,7 +2904,7 @@ int ha_mroonga::wrapper_create(const char *name, TABLE *table, delete hnd; if (error) { - wrapper_delete_index(name, tmp_share, mapper.table_name()); + generic_delete_table(name, mapper.table_name()); } if (wrap_key_info) @@ -2949,8 +2997,7 @@ int ha_mroonga::wrapper_create_index_fulltext(const char *grn_table_name, mrn_change_encoding(ctx, system_charset_info); index_tables[i] = index_table; - grn_obj *tokenizer = find_tokenizer(tmp_share->key_parser[i], - tmp_share->key_parser_length[i]); + grn_obj *tokenizer = find_tokenizer(key_info, tmp_share, i); if (tokenizer) { grn_info_type info_type = GRN_INFO_DEFAULT_TOKENIZER; grn_obj_set_info(ctx, index_table, info_type, tokenizer); @@ -3097,14 +3144,14 @@ int ha_mroonga::wrapper_create_index(const char *name, TABLE *table, for (i = 0; i < n_keys; i++) { index_tables[i] = NULL; - KEY key_info = table->s->key_info[i]; - if (key_info.algorithm == HA_KEY_ALG_FULLTEXT) { + KEY *key_info = &(table->s->key_info[i]); + if (key_info->algorithm == HA_KEY_ALG_FULLTEXT) { error = wrapper_create_index_fulltext(grn_table_name, - i, &key_info, + i, key_info, index_tables, NULL, tmp_share); - } else if (mrn_is_geo_key(&key_info)) { + } else if (mrn_is_geo_key(key_info)) { error = wrapper_create_index_geo(grn_table_name, - i, &key_info, + i, key_info, index_tables, NULL, tmp_share); } } @@ -3160,12 +3207,12 @@ int ha_mroonga::storage_create(const char *name, TABLE *table, grn_obj *pkey_type; uint pkey_nr = table->s->primary_key; if (pkey_nr != MAX_INDEXES) { - KEY key_info = table->s->key_info[pkey_nr]; + KEY *key_info = &(table->s->key_info[pkey_nr]); bool is_id; - int key_parts = KEY_N_KEY_PARTS(&key_info); + int key_parts = KEY_N_KEY_PARTS(key_info); if (key_parts == 1) { - Field *pkey_field = key_info.key_part[0].field; + Field *pkey_field = key_info->key_part[0].field; const char *column_name = pkey_field->field_name; is_id = (strcmp(MRN_COLUMN_NAME_ID, column_name) == 0); @@ -3177,7 +3224,7 @@ int ha_mroonga::storage_create(const char *name, TABLE *table, } // default algorithm is BTREE ==> PAT - if (!is_id && key_info.algorithm == HA_KEY_ALG_HASH) { + if (!is_id && key_info->algorithm == HA_KEY_ALG_HASH) { table_flags |= GRN_OBJ_TABLE_HASH_KEY; } else if (!is_id) { table_flags |= GRN_OBJ_TABLE_PAT_KEY; @@ -3212,8 +3259,8 @@ int ha_mroonga::storage_create(const char *name, TABLE *table, if (table_flags == (GRN_OBJ_PERSISTENT | GRN_OBJ_TABLE_PAT_KEY) || table_flags == (GRN_OBJ_PERSISTENT | GRN_OBJ_TABLE_HASH_KEY)) { - KEY key_info = table->s->key_info[pkey_nr]; - int key_parts = KEY_N_KEY_PARTS(&key_info); + KEY *key_info = &(table->s->key_info[pkey_nr]); + int key_parts = KEY_N_KEY_PARTS(key_info); if (key_parts == 1) { grn_obj *normalizer = NULL; if (tmp_share->normalizer) { @@ -3221,9 +3268,9 @@ int ha_mroonga::storage_create(const char *name, TABLE *table, tmp_share->normalizer, tmp_share->normalizer_length); } else { - Field *field = &(key_info.key_part->field[0]); + Field *field = &(key_info->key_part->field[0]); if (should_normalize(field)) { - normalizer = find_normalizer(&key_info); + normalizer = find_normalizer(key_info); } } if (normalizer) { @@ -3259,7 +3306,6 @@ int ha_mroonga::storage_create(const char *name, TABLE *table, /* create columns */ uint n_columns = table->s->fields; for (uint i = 0; i < n_columns; i++) { - grn_obj *col_type; Field *field = table->s->field[i]; const char *column_name = field->field_name; int column_name_size = strlen(column_name); @@ -3280,19 +3326,18 @@ int ha_mroonga::storage_create(const char *name, TABLE *table, #endif grn_obj_flags col_flags = GRN_OBJ_PERSISTENT; - if (tmp_share->col_flags[i]) { - col_flags |= mrn_parse_grn_column_create_flags(ha_thd(), - ctx, - tmp_share->col_flags[i], - tmp_share->col_flags_length[i]); - } else { + if (!find_column_flags(field, tmp_share, i, &col_flags)) { col_flags |= GRN_OBJ_COLUMN_SCALAR; } - grn_builtin_type gtype = mrn_grn_type_from_field(ctx, field, false); - if (tmp_share->col_type[i]) { - col_type = grn_ctx_get(ctx, tmp_share->col_type[i], -1); - } else { - col_type = grn_ctx_at(ctx, gtype); + + grn_obj *col_type; + { + int column_type_error_code = ER_CANT_CREATE_TABLE; + col_type = find_column_type(field, tmp_share, i, column_type_error_code); + if (!col_type) { + grn_obj_remove(ctx, table_obj); + DBUG_RETURN(column_type_error_code); + } } char *col_path = NULL; // we don't specify path @@ -3445,17 +3490,11 @@ bool ha_mroonga::storage_create_foreign_key(TABLE *table, DBUG_RETURN(false); } -#ifdef MRN_TABLE_LIST_INIT_REQUIRE_ALIAS table_list.init_one_table(mapper.db_name(), strlen(mapper.db_name()), mapper.mysql_table_name(), strlen(mapper.mysql_table_name()), mapper.mysql_table_name(), TL_WRITE); -#else - table_list.init_one_table(mapper.db_name(), - mapper.mysql_table_name(), - TL_WRITE); -#endif mrn_open_mutex_lock(table->s); tmp_ref_table_share = mrn_create_tmp_table_share(&table_list, ref_path, &error); @@ -3572,16 +3611,16 @@ int ha_mroonga::storage_create_validate_index(TABLE *table) /* checking if index is used for virtual columns */ uint n_keys = table->s->keys; for (i = 0; i < n_keys; i++) { - KEY key_info = table->s->key_info[i]; + KEY *key_info = &(table->s->key_info[i]); // must be single column key - int key_parts = KEY_N_KEY_PARTS(&key_info); + int key_parts = KEY_N_KEY_PARTS(key_info); if (key_parts != 1) { continue; } - Field *field = key_info.key_part[0].field; + Field *field = key_info->key_part[0].field; const char *column_name = field->field_name; if (strcmp(MRN_COLUMN_NAME_ID, column_name) == 0) { - if (key_info.algorithm == HA_KEY_ALG_HASH) { + if (key_info->algorithm == HA_KEY_ALG_HASH) { continue; // hash index is ok } GRN_LOG(ctx, GRN_LOG_ERROR, "only hash index can be defined for _id"); @@ -3660,8 +3699,7 @@ int ha_mroonga::storage_create_index_table(TABLE *table, } if (key_info->flags & HA_FULLTEXT) { - grn_obj *tokenizer = find_tokenizer(tmp_share->key_parser[i], - tmp_share->key_parser_length[i]); + grn_obj *tokenizer = find_tokenizer(key_info, tmp_share, i); if (tokenizer) { grn_info_type info_type = GRN_INFO_DEFAULT_TOKENIZER; grn_obj_set_info(ctx, index_table, info_type, tokenizer); @@ -3909,6 +3947,8 @@ int ha_mroonga::create(const char *name, TABLE *table, HA_CREATE_INFO *info) if (error) { mrn_free_long_term_share(tmp_share->long_term_share); tmp_share->long_term_share = NULL; + } else { + error = add_wrap_hton(tmp_share->table_name, tmp_share->hton); } mrn_free_share(tmp_share); DBUG_RETURN(error); @@ -3956,8 +3996,8 @@ int ha_mroonga::wrapper_open(const char *name, int mode, uint test_if_locked) MRN_SET_WRAP_TABLE_KEY(this, table); if (!is_clone) { - if (!(wrap_handler = - share->hton->create(share->hton, table->s, &mem_root))) + wrap_handler = get_new_handler(table->s, &mem_root, share->hton); + if (!wrap_handler) { MRN_SET_BASE_SHARE_KEY(share, table->s); MRN_SET_BASE_TABLE_KEY(this, table); @@ -3969,19 +4009,13 @@ int ha_mroonga::wrapper_open(const char *name, int mode, uint test_if_locked) base_key_info = NULL; DBUG_RETURN(HA_ERR_OUT_OF_MEM); } - wrap_handler->init(); #ifdef MRN_HANDLER_HAVE_SET_HA_SHARE_REF wrap_handler->set_ha_share_ref(&table->s->ha_share); #endif error = wrap_handler->ha_open(table, name, mode, test_if_locked); } else { -#ifdef MRN_HANDLER_CLONE_NEED_NAME if (!(wrap_handler = parent_for_clone->wrap_handler->clone(name, mem_root_for_clone))) -#else - if (!(wrap_handler = parent_for_clone->wrap_handler->clone( - mem_root_for_clone))) -#endif { MRN_SET_BASE_SHARE_KEY(share, table->s); MRN_SET_BASE_TABLE_KEY(this, table); @@ -4047,12 +4081,12 @@ int ha_mroonga::wrapper_open_indexes(const char *name) mrn::PathMapper mapper(name); uint i = 0; for (i = 0; i < n_keys; i++) { - KEY key_info = table->s->key_info[i]; + KEY *key_info = &(table->s->key_info[i]); grn_index_tables[i] = NULL; grn_index_columns[i] = NULL; - if (!(wrapper_is_target_index(&key_info))) { + if (!(wrapper_is_target_index(key_info))) { continue; } @@ -4060,7 +4094,7 @@ int ha_mroonga::wrapper_open_indexes(const char *name) continue; } - mrn::IndexTableName index_table_name(mapper.table_name(), key_info.name); + mrn::IndexTableName index_table_name(mapper.table_name(), key_info->name); grn_index_tables[i] = grn_ctx_get(ctx, index_table_name.c_str(), index_table_name.length()); @@ -4077,7 +4111,7 @@ int ha_mroonga::wrapper_open_indexes(const char *name) strlen(INDEX_COLUMN_NAME)); if (!grn_index_columns[i]) { /* just for backward compatibility before 1.0. */ - Field *field = key_info.key_part[0].field; + Field *field = key_info->key_part[0].field; grn_index_columns[i] = grn_obj_column(ctx, grn_index_tables[i], field->field_name, strlen(field->field_name)); @@ -4337,10 +4371,10 @@ int ha_mroonga::storage_open_indexes(const char *name) continue; } - KEY key_info = table->s->key_info[i]; - if (KEY_N_KEY_PARTS(&key_info) > 1) { - KEY_PART_INFO *key_part = key_info.key_part; - for (j = 0; j < KEY_N_KEY_PARTS(&key_info); j++) { + KEY *key_info = &(table->s->key_info[i]); + if (KEY_N_KEY_PARTS(key_info) > 1) { + KEY_PART_INFO *key_part = key_info->key_part; + for (j = 0; j < KEY_N_KEY_PARTS(key_info); j++) { bitmap_set_bit(&multiple_column_key_bitmap, key_part[j].field->field_index); } @@ -4355,11 +4389,11 @@ int ha_mroonga::storage_open_indexes(const char *name) if (ctx->rc == GRN_SUCCESS) { grn_index_columns[i] = grn_obj_column(ctx, grn_index_tables[i], - key_info.name, - strlen(key_info.name)); + key_info->name, + strlen(key_info->name)); } } else { - mrn::IndexTableName index_table_name(mapper.table_name(), key_info.name); + mrn::IndexTableName index_table_name(mapper.table_name(), key_info->name); grn_index_tables[i] = grn_ctx_get(ctx, index_table_name.c_str(), index_table_name.length()); @@ -4370,7 +4404,7 @@ int ha_mroonga::storage_open_indexes(const char *name) strlen(INDEX_COLUMN_NAME)); if (!grn_index_columns[i] && ctx->rc == GRN_SUCCESS) { /* just for backward compatibility before 1.0. */ - Field *field = key_info.key_part[0].field; + Field *field = key_info->key_part[0].field; grn_index_columns[i] = grn_obj_column(ctx, grn_index_tables[i], field->field_name, strlen(field->field_name)); @@ -4504,40 +4538,20 @@ int ha_mroonga::close() error = storage_close(); } - if (is_temporary_table_name(share->table_name)) { - TABLE_LIST table_list; - TABLE_SHARE *tmp_table_share; - int tmp_error; - /* no need to decode */ - mrn::PathMapper mapper(share->table_name); -#ifdef MRN_TABLE_LIST_INIT_REQUIRE_ALIAS - table_list.init_one_table(mapper.db_name(), strlen(mapper.db_name()), - mapper.mysql_table_name(), - strlen(mapper.mysql_table_name()), - mapper.mysql_table_name(), - TL_WRITE); -#else - table_list.init_one_table(mapper.db_name(), mapper.mysql_table_name(), - TL_WRITE); -#endif - mrn_open_mutex_lock(NULL); - tmp_table_share = - mrn_create_tmp_table_share(&table_list, share->table_name, &tmp_error); - mrn_open_mutex_unlock(NULL); - if (!tmp_table_share) { - error = tmp_error; - } else if ((tmp_error = alter_share_add(share->table_name, - tmp_table_share))) { - error = tmp_error; - mrn_open_mutex_lock(NULL); - mrn_free_tmp_table_share(tmp_table_share); - mrn_open_mutex_unlock(NULL); - } + if (error != 0) + { + DBUG_RETURN(error); } + + error = add_wrap_hton(share->table_name, share->hton); bitmap_free(&multiple_column_key_bitmap); + if (share->use_count == 1) { + mrn_free_long_term_share(share->long_term_share); + } mrn_free_share(share); share = NULL; is_clone = false; + if ( thd && thd_sql_command(thd) == SQLCOM_FLUSH @@ -4554,37 +4568,26 @@ int ha_mroonga::close() DBUG_RETURN(error); } -int ha_mroonga::wrapper_delete_table(const char *name, MRN_SHARE *tmp_share, +int ha_mroonga::wrapper_delete_table(const char *name, + handlerton *wrap_handlerton, const char *table_name) { int error = 0; - handler *hnd; MRN_DBUG_ENTER_METHOD(); - MRN_SET_WRAP_SHARE_KEY(tmp_share, tmp_share->table_share); - if (!(hnd = - tmp_share->hton->create(tmp_share->hton, tmp_share->table_share, - current_thd->mem_root))) + + handler *hnd = get_new_handler(NULL, current_thd->mem_root, wrap_handlerton); + if (!hnd) { - MRN_SET_BASE_SHARE_KEY(tmp_share, tmp_share->table_share); DBUG_RETURN(HA_ERR_OUT_OF_MEM); } - hnd->init(); - MRN_SET_BASE_SHARE_KEY(tmp_share, tmp_share->table_share); - - if ((error = hnd->ha_delete_table(name))) - { - delete hnd; - DBUG_RETURN(error); - } - - error = wrapper_delete_index(name, tmp_share, table_name); + error = hnd->ha_delete_table(name); delete hnd; + DBUG_RETURN(error); } -int ha_mroonga::wrapper_delete_index(const char *name, MRN_SHARE *tmp_share, - const char *table_name) +int ha_mroonga::generic_delete_table(const char *name, const char *table_name) { int error = 0; MRN_DBUG_ENTER_METHOD(); @@ -4597,51 +4600,7 @@ int ha_mroonga::wrapper_delete_index(const char *name, MRN_SHARE *tmp_share, if (error) DBUG_RETURN(error); - TABLE_SHARE *tmp_table_share = tmp_share->table_share; - - uint i; - for (i = 0; i < tmp_table_share->keys; i++) { - error = drop_index(tmp_share, i); - if (error) { - DBUG_RETURN(error); - } - } - - grn_obj *table = grn_ctx_get(ctx, table_name, strlen(table_name)); - if (!ctx->rc) { - grn_obj_remove(ctx, table); - } - if (ctx->rc) { - error = ER_CANT_OPEN_FILE; - my_message(error, ctx->errbuf, MYF(0)); - DBUG_RETURN(error); - } - DBUG_RETURN(error); -} - -int ha_mroonga::storage_delete_table(const char *name, MRN_SHARE *tmp_share, - const char *table_name) -{ - int error = 0; - TABLE_SHARE *tmp_table_share = tmp_share->table_share; - MRN_DBUG_ENTER_METHOD(); - - error = ensure_database_open(name); - if (error) - DBUG_RETURN(error); - - error = mrn_change_encoding(ctx, system_charset_info); - if (error) - DBUG_RETURN(error); - - uint i; - for (i = 0; i < tmp_table_share->keys; i++) { - error = drop_index(tmp_share, i); - if (error) { - DBUG_RETURN(error); - } - } - + error = drop_indexes(table_name); grn_obj *table_obj = grn_ctx_get(ctx, table_name, strlen(table_name)); if (!ctx->rc) { grn_obj_remove(ctx, table_obj); @@ -4656,86 +4615,50 @@ int ha_mroonga::storage_delete_table(const char *name, MRN_SHARE *tmp_share, int ha_mroonga::delete_table(const char *name) { + MRN_DBUG_ENTER_METHOD(); + int error = 0; THD *thd = ha_thd(); - TABLE_LIST table_list; - TABLE_SHARE *tmp_table_share = NULL; - TABLE tmp_table; - MRN_SHARE *tmp_share; - st_mrn_alter_share *alter_share, *tmp_alter_share; - MRN_DBUG_ENTER_METHOD(); + handlerton *wrap_handlerton = NULL; mrn::PathMapper mapper(name); st_mrn_slot_data *slot_data = mrn_get_slot_data(thd, false); - if (slot_data && slot_data->first_alter_share) + if (slot_data && slot_data->first_wrap_hton) { - tmp_alter_share = NULL; - alter_share = slot_data->first_alter_share; - while (alter_share) + st_mrn_wrap_hton *wrap_hton, *tmp_wrap_hton; + tmp_wrap_hton = NULL; + wrap_hton = slot_data->first_wrap_hton; + while (wrap_hton) { - if (!strcmp(alter_share->path, name)) + if (!strcmp(wrap_hton->path, name)) { /* found */ - tmp_table_share = alter_share->alter_share; - if (tmp_alter_share) - tmp_alter_share->next = alter_share->next; + wrap_handlerton = wrap_hton->hton; + if (tmp_wrap_hton) + tmp_wrap_hton->next = wrap_hton->next; else - slot_data->first_alter_share = alter_share->next; - free(alter_share); + slot_data->first_wrap_hton = wrap_hton->next; + free(wrap_hton); break; } - tmp_alter_share = alter_share; - alter_share = alter_share->next; + tmp_wrap_hton = wrap_hton; + wrap_hton = wrap_hton->next; } } - if (!tmp_table_share) + + if (wrap_handlerton) { -#ifdef MRN_TABLE_LIST_INIT_REQUIRE_ALIAS - table_list.init_one_table(mapper.db_name(), strlen(mapper.db_name()), - mapper.mysql_table_name(), - strlen(mapper.mysql_table_name()), - mapper.mysql_table_name(), - TL_WRITE); -#else - table_list.init_one_table(mapper.db_name(), mapper.mysql_table_name(), - TL_WRITE); -#endif - mrn_open_mutex_lock(NULL); - tmp_table_share = mrn_create_tmp_table_share(&table_list, name, &error); - mrn_open_mutex_unlock(NULL); - if (!tmp_table_share) { - DBUG_RETURN(error); - } - } - tmp_table.s = tmp_table_share; -#ifdef WITH_PARTITION_STORAGE_ENGINE - tmp_table.part_info = NULL; -#endif - if (!(tmp_share = mrn_get_share(name, &tmp_table, &error))) - { - mrn_open_mutex_lock(NULL); - mrn_free_tmp_table_share(tmp_table_share); - mrn_open_mutex_unlock(NULL); - DBUG_RETURN(error); + error = wrapper_delete_table(name, wrap_handlerton, mapper.table_name()); } - if (tmp_share->wrapper_mode) + if (!error) { - error = wrapper_delete_table(name, tmp_share, mapper.table_name()); - } else { - error = storage_delete_table(name, tmp_share, mapper.table_name()); + error = generic_delete_table(name, mapper.table_name()); } - if (!error) { - mrn_free_long_term_share(tmp_share->long_term_share); - tmp_share->long_term_share = NULL; - } - mrn_free_share(tmp_share); - mrn_open_mutex_lock(NULL); - mrn_free_tmp_table_share(tmp_table_share); - mrn_open_mutex_unlock(NULL); - if (is_temporary_table_name(name)) { + if (!error && is_temporary_table_name(name)) { mrn_db_manager->drop(name); } + DBUG_RETURN(error); } @@ -5331,9 +5254,9 @@ bool ha_mroonga::wrapper_have_target_index() uint i; uint n_keys = table->s->keys; for (i = 0; i < n_keys; i++) { - KEY key_info = table->key_info[i]; + KEY *key_info = &(table->key_info[i]); - if (wrapper_is_target_index(&key_info)) { + if (wrapper_is_target_index(key_info)) { have_target_index = true; break; } @@ -5406,9 +5329,9 @@ int ha_mroonga::wrapper_write_row_index(uchar *buf) uint i; uint n_keys = table->s->keys; for (i = 0; i < n_keys; i++) { - KEY key_info = table->key_info[i]; + KEY *key_info = &(table->key_info[i]); - if (!(wrapper_is_target_index(&key_info))) { + if (!(wrapper_is_target_index(key_info))) { continue; } @@ -5418,8 +5341,8 @@ int ha_mroonga::wrapper_write_row_index(uchar *buf) } uint j; - for (j = 0; j < KEY_N_KEY_PARTS(&key_info); j++) { - Field *field = key_info.key_part[j].field; + for (j = 0; j < KEY_N_KEY_PARTS(key_info); j++) { + Field *field = key_info->key_part[j].field; if (field->is_null()) continue; @@ -5481,7 +5404,8 @@ int ha_mroonga::storage_write_row(uchar *buf) if (strcmp(MRN_COLUMN_NAME_ID, column_name) == 0) { push_warning_printf(thd, MRN_SEVERITY_WARNING, - WARN_DATA_TRUNCATED, MRN_GET_ERR_MSG(WARN_DATA_TRUNCATED), + WARN_DATA_TRUNCATED, + MRN_GET_ERR_MSG(WARN_DATA_TRUNCATED), MRN_COLUMN_NAME_ID, MRN_GET_CURRENT_ROW_FOR_WARNING(thd)); if (MRN_ABORT_ON_WARNING(thd)) { @@ -5490,66 +5414,79 @@ int ha_mroonga::storage_write_row(uchar *buf) } } - char *pkey; - int pkey_size; - uint pkey_nr; - pkey_nr = table->s->primary_key; - GRN_BULK_REWIND(&key_buffer); - if (pkey_nr == MAX_INDEXES) { - pkey = NULL; - pkey_size = 0; - } else { - KEY key_info = table->key_info[pkey_nr]; - if (KEY_N_KEY_PARTS(&key_info) == 1) { - Field *pkey_field = key_info.key_part[0].field; - error = mrn_change_encoding(ctx, pkey_field->charset()); - if (error) { - DBUG_RETURN(error); - } - generic_store_bulk(pkey_field, &key_buffer); - pkey = GRN_TEXT_VALUE(&key_buffer); - pkey_size = GRN_TEXT_LEN(&key_buffer); - } else { - mrn_change_encoding(ctx, NULL); - uchar key[MRN_MAX_KEY_SIZE]; - key_copy(key, buf, &key_info, key_info.key_length); - grn_bulk_space(ctx, &key_buffer, key_info.key_length); - pkey = GRN_TEXT_VALUE(&key_buffer); - storage_encode_multiple_column_key(&key_info, - key, key_info.key_length, - (uchar *)pkey, (uint *)&pkey_size); - } - } + uint pkey_nr = table->s->primary_key; - if (grn_table->header.type != GRN_TABLE_NO_KEY && pkey_size == 0) { - my_message(ER_ERROR_ON_WRITE, "primary key is empty", MYF(0)); - DBUG_RETURN(ER_ERROR_ON_WRITE); - } - - int added; - record_id = grn_table_add(ctx, grn_table, pkey, pkey_size, &added); - if (ctx->rc) { - my_message(ER_ERROR_ON_WRITE, ctx->errbuf, MYF(0)); - DBUG_RETURN(ER_ERROR_ON_WRITE); - } - if (!added) { - // duplicated error - error = HA_ERR_FOUND_DUPP_KEY; - memcpy(dup_ref, &record_id, sizeof(grn_id)); - dup_key = pkey_nr; - if (!ignoring_duplicated_key) { - GRN_LOG(ctx, GRN_LOG_ERROR, - "duplicated id on insert: update primary key: <%.*s>", - pkey_size, pkey); - } - DBUG_RETURN(error); - } - - if ((error = storage_write_row_unique_indexes(buf))) + int added = 0; { - goto err; + mrn::Lock lock(&(share->record_mutex), have_unique_index()); + if ((error = storage_write_row_unique_indexes(buf))) + { + DBUG_RETURN(error); + } + unique_indexes_are_processed = true; + + char *pkey; + int pkey_size; + GRN_BULK_REWIND(&key_buffer); + if (pkey_nr == MAX_INDEXES) { + pkey = NULL; + pkey_size = 0; + } else { + KEY *key_info = &(table->key_info[pkey_nr]); + if (KEY_N_KEY_PARTS(key_info) == 1) { + Field *pkey_field = key_info->key_part[0].field; + error = mrn_change_encoding(ctx, pkey_field->charset()); + if (error) { + DBUG_RETURN(error); + } + generic_store_bulk(pkey_field, &key_buffer); + pkey = GRN_TEXT_VALUE(&key_buffer); + pkey_size = GRN_TEXT_LEN(&key_buffer); + } else { + mrn_change_encoding(ctx, NULL); + uchar key[MRN_MAX_KEY_SIZE]; + key_copy(key, buf, key_info, key_info->key_length); + grn_bulk_reserve(ctx, &key_buffer, MRN_MAX_KEY_SIZE); + pkey = GRN_TEXT_VALUE(&key_buffer); + storage_encode_multiple_column_key(key_info, + key, key_info->key_length, + (uchar *)pkey, (uint *)&pkey_size); + } + } + + if (grn_table->header.type != GRN_TABLE_NO_KEY && pkey_size == 0) { + my_message(ER_ERROR_ON_WRITE, "primary key is empty", MYF(0)); + DBUG_RETURN(ER_ERROR_ON_WRITE); + } + + record_id = grn_table_add(ctx, grn_table, pkey, pkey_size, &added); + if (ctx->rc) { + my_message(ER_ERROR_ON_WRITE, ctx->errbuf, MYF(0)); + DBUG_RETURN(ER_ERROR_ON_WRITE); + } + if (!added) { + // duplicated error + error = HA_ERR_FOUND_DUPP_KEY; + memcpy(dup_ref, &record_id, sizeof(grn_id)); + dup_key = pkey_nr; + if (!ignoring_duplicated_key) { + GRN_LOG(ctx, GRN_LOG_ERROR, + "duplicated id on insert: update primary key: <%.*s>", + pkey_size, pkey); + } + uint j; + for (j = 0; j < table->s->keys; j++) { + if (j == pkey_nr) { + continue; + } + KEY *key_info = &table->key_info[j]; + if (key_info->flags & HA_NOSAME) { + grn_table_delete_by_id(ctx, grn_index_tables[j], key_id[j]); + } + } + DBUG_RETURN(error); + } } - unique_indexes_are_processed = true; grn_obj colbuf; GRN_VOID_INIT(&colbuf); @@ -5673,16 +5610,16 @@ int ha_mroonga::storage_write_row_multiple_column_index(uchar *buf, key_info, key_info->key_length); GRN_BULK_REWIND(&encoded_key_buffer); - grn_bulk_space(ctx, &encoded_key_buffer, key_info->key_length); + grn_bulk_reserve(ctx, &encoded_key_buffer, MRN_MAX_KEY_SIZE); uint encoded_key_length; storage_encode_multiple_column_key(key_info, (uchar *)(GRN_TEXT_VALUE(&key_buffer)), key_info->key_length, (uchar *)(GRN_TEXT_VALUE(&encoded_key_buffer)), &encoded_key_length); + grn_bulk_space(ctx, &encoded_key_buffer, encoded_key_length); DBUG_PRINT("info", ("mroonga: key_length=%u", key_info->key_length)); DBUG_PRINT("info", ("mroonga: encoded_key_length=%u", encoded_key_length)); - DBUG_ASSERT(key_info->key_length >= encoded_key_length); grn_rc rc; rc = grn_column_index_update(ctx, index_column, record_id, 1, NULL, @@ -5709,9 +5646,9 @@ int ha_mroonga::storage_write_row_multiple_column_indexes(uchar *buf, continue; } - KEY key_info = table->key_info[i]; + KEY *key_info = &(table->key_info[i]); - if (KEY_N_KEY_PARTS(&key_info) == 1 || (key_info.flags & HA_FULLTEXT)) { + if (KEY_N_KEY_PARTS(key_info) == 1 || (key_info->flags & HA_FULLTEXT)) { continue; } @@ -5722,7 +5659,7 @@ int ha_mroonga::storage_write_row_multiple_column_indexes(uchar *buf, if ((error = storage_write_row_multiple_column_index(buf, record_id, - &key_info, + key_info, index_column))) { goto err; @@ -5757,7 +5694,7 @@ int ha_mroonga::storage_write_row_unique_index(uchar *buf, mrn_change_encoding(ctx, NULL); uchar key[MRN_MAX_KEY_SIZE]; key_copy(key, buf, key_info, key_info->key_length); - grn_bulk_space(ctx, &key_buffer, key_info->key_length); + grn_bulk_reserve(ctx, &key_buffer, MRN_MAX_KEY_SIZE); ukey = GRN_TEXT_VALUE(&key_buffer); storage_encode_multiple_column_key(key_info, key, key_info->key_length, @@ -5949,11 +5886,11 @@ int ha_mroonga::wrapper_update_row_index(const uchar *old_data, uchar *new_data) } mrn_change_encoding(ctx, NULL); - KEY key_info = table->key_info[table_share->primary_key]; + KEY *key_info = &(table->key_info[table_share->primary_key]); GRN_BULK_REWIND(&key_buffer); key_copy((uchar *)(GRN_TEXT_VALUE(&key_buffer)), new_data, - &key_info, key_info.key_length); + key_info, key_info->key_length); int added; grn_id new_record_id; new_record_id = grn_table_add(ctx, grn_table, @@ -5972,15 +5909,15 @@ int ha_mroonga::wrapper_update_row_index(const uchar *old_data, uchar *new_data) grn_id old_record_id; my_ptrdiff_t ptr_diff = PTR_BYTE_DIFF(old_data, table->record[0]); - for (uint j = 0; j < KEY_N_KEY_PARTS(&key_info); j++) { - Field *field = key_info.key_part[j].field; + for (uint j = 0; j < KEY_N_KEY_PARTS(key_info); j++) { + Field *field = key_info->key_part[j].field; field->move_field_offset(ptr_diff); } error = wrapper_get_record_id((uchar *)old_data, &old_record_id, "failed to get old record ID " "for updating from groonga"); - for (uint j = 0; j < KEY_N_KEY_PARTS(&key_info); j++) { - Field *field = key_info.key_part[j].field; + for (uint j = 0; j < KEY_N_KEY_PARTS(key_info); j++) { + Field *field = key_info->key_part[j].field; field->move_field_offset(-ptr_diff); } if (error) { @@ -5991,9 +5928,9 @@ int ha_mroonga::wrapper_update_row_index(const uchar *old_data, uchar *new_data) uint i; uint n_keys = table->s->keys; for (i = 0; i < n_keys; i++) { - KEY key_info = table->key_info[i]; + KEY *key_info = &(table->key_info[i]); - if (!(wrapper_is_target_index(&key_info))) { + if (!(wrapper_is_target_index(key_info))) { continue; } @@ -6004,8 +5941,8 @@ int ha_mroonga::wrapper_update_row_index(const uchar *old_data, uchar *new_data) } uint j; - for (j = 0; j < KEY_N_KEY_PARTS(&key_info); j++) { - Field *field = key_info.key_part[j].field; + for (j = 0; j < KEY_N_KEY_PARTS(key_info); j++) { + Field *field = key_info->key_part[j].field; generic_store_bulk(field, &new_value_buffer); @@ -6086,6 +6023,7 @@ int ha_mroonga::storage_update_row(const uchar *old_data, uchar *new_data) KEY *pkey_info = NULL; storage_store_fields_for_prep_update(old_data, new_data, record_id); { + mrn::Lock lock(&(share->record_mutex), have_unique_index()); mrn::DebugColumnAccess debug_column_access(table, table->read_set); if ((error = storage_prepare_delete_row_unique_indexes(old_data, record_id))) { @@ -6233,9 +6171,9 @@ int ha_mroonga::storage_update_row_index(const uchar *old_data, uchar *new_data) continue; } - KEY key_info = table->key_info[i]; + KEY *key_info = &(table->key_info[i]); - if (KEY_N_KEY_PARTS(&key_info) == 1 || (key_info.flags & HA_FULLTEXT)) { + if (KEY_N_KEY_PARTS(key_info) == 1 || (key_info->flags & HA_FULLTEXT)) { continue; } @@ -6246,42 +6184,44 @@ int ha_mroonga::storage_update_row_index(const uchar *old_data, uchar *new_data) } GRN_BULK_REWIND(&old_key); - grn_bulk_space(ctx, &old_key, key_info.key_length); - for (uint j = 0; j < KEY_N_KEY_PARTS(&key_info); j++) { - Field *field = key_info.key_part[j].field; + grn_bulk_space(ctx, &old_key, key_info->key_length); + for (uint j = 0; j < KEY_N_KEY_PARTS(key_info); j++) { + Field *field = key_info->key_part[j].field; field->move_field_offset(ptr_diff); } key_copy((uchar *)(GRN_TEXT_VALUE(&old_key)), (uchar *)old_data, - &key_info, - key_info.key_length); - for (uint j = 0; j < KEY_N_KEY_PARTS(&key_info); j++) { - Field *field = key_info.key_part[j].field; + key_info, + key_info->key_length); + for (uint j = 0; j < KEY_N_KEY_PARTS(key_info); j++) { + Field *field = key_info->key_part[j].field; field->move_field_offset(-ptr_diff); } GRN_BULK_REWIND(&old_encoded_key); - grn_bulk_space(ctx, &old_encoded_key, key_info.key_length); + grn_bulk_reserve(ctx, &old_encoded_key, MRN_MAX_KEY_SIZE); uint old_encoded_key_length; - storage_encode_multiple_column_key(&key_info, + storage_encode_multiple_column_key(key_info, (uchar *)(GRN_TEXT_VALUE(&old_key)), - key_info.key_length, + key_info->key_length, (uchar *)(GRN_TEXT_VALUE(&old_encoded_key)), &old_encoded_key_length); + grn_bulk_space(ctx, &old_encoded_key, old_encoded_key_length); GRN_BULK_REWIND(&new_key); - grn_bulk_space(ctx, &new_key, key_info.key_length); + grn_bulk_space(ctx, &new_key, key_info->key_length); key_copy((uchar *)(GRN_TEXT_VALUE(&new_key)), (uchar *)new_data, - &key_info, - key_info.key_length); + key_info, + key_info->key_length); GRN_BULK_REWIND(&new_encoded_key); - grn_bulk_space(ctx, &new_encoded_key, key_info.key_length); + grn_bulk_reserve(ctx, &new_encoded_key, MRN_MAX_KEY_SIZE); uint new_encoded_key_length; - storage_encode_multiple_column_key(&key_info, + storage_encode_multiple_column_key(key_info, (uchar *)(GRN_TEXT_VALUE(&new_key)), - key_info.key_length, + key_info->key_length, (uchar *)(GRN_TEXT_VALUE(&new_encoded_key)), &new_encoded_key_length); + grn_bulk_space(ctx, &new_encoded_key, new_encoded_key_length); grn_rc rc; rc = grn_column_index_update(ctx, index_column, record_id, 1, @@ -6436,9 +6376,9 @@ int ha_mroonga::wrapper_delete_row_index(const uchar *buf) uint i; uint n_keys = table->s->keys; for (i = 0; i < n_keys; i++) { - KEY key_info = table->key_info[i]; + KEY *key_info = &(table->key_info[i]); - if (!(wrapper_is_target_index(&key_info))) { + if (!(wrapper_is_target_index(key_info))) { continue; } @@ -6449,8 +6389,8 @@ int ha_mroonga::wrapper_delete_row_index(const uchar *buf) } uint j; - for (j = 0; j < KEY_N_KEY_PARTS(&key_info); j++) { - Field *field = key_info.key_part[j].field; + for (j = 0; j < KEY_N_KEY_PARTS(key_info); j++) { + Field *field = key_info->key_part[j].field; if (field->is_null()) continue; @@ -6487,20 +6427,23 @@ int ha_mroonga::storage_delete_row(const uchar *buf) } storage_store_fields_for_prep_update(buf, NULL, record_id); - if ((error = storage_prepare_delete_row_unique_indexes(buf, record_id))) { - DBUG_RETURN(error); - } - mrn_change_encoding(ctx, NULL); - grn_table_delete_by_id(ctx, grn_table, record_id); - if (ctx->rc) { - my_message(ER_ERROR_ON_WRITE, ctx->errbuf, MYF(0)); - DBUG_RETURN(ER_ERROR_ON_WRITE); - } - if ( - (error = storage_delete_row_index(buf)) || - (error = storage_delete_row_unique_indexes()) - ) { - DBUG_RETURN(error); + { + mrn::Lock lock(&(share->record_mutex), have_unique_index()); + if ((error = storage_prepare_delete_row_unique_indexes(buf, record_id))) { + DBUG_RETURN(error); + } + mrn_change_encoding(ctx, NULL); + grn_table_delete_by_id(ctx, grn_table, record_id); + if (ctx->rc) { + my_message(ER_ERROR_ON_WRITE, ctx->errbuf, MYF(0)); + DBUG_RETURN(ER_ERROR_ON_WRITE); + } + if ( + (error = storage_delete_row_index(buf)) || + (error = storage_delete_row_unique_indexes()) + ) { + DBUG_RETURN(error); + } } grn_db_touch(ctx, grn_ctx_db(ctx)); @@ -6526,9 +6469,9 @@ int ha_mroonga::storage_delete_row_index(const uchar *buf) continue; } - KEY key_info = table->key_info[i]; + KEY *key_info = &(table->key_info[i]); - if (KEY_N_KEY_PARTS(&key_info) == 1 || (key_info.flags & HA_FULLTEXT)) { + if (KEY_N_KEY_PARTS(key_info) == 1 || (key_info->flags & HA_FULLTEXT)) { continue; } @@ -6539,19 +6482,20 @@ int ha_mroonga::storage_delete_row_index(const uchar *buf) } GRN_BULK_REWIND(&key); - grn_bulk_space(ctx, &key, key_info.key_length); + grn_bulk_space(ctx, &key, key_info->key_length); key_copy((uchar *)(GRN_TEXT_VALUE(&key)), (uchar *)buf, - &key_info, - key_info.key_length); + key_info, + key_info->key_length); GRN_BULK_REWIND(&encoded_key); - grn_bulk_space(ctx, &encoded_key, key_info.key_length); + grn_bulk_reserve(ctx, &encoded_key, MRN_MAX_KEY_SIZE); uint encoded_key_length; - storage_encode_multiple_column_key(&key_info, + storage_encode_multiple_column_key(key_info, (uchar *)(GRN_TEXT_VALUE(&key)), - key_info.key_length, + key_info->key_length, (uchar *)(GRN_TEXT_VALUE(&encoded_key)), &encoded_key_length); + grn_bulk_space(ctx, &encoded_key, encoded_key_length); grn_rc rc; rc = grn_column_index_update(ctx, index_column, record_id, 1, @@ -6627,7 +6571,7 @@ int ha_mroonga::storage_prepare_delete_row_unique_index(const uchar *buf, mrn_change_encoding(ctx, NULL); uchar key[MRN_MAX_KEY_SIZE]; key_copy(key, (uchar *) buf, key_info, key_info->key_length); - grn_bulk_space(ctx, &key_buffer, key_info->key_length); + grn_bulk_reserve(ctx, &key_buffer, MRN_MAX_KEY_SIZE); ukey = GRN_TEXT_VALUE(&key_buffer); storage_encode_multiple_column_key(key_info, key, key_info->key_length, @@ -6737,8 +6681,8 @@ ha_rows ha_mroonga::wrapper_records_in_range(uint key_nr, key_range *range_min, { ha_rows row_count; MRN_DBUG_ENTER_METHOD(); - KEY key_info = table->s->key_info[key_nr]; - if (mrn_is_geo_key(&key_info)) { + KEY *key_info = &(table->s->key_info[key_nr]); + if (mrn_is_geo_key(key_info)) { row_count = generic_records_in_range_geo(key_nr, range_min, range_max); } else { MRN_SET_WRAP_SHARE_KEY(share, table->s); @@ -6760,8 +6704,8 @@ ha_rows ha_mroonga::storage_records_in_range(uint key_nr, key_range *range_min, uchar *key_min = NULL, *key_max = NULL; uchar key_min_entity[MRN_MAX_KEY_SIZE]; uchar key_max_entity[MRN_MAX_KEY_SIZE]; - KEY key_info = table->s->key_info[key_nr]; - bool is_multiple_column_index = KEY_N_KEY_PARTS(&key_info) > 1; + KEY *key_info = &(table->s->key_info[key_nr]); + bool is_multiple_column_index = KEY_N_KEY_PARTS(key_info) > 1; if (is_multiple_column_index) { mrn_change_encoding(ctx, NULL); @@ -6770,24 +6714,23 @@ ha_rows ha_mroonga::storage_records_in_range(uint key_nr, key_range *range_min, memcmp(range_min->key, range_max->key, range_min->length) == 0) { flags |= GRN_CURSOR_PREFIX; key_min = key_min_entity; - storage_encode_multiple_column_key(&key_info, + storage_encode_multiple_column_key(key_info, range_min->key, range_min->length, key_min, &size_min); } else { key_min = key_min_entity; key_max = key_max_entity; - storage_encode_multiple_column_key_range(&key_info, + storage_encode_multiple_column_key_range(key_info, range_min, range_max, key_min, &size_min, key_max, &size_max); } - } else if (mrn_is_geo_key(&key_info)) { - mrn_change_encoding(ctx, key_info.key_part->field->charset()); + } else if (mrn_is_geo_key(key_info)) { + mrn_change_encoding(ctx, key_info->key_part->field->charset()); row_count = generic_records_in_range_geo(key_nr, range_min, range_max); DBUG_RETURN(row_count); } else { - KEY_PART_INFO key_part = key_info.key_part[0]; - Field *field = key_part.field; + Field *field = key_info->key_part[0].field; const char *column_name = field->field_name; mrn_change_encoding(ctx, field->charset()); @@ -6909,12 +6852,12 @@ ha_rows ha_mroonga::records_in_range(uint key_nr, key_range *range_min, key_rang int ha_mroonga::wrapper_index_init(uint idx, bool sorted) { - int error = 0; - KEY key_info = table->s->key_info[idx]; MRN_DBUG_ENTER_METHOD(); + int error = 0; + KEY *key_info = &(table->s->key_info[idx]); MRN_SET_WRAP_SHARE_KEY(share, table->s); MRN_SET_WRAP_TABLE_KEY(this, table); - if (!mrn_is_geo_key(&key_info) && key_info.algorithm != HA_KEY_ALG_FULLTEXT) + if (!mrn_is_geo_key(key_info) && key_info->algorithm != HA_KEY_ALG_FULLTEXT) { error = wrap_handler->ha_index_init(share->wrap_key_nr[idx], sorted); } else { @@ -6985,8 +6928,8 @@ int ha_mroonga::wrapper_index_read_map(uchar *buf, const uchar *key, { int error = 0; MRN_DBUG_ENTER_METHOD(); - KEY key_info = table->key_info[active_index]; - if (mrn_is_geo_key(&key_info)) { + KEY *key_info = &(table->key_info[active_index]); + if (mrn_is_geo_key(key_info)) { clear_cursor_geo(); error = generic_geo_open_cursor(key, find_flag); if (!error) { @@ -7019,7 +6962,7 @@ int ha_mroonga::storage_index_read_map(uchar *buf, const uchar *key, int error = 0; uint key_nr = active_index; - KEY key_info = table->key_info[key_nr]; + KEY *key_info = &(table->key_info[key_nr]); int flags = 0; uint size_min = 0, size_max = 0; uchar *key_min = NULL, *key_max = NULL; @@ -7030,7 +6973,7 @@ int ha_mroonga::storage_index_read_map(uchar *buf, const uchar *key, clear_cursor_geo(); clear_empty_value_records(); - bool is_multiple_column_index = KEY_N_KEY_PARTS(&key_info) > 1; + bool is_multiple_column_index = KEY_N_KEY_PARTS(key_info) > 1; if (is_multiple_column_index) { mrn_change_encoding(ctx, NULL); uint key_length = @@ -7039,17 +6982,17 @@ int ha_mroonga::storage_index_read_map(uchar *buf, const uchar *key, ("mroonga: multiple column index: " "search key length=<%u>, " "multiple column index key length=<%u>", - key_length, key_info.key_length)); - if (key_length == key_info.key_length) { + key_length, key_info->key_length)); + if (key_length == key_info->key_length) { if (find_flag == HA_READ_BEFORE_KEY || find_flag == HA_READ_PREFIX_LAST_OR_PREV) { key_max = key_max_entity; - storage_encode_multiple_column_key(&key_info, + storage_encode_multiple_column_key(key_info, key, key_length, key_max, &size_max); } else { key_min = key_min_entity; - storage_encode_multiple_column_key(&key_info, + storage_encode_multiple_column_key(key_info, key, key_length, key_min, &size_min); if (find_flag == HA_READ_KEY_EXACT) { @@ -7060,12 +7003,12 @@ int ha_mroonga::storage_index_read_map(uchar *buf, const uchar *key, } else { flags |= GRN_CURSOR_PREFIX; key_min = key_min_entity; - storage_encode_multiple_column_key(&key_info, + storage_encode_multiple_column_key(key_info, key, key_length, key_min, &size_min); } - } else if (mrn_is_geo_key(&key_info)) { - error = mrn_change_encoding(ctx, key_info.key_part->field->charset()); + } else if (mrn_is_geo_key(key_info)) { + error = mrn_change_encoding(ctx, key_info->key_part->field->charset()); if (error) DBUG_RETURN(error); error = generic_geo_open_cursor(key, find_flag); @@ -7074,8 +7017,7 @@ int ha_mroonga::storage_index_read_map(uchar *buf, const uchar *key, } DBUG_RETURN(error); } else { - KEY_PART_INFO key_part = key_info.key_part[0]; - Field *field = key_part.field; + Field *field = key_info->key_part[0].field; error = mrn_change_encoding(ctx, field->charset()); if (error) DBUG_RETURN(error); @@ -7150,7 +7092,7 @@ int ha_mroonga::storage_index_read_map(uchar *buf, const uchar *key, GRN_EXPR_CREATE_FOR_QUERY(ctx, grn_table, expression, expression_variable); grn_obj *target_column = - grn_columns[key_info.key_part->field->field_index]; + grn_columns[key_info->key_part->field->field_index]; grn_expr_append_const(ctx, expression, target_column, GRN_OP_GET_VALUE, 1); grn_obj empty_value; GRN_TEXT_INIT(&empty_value, 0); @@ -7229,7 +7171,7 @@ int ha_mroonga::storage_index_read_last_map(uchar *buf, const uchar *key, { MRN_DBUG_ENTER_METHOD(); uint key_nr = active_index; - KEY key_info = table->key_info[key_nr]; + KEY *key_info = &(table->key_info[key_nr]); int flags = GRN_CURSOR_DESCENDING, error; uint size_min = 0, size_max = 0; @@ -7238,19 +7180,18 @@ int ha_mroonga::storage_index_read_last_map(uchar *buf, const uchar *key, clear_cursor(); - bool is_multiple_column_index = KEY_N_KEY_PARTS(&key_info) > 1; + bool is_multiple_column_index = KEY_N_KEY_PARTS(key_info) > 1; if (is_multiple_column_index) { mrn_change_encoding(ctx, NULL); flags |= GRN_CURSOR_PREFIX; uint key_length = mrn_calculate_key_len(table, active_index, key, keypart_map); key_min = key_min_entity; - storage_encode_multiple_column_key(&key_info, + storage_encode_multiple_column_key(key_info, key, key_length, key_min, &size_min); } else { - KEY_PART_INFO key_part = key_info.key_part[0]; - Field *field = key_part.field; + Field *field = key_info->key_part[0].field; error = mrn_change_encoding(ctx, field->charset()); if (error) DBUG_RETURN(error); @@ -7308,8 +7249,8 @@ int ha_mroonga::wrapper_index_next(uchar *buf) { int error = 0; MRN_DBUG_ENTER_METHOD(); - KEY key_info = table->key_info[active_index]; - if (mrn_is_geo_key(&key_info)) { + KEY *key_info = &(table->key_info[active_index]); + if (mrn_is_geo_key(key_info)) { error = wrapper_get_next_geo_record(buf); } else { MRN_SET_WRAP_SHARE_KEY(share, table->s); @@ -7351,8 +7292,8 @@ int ha_mroonga::wrapper_index_prev(uchar *buf) { int error = 0; MRN_DBUG_ENTER_METHOD(); - KEY key_info = table->key_info[active_index]; - if (mrn_is_geo_key(&key_info)) { + KEY *key_info = &(table->key_info[active_index]); + if (mrn_is_geo_key(key_info)) { error = wrapper_get_next_geo_record(buf); } else { MRN_SET_WRAP_SHARE_KEY(share, table->s); @@ -7525,8 +7466,8 @@ int ha_mroonga::wrapper_index_next_same(uchar *buf, const uchar *key, { MRN_DBUG_ENTER_METHOD(); int error = 0; - KEY key_info = table->s->key_info[active_index]; - if (mrn_is_geo_key(&key_info)) { + KEY *key_info = &(table->s->key_info[active_index]); + if (mrn_is_geo_key(key_info)) { error = wrapper_get_next_geo_record(buf); } else { MRN_SET_WRAP_SHARE_KEY(share, table->s); @@ -7571,8 +7512,8 @@ int ha_mroonga::wrapper_read_range_first(const key_range *start_key, { int error = 0; MRN_DBUG_ENTER_METHOD(); - KEY key_info = table->key_info[active_index]; - if (mrn_is_geo_key(&key_info)) { + KEY *key_info = &(table->key_info[active_index]); + if (mrn_is_geo_key(key_info)) { clear_cursor_geo(); error = generic_geo_open_cursor(start_key->key, start_key->flag); if (!error) { @@ -7603,11 +7544,11 @@ int ha_mroonga::storage_read_range_first(const key_range *start_key, uchar *key_min = NULL, *key_max = NULL; uchar key_min_entity[MRN_MAX_KEY_SIZE]; uchar key_max_entity[MRN_MAX_KEY_SIZE]; - KEY key_info = table->s->key_info[active_index]; + KEY *key_info = &(table->s->key_info[active_index]); clear_cursor(); - bool is_multiple_column_index = KEY_N_KEY_PARTS(&key_info) > 1; + bool is_multiple_column_index = KEY_N_KEY_PARTS(key_info) > 1; if (is_multiple_column_index) { mrn_change_encoding(ctx, NULL); if (start_key && end_key && @@ -7615,13 +7556,13 @@ int ha_mroonga::storage_read_range_first(const key_range *start_key, memcmp(start_key->key, end_key->key, start_key->length) == 0) { flags |= GRN_CURSOR_PREFIX; key_min = key_min_entity; - storage_encode_multiple_column_key(&key_info, + storage_encode_multiple_column_key(key_info, start_key->key, start_key->length, key_min, &size_min); } else { key_min = key_min_entity; key_max = key_max_entity; - storage_encode_multiple_column_key_range(&key_info, + storage_encode_multiple_column_key_range(key_info, start_key, end_key, key_min, &size_min, key_max, &size_max); @@ -7633,8 +7574,7 @@ int ha_mroonga::storage_read_range_first(const key_range *start_key, } } } else { - KEY_PART_INFO key_part = key_info.key_part[0]; - Field *field = key_part.field; + Field *field = key_info->key_part[0].field; const char *column_name = field->field_name; error = mrn_change_encoding(ctx, field->charset()); if (error) @@ -7742,8 +7682,8 @@ int ha_mroonga::wrapper_read_range_next() { int error = 0; MRN_DBUG_ENTER_METHOD(); - KEY key_info = table->key_info[active_index]; - if (mrn_is_geo_key(&key_info)) { + KEY *key_info = &(table->key_info[active_index]); + if (mrn_is_geo_key(key_info)) { error = wrapper_get_next_geo_record(table->record[0]); DBUG_RETURN(error); } @@ -8082,7 +8022,7 @@ grn_rc ha_mroonga::generic_ft_init_ext_prepare_expression_in_boolean_mode( bool parsed = false; bool done = false; keyword++; - keyword_length++; + keyword_length--; while (!done) { uint consumed_keyword_length = 0; switch (keyword[0]) { @@ -8283,12 +8223,11 @@ FT_INFO *ha_mroonga::generic_ft_init_ext(uint flags, uint key_nr, String *key) check_count_skip(0, 0, true); mrn_change_encoding(ctx, system_charset_info); - grn_operator operation = GRN_OP_AND; + grn_operator operation = GRN_OP_OR; if (!matched_record_keys) { matched_record_keys = grn_table_create(ctx, NULL, 0, NULL, GRN_OBJ_TABLE_HASH_KEY | GRN_OBJ_WITH_SUBREC, grn_table, 0); - operation = GRN_OP_OR; } grn_table_sort_key *sort_keys = NULL; @@ -8317,6 +8256,24 @@ FT_INFO *ha_mroonga::generic_ft_init_ext(uint flags, uint key_nr, String *key) matched_record_keys); grn_table_sort(ctx, matched_record_keys, 0, static_cast(limit), sorted_result, sort_keys, n_sort_keys); + } else if (flags & FT_SORTED) { + grn_table_sort_key score_sort_key; + score_sort_key.key = grn_obj_column(ctx, + matched_record_keys, + MRN_COLUMN_NAME_SCORE, + strlen(MRN_COLUMN_NAME_SCORE)); + score_sort_key.offset = 0; + score_sort_key.flags = GRN_TABLE_SORT_DESC; + if (sorted_result) { + grn_obj_unlink(ctx, sorted_result); + } + sorted_result = grn_table_create(ctx, NULL, + 0, NULL, + GRN_OBJ_TABLE_NO_KEY, NULL, + matched_record_keys); + grn_table_sort(ctx, matched_record_keys, 0, -1, + sorted_result, &score_sort_key, 1); + grn_obj_unlink(ctx, score_sort_key.key); } if (sort_keys) { for (int i = 0; i < n_sort_keys; i++) { @@ -8586,6 +8543,26 @@ ulonglong ha_mroonga::file_size(const char *path) } } +bool ha_mroonga::have_unique_index() +{ + MRN_DBUG_ENTER_METHOD(); + + uint n_keys = table->s->keys; + + for (uint i = 0; i < n_keys; i++) { + if (i == table->s->primary_key) { + continue; + } + + KEY *key_info = &(table->key_info[i]); + if (key_info->flags & HA_NOSAME) { + DBUG_RETURN(true); + } + } + + DBUG_RETURN(false); +} + void ha_mroonga::push_warning_unsupported_spatial_index_search(enum ha_rkey_function flag) { char search_name[MRN_BUFFER_SIZE]; @@ -8712,27 +8689,27 @@ void ha_mroonga::clear_indexes() DBUG_VOID_RETURN; } -int ha_mroonga::alter_share_add(const char *path, TABLE_SHARE *table_share) +int ha_mroonga::add_wrap_hton(const char *path, handlerton *wrap_handlerton) { MRN_DBUG_ENTER_METHOD(); st_mrn_slot_data *slot_data = mrn_get_slot_data(ha_thd(), true); if (!slot_data) DBUG_RETURN(HA_ERR_OUT_OF_MEM); - st_mrn_alter_share *alter_share = - (st_mrn_alter_share *)malloc(sizeof(st_mrn_alter_share)); - if (!alter_share) + st_mrn_wrap_hton *wrap_hton = + (st_mrn_wrap_hton *)malloc(sizeof(st_mrn_wrap_hton)); + if (!wrap_hton) DBUG_RETURN(HA_ERR_OUT_OF_MEM); - alter_share->next = NULL; - strcpy(alter_share->path, path); - alter_share->alter_share = table_share; - if (slot_data->first_alter_share) + wrap_hton->next = NULL; + strcpy(wrap_hton->path, path); + wrap_hton->hton = wrap_handlerton; + if (slot_data->first_wrap_hton) { - st_mrn_alter_share *tmp_alter_share = slot_data->first_alter_share; - while (tmp_alter_share->next) - tmp_alter_share = tmp_alter_share->next; - tmp_alter_share->next = alter_share; + st_mrn_wrap_hton *tmp_wrap_hton = slot_data->first_wrap_hton; + while (tmp_wrap_hton->next) + tmp_wrap_hton = tmp_wrap_hton->next; + tmp_wrap_hton->next = wrap_hton; } else { - slot_data->first_alter_share = alter_share; + slot_data->first_wrap_hton = wrap_hton; } DBUG_RETURN(0); } @@ -8848,6 +8825,320 @@ int ha_mroonga::drop_index(MRN_SHARE *target_share, uint key_index) DBUG_RETURN(error); } +int ha_mroonga::drop_indexes_normal(const char *table_name, grn_obj *table) +{ + MRN_DBUG_ENTER_METHOD(); + + int error = 0; + + grn_hash *columns_raw = grn_hash_create(ctx, NULL, sizeof(grn_id), 0, + GRN_OBJ_TABLE_HASH_KEY); + mrn::SmartGrnObj columns(ctx, reinterpret_cast(columns_raw)); + if (!columns.get()) { + char error_message[MRN_MESSAGE_BUFFER_SIZE]; + snprintf(error_message, MRN_MESSAGE_BUFFER_SIZE, + "failed to allocate columns buffer: <%s>: <%s>", + table_name, ctx->errbuf); + error = HA_ERR_OUT_OF_MEM; + my_message(ER_ERROR_ON_WRITE, error_message, MYF(0)); + GRN_LOG(ctx, GRN_LOG_ERROR, "%s", error_message); + DBUG_RETURN(error); + } + + grn_table_columns(ctx, table, "", 0, columns.get()); + grn_table_cursor *cursor = grn_table_cursor_open(ctx, + columns.get(), + NULL, 0, + NULL, 0, + 0, -1, + 0); + if (!cursor) { + char error_message[MRN_MESSAGE_BUFFER_SIZE]; + snprintf(error_message, MRN_MESSAGE_BUFFER_SIZE, + "failed to allocate columns cursor: <%s>: <%s>", + table_name, ctx->errbuf); + error = HA_ERR_OUT_OF_MEM; + my_message(ER_ERROR_ON_WRITE, error_message, MYF(0)); + GRN_LOG(ctx, GRN_LOG_ERROR, "%s", error_message); + DBUG_RETURN(error); + } + + while (grn_table_cursor_next(ctx, cursor) != GRN_ID_NIL) { + void *key; + grn_table_cursor_get_key(ctx, cursor, &key); + grn_id *id = reinterpret_cast(key); + mrn::SmartGrnObj column(ctx, grn_ctx_at(ctx, *id)); + if (!column.get()) { + continue; + } + + grn_operator index_operators[] = { + GRN_OP_EQUAL, + GRN_OP_MATCH, + GRN_OP_LESS, + GRN_OP_REGEXP + }; + size_t n_index_operators = sizeof(index_operators) / sizeof(grn_operator); + for (size_t i = 0; i < n_index_operators; i++) { + grn_index_datum index_datum; + while (grn_column_find_index_data(ctx, + column.get(), + index_operators[i], + &index_datum, + 1) > 0) { + grn_id index_table_id = index_datum.index->header.domain; + mrn::SmartGrnObj index_table(ctx, grn_ctx_at(ctx, index_table_id)); + char index_table_name[GRN_TABLE_MAX_KEY_SIZE]; + int index_table_name_length; + index_table_name_length = grn_obj_name(ctx, index_table.get(), + index_table_name, + GRN_TABLE_MAX_KEY_SIZE); + if (mrn::IndexTableName::is_custom_name(table_name, + strlen(table_name), + index_table_name, + index_table_name_length)) { + char index_column_name[GRN_TABLE_MAX_KEY_SIZE]; + int index_column_name_length; + index_column_name_length = grn_obj_name(ctx, + index_datum.index, + index_column_name, + GRN_TABLE_MAX_KEY_SIZE); + grn_rc rc = grn_obj_remove(ctx, index_datum.index); + if (rc != GRN_SUCCESS) { + char error_message[MRN_MESSAGE_BUFFER_SIZE]; + snprintf(error_message, MRN_MESSAGE_BUFFER_SIZE, + "failed to drop index column: <%.*s>: <%s>", + index_column_name_length, index_column_name, + ctx->errbuf); + error = ER_ERROR_ON_WRITE; + my_message(error, error_message, MYF(0)); + GRN_LOG(ctx, GRN_LOG_ERROR, "%s", error_message); + } + } else { + grn_rc rc = grn_obj_remove(ctx, index_table.get()); + if (rc == GRN_SUCCESS) { + index_table.release(); + } else { + char error_message[MRN_MESSAGE_BUFFER_SIZE]; + snprintf(error_message, MRN_MESSAGE_BUFFER_SIZE, + "failed to drop index table: <%.*s>: <%s>", + index_table_name_length, index_table_name, + ctx->errbuf); + error = ER_ERROR_ON_WRITE; + my_message(error, error_message, MYF(0)); + GRN_LOG(ctx, GRN_LOG_ERROR, "%s", error_message); + } + } + + if (error != 0) { + break; + } + } + + if (error != 0) { + break; + } + } + + if (error != 0) { + break; + } + } + + grn_table_cursor_close(ctx, cursor); + + DBUG_RETURN(error); +} + +int ha_mroonga::drop_indexes_multiple(const char *table_name, grn_obj *table) +{ + MRN_DBUG_ENTER_METHOD(); + + int error = 0; + + char index_table_name_prefix[GRN_TABLE_MAX_KEY_SIZE]; + snprintf(index_table_name_prefix, GRN_TABLE_MAX_KEY_SIZE, + "%s%s", table_name, mrn::IndexTableName::SEPARATOR); + grn_table_cursor *cursor = + grn_table_cursor_open(ctx, + grn_ctx_db(ctx), + index_table_name_prefix, + strlen(index_table_name_prefix), + NULL, 0, + 0, -1, + GRN_CURSOR_PREFIX); + if (!cursor) { + char error_message[MRN_MESSAGE_BUFFER_SIZE]; + snprintf(error_message, MRN_MESSAGE_BUFFER_SIZE, + "failed to allocate index tables cursor: <%s>: <%s>", + table_name, ctx->errbuf); + error = HA_ERR_OUT_OF_MEM; + my_message(ER_ERROR_ON_WRITE, error_message, MYF(0)); + GRN_LOG(ctx, GRN_LOG_ERROR, "%s", error_message); + DBUG_RETURN(error); + } + + grn_id table_id = grn_obj_id(ctx, table); + grn_id id; + while ((id = grn_table_cursor_next(ctx, cursor)) != GRN_ID_NIL) { + mrn::SmartGrnObj object(ctx, grn_ctx_at(ctx, id)); + if (!object.get()) { + continue; + } + if (!grn_obj_is_table(ctx, object.get())) { + continue; + } + + char multiple_column_index_table_name[GRN_TABLE_MAX_KEY_SIZE]; + int multiple_column_index_table_name_length; + multiple_column_index_table_name_length = + grn_obj_name(ctx, + object.get(), + multiple_column_index_table_name, + GRN_TABLE_MAX_KEY_SIZE); + + char multiple_column_index_name[GRN_TABLE_MAX_KEY_SIZE]; + snprintf(multiple_column_index_name, GRN_TABLE_MAX_KEY_SIZE, + "%.*s.%s", + multiple_column_index_table_name_length, + multiple_column_index_table_name, + INDEX_COLUMN_NAME); + mrn::SmartGrnObj index_column(ctx, multiple_column_index_name); + if (!index_column.get()) { + continue; + } + + if (grn_obj_get_range(ctx, index_column.get()) != table_id) { + continue; + } + + grn_rc rc = grn_obj_remove(ctx, object.get()); + if (rc == GRN_SUCCESS) { + object.release(); + index_column.release(); + } else { + char error_message[MRN_MESSAGE_BUFFER_SIZE]; + snprintf(error_message, MRN_MESSAGE_BUFFER_SIZE, + "failed to drop multiple column index table: <%.*s>: <%s>", + multiple_column_index_table_name_length, + multiple_column_index_table_name, + ctx->errbuf); + error = ER_ERROR_ON_WRITE; + my_message(error, error_message, MYF(0)); + GRN_LOG(ctx, GRN_LOG_ERROR, "%s", error_message); + break; + } + } + + grn_table_cursor_close(ctx, cursor); + + DBUG_RETURN(error); +} + +int ha_mroonga::drop_indexes(const char *table_name) +{ + MRN_DBUG_ENTER_METHOD(); + int error = 0; + + mrn::SmartGrnObj table(ctx, table_name); + if (!table.get()) { + DBUG_RETURN(0); + } + + error = drop_indexes_normal(table_name, table.get()); + if (error == 0) { + error = drop_indexes_multiple(table_name, table.get()); + } + + DBUG_RETURN(error); +} + +bool ha_mroonga::find_column_flags(Field *field, MRN_SHARE *mrn_share, int i, + grn_obj_flags *column_flags) +{ + MRN_DBUG_ENTER_METHOD(); + bool found = false; + +#ifdef MRN_SUPPORT_CUSTOM_OPTIONS + { + const char *names = field->option_struct->flags; + if (names) { + found = mrn_parse_grn_column_create_flags(ha_thd(), + ctx, + names, + strlen(names), + column_flags); + DBUG_RETURN(found); + } + } +#endif + + if (mrn_share->col_flags[i]) { + found = mrn_parse_grn_column_create_flags(ha_thd(), + ctx, + mrn_share->col_flags[i], + mrn_share->col_flags_length[i], + column_flags); + DBUG_RETURN(found); + } + + DBUG_RETURN(found); +} + +grn_obj *ha_mroonga::find_column_type(Field *field, MRN_SHARE *mrn_share, int i, + int error_code) +{ + MRN_DBUG_ENTER_METHOD(); + + const char *grn_type_name = NULL; +#ifdef MRN_SUPPORT_CUSTOM_OPTIONS + grn_type_name = field->option_struct->groonga_type; +#endif + if (!grn_type_name) { + grn_type_name = mrn_share->col_type[i]; + } + + grn_obj *type = NULL; + if (grn_type_name) { + type = grn_ctx_get(ctx, grn_type_name, -1); + if (!type) { + char error_message[MRN_BUFFER_SIZE]; + snprintf(error_message, MRN_BUFFER_SIZE, + "unknown custom Groonga type name for <%s> column: <%s>", + field->field_name, grn_type_name); + GRN_LOG(ctx, GRN_LOG_ERROR, "%s", error_message); + my_message(error_code, error_message, MYF(0)); + + DBUG_RETURN(NULL); + } + } else { + grn_builtin_type grn_type_id = mrn_grn_type_from_field(ctx, field, false); + type = grn_ctx_at(ctx, grn_type_id); + } + + DBUG_RETURN(type); +} + +grn_obj *ha_mroonga::find_tokenizer(KEY *key, MRN_SHARE *mrn_share, int i) +{ + MRN_DBUG_ENTER_METHOD(); + grn_obj *tokenizer; + const char *tokenizer_name = NULL; + uint tokenizer_name_length = 0; +#ifdef MRN_SUPPORT_CUSTOM_OPTIONS + if (key->option_struct->tokenizer) { + tokenizer_name = key->option_struct->tokenizer; + tokenizer_name_length = strlen(tokenizer_name); + } +#endif + if (!tokenizer_name) { + tokenizer_name = mrn_share->key_tokenizer[i]; + tokenizer_name_length = mrn_share->key_tokenizer_length[i]; + } + tokenizer = find_tokenizer(tokenizer_name, tokenizer_name_length); + DBUG_RETURN(tokenizer); +} + grn_obj *ha_mroonga::find_tokenizer(const char *name, int name_length) { MRN_DBUG_ENTER_METHOD(); @@ -8862,65 +9153,101 @@ grn_obj *ha_mroonga::find_tokenizer(const char *name, int name_length) if (!tokenizer) { char message[MRN_BUFFER_SIZE]; sprintf(message, - "specified fulltext parser <%.*s> doesn't exist. " - "default fulltext parser <%s> is used instead.", + "specified tokenizer for fulltext index <%.*s> doesn't exist. " + "The default tokenizer for fulltext index <%s> is used instead.", name_length, name, - MRN_PARSER_DEFAULT); + MRN_DEFAULT_TOKENIZER); push_warning(ha_thd(), MRN_SEVERITY_WARNING, ER_UNSUPPORTED_EXTENSION, message); tokenizer = grn_ctx_get(ctx, - MRN_PARSER_DEFAULT, - strlen(MRN_PARSER_DEFAULT)); + MRN_DEFAULT_TOKENIZER, + strlen(MRN_DEFAULT_TOKENIZER)); } if (!tokenizer) { push_warning(ha_thd(), MRN_SEVERITY_WARNING, ER_UNSUPPORTED_EXTENSION, - "couldn't find fulltext parser. " - "Bigram fulltext parser is used instead."); + "couldn't find tokenizer for fulltext index. " + "Bigram tokenizer is used instead."); tokenizer = grn_ctx_at(ctx, GRN_DB_BIGRAM); } DBUG_RETURN(tokenizer); } -grn_obj *ha_mroonga::find_normalizer(KEY *key_info) +grn_obj *ha_mroonga::find_normalizer(KEY *key) { MRN_DBUG_ENTER_METHOD(); - grn_obj *normalizer = NULL; - bool use_normalizer = true; -#if MYSQL_VERSION_ID >= 50500 - if (key_info->comment.length > 0) { - mrn::ParametersParser parser(key_info->comment.str, - key_info->comment.length); - parser.parse(); - const char *normalizer_name = parser["normalizer"]; - if (normalizer_name) { - if (strcmp(normalizer_name, "none") == 0) { - use_normalizer = false; - } else { - normalizer = grn_ctx_get(ctx, normalizer_name, -1); - } - } + +#ifdef MRN_SUPPORT_CUSTOM_OPTIONS + if (key->option_struct->normalizer) { + grn_obj *normalizer = find_normalizer(key, + key->option_struct->normalizer); + DBUG_RETURN(normalizer); } #endif - if (use_normalizer && !normalizer) { - Field *field = key_info->key_part[0].field; - mrn::FieldNormalizer field_normalizer(ctx, ha_thd(), field); - normalizer = field_normalizer.find_grn_normalizer(); + + if (key->comment.length > 0) { + mrn::ParametersParser parser(key->comment.str, + key->comment.length); + parser.parse(); + grn_obj *normalizer = find_normalizer(key, parser["normalizer"]); + DBUG_RETURN(normalizer); } + + grn_obj *normalizer = find_normalizer(key, NULL); DBUG_RETURN(normalizer); } -bool ha_mroonga::find_index_column_flags(KEY *key_info, grn_obj_flags *index_column_flags) +grn_obj *ha_mroonga::find_normalizer(KEY *key, const char *name) +{ + MRN_DBUG_ENTER_METHOD(); + + grn_obj *normalizer = NULL; + bool use_normalizer = true; + if (name) { + if (strcmp(name, "none") == 0) { + use_normalizer = false; + } else { + normalizer = grn_ctx_get(ctx, name, -1); + } + } + if (use_normalizer && !normalizer) { + Field *field = key->key_part[0].field; + mrn::FieldNormalizer field_normalizer(ctx, ha_thd(), field); + normalizer = field_normalizer.find_grn_normalizer(); + } + + DBUG_RETURN(normalizer); +} + +bool ha_mroonga::find_index_column_flags(KEY *key, grn_obj_flags *index_column_flags) { MRN_DBUG_ENTER_METHOD(); bool found = false; -#if MYSQL_VERSION_ID >= 50500 - if (key_info->comment.length > 0) { - mrn::ParametersParser parser(key_info->comment.str, - key_info->comment.length); + +#ifdef MRN_SUPPORT_CUSTOM_OPTIONS + { + const char *names = key->option_struct->flags; + if (names) { + found = mrn_parse_grn_index_column_flags(ha_thd(), + ctx, + names, + strlen(names), + index_column_flags); + DBUG_RETURN(found); + } + } +#endif + + if (key->comment.length > 0) { + mrn::ParametersParser parser(key->comment.str, + key->comment.length); parser.parse(); - const char *names = parser["index_flags"]; + const char *names = parser["flags"]; + if (!names) { + // Deprecated. It's for backward compatibility. + names = parser["index_flags"]; + } if (names) { found = mrn_parse_grn_index_column_flags(ha_thd(), ctx, @@ -8929,25 +9256,34 @@ bool ha_mroonga::find_index_column_flags(KEY *key_info, grn_obj_flags *index_col index_column_flags); } } -#endif + DBUG_RETURN(found); } -bool ha_mroonga::find_token_filters(KEY *key_info, grn_obj *token_filters) +bool ha_mroonga::find_token_filters(KEY *key, grn_obj *token_filters) { MRN_DBUG_ENTER_METHOD(); bool found = false; -#if MYSQL_VERSION_ID >= 50500 - if (key_info->comment.length > 0) { - mrn::ParametersParser parser(key_info->comment.str, - key_info->comment.length); + +#ifdef MRN_SUPPORT_CUSTOM_OPTIONS + if (key->option_struct->token_filters) { + found = find_token_filters_fill(token_filters, + key->option_struct->token_filters, + strlen(key->option_struct->token_filters)); + DBUG_RETURN(found); + } +#endif + + if (key->comment.length > 0) { + mrn::ParametersParser parser(key->comment.str, + key->comment.length); parser.parse(); const char *names = parser["token_filters"]; if (names) { found = find_token_filters_fill(token_filters, names, strlen(names)); } } -#endif + DBUG_RETURN(found); } @@ -9356,8 +9692,8 @@ void ha_mroonga::check_count_skip(key_part_map start_key_part_map, } else { DBUG_PRINT("info", ("mroonga: count skip: without fulltext")); uint key_nr = active_index; - KEY key_info = table->key_info[key_nr]; - KEY_PART_INFO *key_part = key_info.key_part; + KEY *key_info = &(table->key_info[key_nr]); + KEY_PART_INFO *key_part = key_info->key_part; for (where = MRN_SELECT_LEX_GET_WHERE_COND(select_lex); where; where = where->next) { @@ -9386,17 +9722,17 @@ void ha_mroonga::check_count_skip(key_part_map start_key_part_map, if (field->table != table) break; uint j; - for (j = 0; j < KEY_N_KEY_PARTS(&key_info); j++) { + for (j = 0; j < KEY_N_KEY_PARTS(key_info); j++) { if (key_part[j].field == field) { if (!(start_key_part_map >> j) && !(end_key_part_map >> j)) - j = KEY_N_KEY_PARTS(&key_info); + j = KEY_N_KEY_PARTS(key_info); else i++; break; } } - if (j >= KEY_N_KEY_PARTS(&key_info)) + if (j >= KEY_N_KEY_PARTS(key_info)) break; } if (i >= select_lex->select_n_where_fields) @@ -9864,8 +10200,12 @@ int ha_mroonga::generic_store_bulk_datetime(Field *field, grn_obj *buf) long long int time = time_converter.mysql_time_to_grn_time(&mysql_time, &truncated); if (truncated) { + if (MRN_ABORT_ON_WARNING(ha_thd())) { + error = MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()); + } field->set_warning(MRN_SEVERITY_WARNING, - WARN_DATA_TRUNCATED, 1); + MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()), + 1); } grn_obj_reinit(ctx, buf, GRN_DB_TIME, 0); GRN_TIME_SET(ctx, buf, time); @@ -9896,8 +10236,12 @@ int ha_mroonga::generic_store_bulk_year(Field *field, grn_obj *buf) mrn::TimeConverter time_converter; long long int time = time_converter.tm_to_grn_time(&date, usec, &truncated); if (truncated) { + if (MRN_ABORT_ON_WARNING(ha_thd())) { + error = MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()); + } field->set_warning(MRN_SEVERITY_WARNING, - WARN_DATA_TRUNCATED, 1); + MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()), + 1); } grn_obj_reinit(ctx, buf, GRN_DB_TIME, 0); GRN_TIME_SET(ctx, buf, time); @@ -9917,8 +10261,12 @@ int ha_mroonga::generic_store_bulk_datetime2(Field *field, grn_obj *buf) long long int time = time_converter.mysql_time_to_grn_time(&mysql_time, &truncated); if (truncated) { + if (MRN_ABORT_ON_WARNING(ha_thd())) { + error = MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()); + } field->set_warning(MRN_SEVERITY_WARNING, - WARN_DATA_TRUNCATED, 1); + MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()), + 1); } grn_obj_reinit(ctx, buf, GRN_DB_TIME, 0); GRN_TIME_SET(ctx, buf, time); @@ -9938,8 +10286,12 @@ int ha_mroonga::generic_store_bulk_time2(Field *field, grn_obj *buf) long long int time = time_converter.mysql_time_to_grn_time(&mysql_time, &truncated); if (truncated) { + if (MRN_ABORT_ON_WARNING(ha_thd())) { + error = MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()); + } field->set_warning(MRN_SEVERITY_WARNING, - WARN_DATA_TRUNCATED, 1); + MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()), + 1); } grn_obj_reinit(ctx, buf, GRN_DB_TIME, 0); GRN_TIME_SET(ctx, buf, time); @@ -9959,8 +10311,12 @@ int ha_mroonga::generic_store_bulk_new_date(Field *field, grn_obj *buf) long long int time = time_converter.mysql_time_to_grn_time(&mysql_date, &truncated); if (truncated) { + if (MRN_ABORT_ON_WARNING(ha_thd())) { + error = MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()); + } field->set_warning(MRN_SEVERITY_WARNING, - WARN_DATA_TRUNCATED, 1); + MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()), + 1); } grn_obj_reinit(ctx, buf, GRN_DB_TIME, 0); GRN_TIME_SET(ctx, buf, time); @@ -10628,8 +10984,8 @@ void ha_mroonga::storage_store_fields(uchar *buf, grn_id record_id) const char *column_name = field->field_name; if (ignoring_no_key_columns) { - KEY key_info = table->s->key_info[active_index]; - if (strcmp(key_info.key_part[0].field->field_name, column_name)) { + KEY *key_info = &(table->s->key_info[active_index]); + if (strcmp(key_info->key_part[0].field->field_name, column_name)) { continue; } } @@ -10831,8 +11187,12 @@ int ha_mroonga::storage_encode_key_timestamp(Field *field, const uchar *key, mrn::TimeConverter time_converter; time = time_converter.mysql_time_to_grn_time(&mysql_time, &truncated); if (truncated) { + if (MRN_ABORT_ON_WARNING(ha_thd())) { + error = MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()); + } field->set_warning(MRN_SEVERITY_WARNING, - WARN_DATA_TRUNCATED, 1); + MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()), + 1); } memcpy(buf, &time, 8); *size = 8; @@ -10878,8 +11238,12 @@ int ha_mroonga::storage_encode_key_time(Field *field, const uchar *key, mrn::TimeConverter time_converter; time = time_converter.mysql_time_to_grn_time(&mysql_time, &truncated); if (truncated) { + if (MRN_ABORT_ON_WARNING(ha_thd())) { + error = MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()); + } field->set_warning(MRN_SEVERITY_WARNING, - WARN_DATA_TRUNCATED, 1); + MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()), + 1); } #else int mysql_time = (int)sint3korr(key); @@ -10913,8 +11277,12 @@ int ha_mroonga::storage_encode_key_year(Field *field, const uchar *key, long long int time = time_converter.tm_to_grn_time(&datetime, usec, &truncated); if (truncated) { + if (MRN_ABORT_ON_WARNING(ha_thd())) { + error = MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()); + } field->set_warning(MRN_SEVERITY_WARNING, - WARN_DATA_TRUNCATED, 1); + MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()), + 1); } memcpy(buf, &time, 8); *size = 8; @@ -10962,8 +11330,12 @@ int ha_mroonga::storage_encode_key_datetime(Field *field, const uchar *key, time = time_converter.tm_to_grn_time(&date, usec, &truncated); } if (truncated) { + if (MRN_ABORT_ON_WARNING(ha_thd())) { + error = MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()); + } field->set_warning(MRN_SEVERITY_WARNING, - WARN_DATA_TRUNCATED, 1); + MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()), + 1); } memcpy(buf, &time, 8); *size = 8; @@ -10988,8 +11360,12 @@ int ha_mroonga::storage_encode_key_timestamp2(Field *field, const uchar *key, long long int grn_time = time_converter.mysql_time_to_grn_time(&mysql_time, &truncated); if (truncated) { + if (MRN_ABORT_ON_WARNING(ha_thd())) { + error = MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()); + } field->set_warning(MRN_SEVERITY_WARNING, - WARN_DATA_TRUNCATED, 1); + MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()), + 1); } memcpy(buf, &grn_time, 8); *size = 8; @@ -11015,8 +11391,12 @@ int ha_mroonga::storage_encode_key_datetime2(Field *field, const uchar *key, long long int grn_time = time_converter.mysql_time_to_grn_time(&mysql_time, &truncated); if (truncated) { + if (MRN_ABORT_ON_WARNING(ha_thd())) { + error = MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()); + } field->set_warning(MRN_SEVERITY_WARNING, - WARN_DATA_TRUNCATED, 1); + MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()), + 1); } memcpy(buf, &grn_time, 8); *size = 8; @@ -11042,8 +11422,12 @@ int ha_mroonga::storage_encode_key_time2(Field *field, const uchar *key, long long int grn_time = time_converter.mysql_time_to_grn_time(&mysql_time, &truncated); if (truncated) { + if (MRN_ABORT_ON_WARNING(ha_thd())) { + error = MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()); + } field->set_warning(MRN_SEVERITY_WARNING, - WARN_DATA_TRUNCATED, 1); + MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()), + 1); } memcpy(buf, &grn_time, 8); *size = 8; @@ -11212,8 +11596,12 @@ int ha_mroonga::storage_encode_key(Field *field, const uchar *key, long long int time = time_converter.tm_to_grn_time(&date, usec, &truncated); if (truncated) { + if (MRN_ABORT_ON_WARNING(ha_thd())) { + error = MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()); + } field->set_warning(MRN_SEVERITY_WARNING, - WARN_DATA_TRUNCATED, 1); + MRN_ERROR_CODE_DATA_TRUNCATE(ha_thd()), + 1); } memcpy(buf, &time, 8); *size = 8; @@ -11381,12 +11769,11 @@ int ha_mroonga::reset() replacing_ = false; written_by_row_based_binlog = 0; mrn_lock_type = F_UNLCK; - mrn_clear_alter_share(thd); + mrn_clear_slot_data(thd); current_ft_item = NULL; DBUG_RETURN(error); } -#ifdef MRN_HANDLER_CLONE_NEED_NAME handler *ha_mroonga::wrapper_clone(const char *name, MEM_ROOT *mem_root) { handler *cloned_handler; @@ -11426,47 +11813,6 @@ handler *ha_mroonga::clone(const char *name, MEM_ROOT *mem_root) } DBUG_RETURN(cloned_handler); } -#else -handler *ha_mroonga::wrapper_clone(MEM_ROOT *mem_root) -{ - handler *cloned_handler; - MRN_DBUG_ENTER_METHOD(); - if (!(cloned_handler = get_new_handler(table->s, mem_root, - table->s->db_type()))) - DBUG_RETURN(NULL); - ((ha_mroonga *) cloned_handler)->is_clone = true; - ((ha_mroonga *) cloned_handler)->parent_for_clone = this; - ((ha_mroonga *) cloned_handler)->mem_root_for_clone = mem_root; - if (cloned_handler->ha_open(table, table->s->normalized_path.str, - table->db_stat, HA_OPEN_IGNORE_IF_LOCKED)) - { - delete cloned_handler; - DBUG_RETURN(NULL); - } - DBUG_RETURN(cloned_handler); -} - -handler *ha_mroonga::storage_clone(MEM_ROOT *mem_root) -{ - MRN_DBUG_ENTER_METHOD(); - handler *cloned_handler; - cloned_handler = handler::clone(mem_root); - DBUG_RETURN(cloned_handler); -} - -handler *ha_mroonga::clone(MEM_ROOT *mem_root) -{ - MRN_DBUG_ENTER_METHOD(); - handler *cloned_handler; - if (share->wrapper_mode) - { - cloned_handler = wrapper_clone(mem_root); - } else { - cloned_handler = storage_clone(mem_root); - } - DBUG_RETURN(cloned_handler); -} -#endif uint8 ha_mroonga::wrapper_table_cache_type() { @@ -11511,8 +11857,8 @@ ha_rows ha_mroonga::wrapper_multi_range_read_info_const(uint keyno, { MRN_DBUG_ENTER_METHOD(); ha_rows rows; - KEY key_info = table->key_info[keyno]; - if (mrn_is_geo_key(&key_info)) { + KEY *key_info = &(table->key_info[keyno]); + if (mrn_is_geo_key(key_info)) { rows = handler::multi_range_read_info_const(keyno, seq, seq_init_param, n_ranges, bufsz, flags, cost); DBUG_RETURN(rows); @@ -11577,8 +11923,8 @@ ha_rows ha_mroonga::wrapper_multi_range_read_info(uint keyno, uint n_ranges, { MRN_DBUG_ENTER_METHOD(); ha_rows rows; - KEY key_info = table->key_info[keyno]; - if (mrn_is_geo_key(&key_info)) { + KEY *key_info = &(table->key_info[keyno]); + if (mrn_is_geo_key(key_info)) { rows = handler::multi_range_read_info(keyno, n_ranges, keys, #ifdef MRN_HANDLER_HAVE_MULTI_RANGE_READ_INFO_KEY_PARTS key_parts, @@ -11651,8 +11997,8 @@ int ha_mroonga::wrapper_multi_range_read_init(RANGE_SEQ_IF *seq, { MRN_DBUG_ENTER_METHOD(); int error = 0; - KEY key_info = table->key_info[active_index]; - if (mrn_is_geo_key(&key_info)) { + KEY *key_info = &(table->key_info[active_index]); + if (mrn_is_geo_key(key_info)) { error = handler::multi_range_read_init(seq, seq_init_param, n_ranges, mode, buf); DBUG_RETURN(error); @@ -11700,8 +12046,8 @@ int ha_mroonga::wrapper_multi_range_read_next(range_id_t *range_info) { MRN_DBUG_ENTER_METHOD(); int error = 0; - KEY key_info = table->key_info[active_index]; - if (mrn_is_geo_key(&key_info)) { + KEY *key_info = &(table->key_info[active_index]); + if (mrn_is_geo_key(key_info)) { error = handler::multi_range_read_next(range_info); DBUG_RETURN(error); } @@ -11743,8 +12089,8 @@ int ha_mroonga::wrapper_read_multi_range_first(KEY_MULTI_RANGE **found_range_p, { int error = 0; MRN_DBUG_ENTER_METHOD(); - KEY key_info = table->key_info[active_index]; - if (mrn_is_geo_key(&key_info)) { + KEY *key_info = &(table->key_info[active_index]); + if (mrn_is_geo_key(key_info)) { error = handler::read_multi_range_first(found_range_p, ranges, range_count, sorted, buffer); DBUG_RETURN(error); @@ -11795,8 +12141,8 @@ int ha_mroonga::wrapper_read_multi_range_next(KEY_MULTI_RANGE **found_range_p) { int error = 0; MRN_DBUG_ENTER_METHOD(); - KEY key_info = table->key_info[active_index]; - if (mrn_is_geo_key(&key_info)) { + KEY *key_info = &(table->key_info[active_index]); + if (mrn_is_geo_key(key_info)) { error = handler::read_multi_range_next(found_range_p); DBUG_RETURN(error); } @@ -11970,9 +12316,9 @@ int ha_mroonga::wrapper_delete_all_rows() uint i; uint n_keys = table->s->keys; for (i = 0; i < n_keys; i++) { - KEY key_info = table->key_info[i]; + KEY *key_info = &(table->key_info[i]); - if (!(wrapper_is_target_index(&key_info))) { + if (!(wrapper_is_target_index(key_info))) { continue; } @@ -12016,7 +12362,6 @@ int ha_mroonga::delete_all_rows() DBUG_RETURN(error); } -#ifdef MRN_HANDLER_HAVE_TRUNCATE int ha_mroonga::wrapper_truncate() { int error = 0; @@ -12033,7 +12378,6 @@ int ha_mroonga::wrapper_truncate() DBUG_RETURN(error); } -#endif int ha_mroonga::wrapper_truncate_index() { @@ -12055,9 +12399,9 @@ int ha_mroonga::wrapper_truncate_index() uint i; uint n_keys = table->s->keys; for (i = 0; i < n_keys; i++) { - KEY key_info = table->key_info[i]; + KEY *key_info = &(table->key_info[i]); - if (!(wrapper_is_target_index(&key_info))) { + if (!(wrapper_is_target_index(key_info))) { continue; } @@ -12130,11 +12474,11 @@ int ha_mroonga::storage_truncate_index() continue; } - KEY key_info = table->key_info[i]; + KEY *key_info = &(table->key_info[i]); if ( - !(key_info.flags & HA_NOSAME) && - (KEY_N_KEY_PARTS(&key_info) == 1 || (key_info.flags & HA_FULLTEXT)) + !(key_info->flags & HA_NOSAME) && + (KEY_N_KEY_PARTS(key_info) == 1 || (key_info->flags & HA_FULLTEXT)) ) { continue; } @@ -12155,7 +12499,6 @@ err: DBUG_RETURN(error); } -#ifdef MRN_HANDLER_HAVE_TRUNCATE int ha_mroonga::truncate() { MRN_DBUG_ENTER_METHOD(); @@ -12168,7 +12511,6 @@ int ha_mroonga::truncate() } DBUG_RETURN(error); } -#endif double ha_mroonga::wrapper_scan_time() { @@ -12207,8 +12549,8 @@ double ha_mroonga::wrapper_read_time(uint index, uint ranges, ha_rows rows) double res; MRN_DBUG_ENTER_METHOD(); if (index < MAX_KEY) { - KEY key_info = table->key_info[index]; - if (mrn_is_geo_key(&key_info)) { + KEY *key_info = &(table->key_info[index]); + if (mrn_is_geo_key(key_info)) { res = handler::read_time(index, ranges, rows); DBUG_RETURN(res); } @@ -12387,16 +12729,14 @@ int ha_mroonga::wrapper_rename_table(const char *from, const char *to, int error = 0; handler *hnd; MRN_DBUG_ENTER_METHOD(); - MRN_SET_WRAP_SHARE_KEY(tmp_share, tmp_share->table_share); - if (!(hnd = - tmp_share->hton->create(tmp_share->hton, tmp_share->table_share, - current_thd->mem_root))) + + hnd = get_new_handler(tmp_share->table_share, + current_thd->mem_root, + tmp_share->hton); + if (!hnd) { - MRN_SET_BASE_SHARE_KEY(tmp_share, tmp_share->table_share); DBUG_RETURN(HA_ERR_OUT_OF_MEM); } - hnd->init(); - MRN_SET_BASE_SHARE_KEY(tmp_share, tmp_share->table_share); if ((error = hnd->ha_rename_table(from, to))) { @@ -12610,17 +12950,11 @@ int ha_mroonga::rename_table(const char *from, const char *to) if (strcmp(from_mapper.db_name(), to_mapper.db_name())) DBUG_RETURN(HA_ERR_WRONG_COMMAND); -#ifdef MRN_TABLE_LIST_INIT_REQUIRE_ALIAS table_list.init_one_table(from_mapper.db_name(), strlen(from_mapper.db_name()), from_mapper.mysql_table_name(), strlen(from_mapper.mysql_table_name()), from_mapper.mysql_table_name(), TL_WRITE); -#else - table_list.init_one_table(from_mapper.db_name(), - from_mapper.mysql_table_name(), - TL_WRITE); -#endif mrn_open_mutex_lock(NULL); tmp_table_share = mrn_create_tmp_table_share(&table_list, from, &error); mrn_open_mutex_unlock(NULL); @@ -12650,21 +12984,20 @@ int ha_mroonga::rename_table(const char *from, const char *to) to_mapper.table_name()); } + if (!error && to_mapper.table_name()[0] == '#') { + error = add_wrap_hton(to, tmp_share->hton); + } else if (error && from_mapper.table_name()[0] == '#') { + add_wrap_hton(from, tmp_share->hton); + } if (!error) { mrn_free_long_term_share(tmp_share->long_term_share); tmp_share->long_term_share = NULL; } mrn_free_share(tmp_share); - if (!error && to_mapper.table_name()[0] == '#') { - if ((error = alter_share_add(to, tmp_table_share))) - DBUG_RETURN(error); - } else if (error && from_mapper.table_name()[0] == '#') { - alter_share_add(from, tmp_table_share); - } else { - mrn_open_mutex_lock(NULL); - mrn_free_tmp_table_share(tmp_table_share); - mrn_open_mutex_unlock(NULL); - } + mrn_open_mutex_lock(NULL); + mrn_free_tmp_table_share(tmp_table_share); + mrn_open_mutex_unlock(NULL); + DBUG_RETURN(error); } @@ -13669,6 +14002,7 @@ enum_alter_inplace_result ha_mroonga::wrapper_check_if_supported_inplace_alter( } memcpy(wrap_altered_table, altered_table, sizeof(TABLE)); memcpy(wrap_altered_table_share, altered_table->s, sizeof(TABLE_SHARE)); + mrn_init_sql_alloc(ha_thd(), &(wrap_altered_table_share->mem_root)); n_keys = ha_alter_info->index_drop_count; for (i = 0; i < n_keys; ++i) { @@ -13785,6 +14119,25 @@ bool ha_mroonga::wrapper_prepare_inplace_alter_table( if (!alter_handler_flags) { DBUG_RETURN(false); } + +#ifdef MRN_SUPPORT_CUSTOM_OPTIONS + int error = 0; + MRN_SHARE *tmp_share; + tmp_share = mrn_get_share(altered_table->s->table_name.str, + altered_table, + &error); + if (error != 0) { + DBUG_RETURN(true); + } + + if (parse_engine_table_options(ha_thd(), + tmp_share->hton, + wrap_altered_table->s)) { + mrn_free_share(tmp_share); + DBUG_RETURN(true); + } +#endif + MRN_SET_WRAP_ALTER_KEY(this, ha_alter_info); MRN_SET_WRAP_SHARE_KEY(share, table->s); MRN_SET_WRAP_TABLE_KEY(this, table); @@ -13793,6 +14146,11 @@ bool ha_mroonga::wrapper_prepare_inplace_alter_table( MRN_SET_BASE_ALTER_KEY(this, ha_alter_info); MRN_SET_BASE_SHARE_KEY(share, table->s); MRN_SET_BASE_TABLE_KEY(this, table); + +#ifdef MRN_SUPPORT_CUSTOM_OPTIONS + mrn_free_share(tmp_share); +#endif + DBUG_RETURN(result); } @@ -13857,8 +14215,8 @@ bool ha_mroonga::wrapper_inplace_alter_table( ha_alter_info->key_count); MRN_SHARE *tmp_share; TABLE_SHARE tmp_table_share; - char **key_parser; - uint *key_parser_length; + char **key_tokenizer; + uint *key_tokenizer_length; KEY *p_key_info = &table->key_info[table_share->primary_key]; bool need_fill_index = false; memset(index_tables, 0, sizeof(grn_obj *) * ha_alter_info->key_count); @@ -13868,8 +14226,8 @@ bool ha_mroonga::wrapper_inplace_alter_table( if (!(tmp_share = (MRN_SHARE *) mrn_my_multi_malloc(MYF(MY_WME | MY_ZEROFILL), &tmp_share, sizeof(*tmp_share), - &key_parser, sizeof(char *) * (tmp_table_share.keys), - &key_parser_length, sizeof(uint) * (tmp_table_share.keys), + &key_tokenizer, sizeof(char *) * (tmp_table_share.keys), + &key_tokenizer_length, sizeof(uint) * (tmp_table_share.keys), NullS)) ) { MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_tables); @@ -13880,8 +14238,8 @@ bool ha_mroonga::wrapper_inplace_alter_table( tmp_share->table_share = &tmp_table_share; tmp_share->index_table = NULL; tmp_share->index_table_length = NULL; - tmp_share->key_parser = key_parser; - tmp_share->key_parser_length = key_parser_length; + tmp_share->key_tokenizer = key_tokenizer; + tmp_share->key_tokenizer_length = key_tokenizer_length; bitmap_clear_all(table->read_set); mrn_set_bitmap_by_key(table->read_set, p_key_info); n_keys = ha_alter_info->index_add_count; @@ -13939,14 +14297,32 @@ bool ha_mroonga::wrapper_inplace_alter_table( bitmap_set_all(table->read_set); if (!error && alter_handler_flags) { - MRN_SET_WRAP_ALTER_KEY(this, ha_alter_info); - MRN_SET_WRAP_SHARE_KEY(share, table->s); - MRN_SET_WRAP_TABLE_KEY(this, table); - result = wrap_handler->ha_inplace_alter_table(wrap_altered_table, - ha_alter_info); - MRN_SET_BASE_ALTER_KEY(this, ha_alter_info); - MRN_SET_BASE_SHARE_KEY(share, table->s); - MRN_SET_BASE_TABLE_KEY(this, table); +#ifdef MRN_SUPPORT_CUSTOM_OPTIONS + { + MRN_SHARE *alter_tmp_share; + alter_tmp_share = mrn_get_share(altered_table->s->table_name.str, + altered_table, + &error); + if (alter_tmp_share) { + if (parse_engine_table_options(ha_thd(), + alter_tmp_share->hton, + wrap_altered_table->s)) { + error = MRN_GET_ERROR_NUMBER; + } + mrn_free_share(alter_tmp_share); + } + } +#endif + if (!error) { + MRN_SET_WRAP_ALTER_KEY(this, ha_alter_info); + MRN_SET_WRAP_SHARE_KEY(share, table->s); + MRN_SET_WRAP_TABLE_KEY(this, table); + result = wrap_handler->ha_inplace_alter_table(wrap_altered_table, + ha_alter_info); + MRN_SET_BASE_ALTER_KEY(this, ha_alter_info); + MRN_SET_BASE_SHARE_KEY(share, table->s); + MRN_SET_BASE_TABLE_KEY(this, table); + } } if (result || error) @@ -13954,8 +14330,7 @@ bool ha_mroonga::wrapper_inplace_alter_table( n_keys = ha_alter_info->index_add_count; for (i = 0; i < n_keys; ++i) { uint key_pos = ha_alter_info->index_add_buffer[i]; - KEY *key = - &altered_table->key_info[key_pos]; + KEY *key = &altered_table->key_info[key_pos]; if (!(key->flags & HA_FULLTEXT || mrn_is_geo_key(key))) { continue; } @@ -14007,8 +14382,8 @@ bool ha_mroonga::storage_inplace_alter_table_index( ha_alter_info->key_count); MRN_SHARE *tmp_share; TABLE_SHARE tmp_table_share; - char **index_table, **key_parser, **col_flags, **col_type; - uint *index_table_length, *key_parser_length, *col_flags_length, *col_type_length; + char **index_table, **key_tokenizer, **col_flags, **col_type; + uint *index_table_length, *key_tokenizer_length, *col_flags_length, *col_type_length; bool have_multiple_column_index = false; memset(index_tables, 0, sizeof(grn_obj *) * ha_alter_info->key_count); memset(index_columns, 0, sizeof(grn_obj *) * ha_alter_info->key_count); @@ -14019,8 +14394,8 @@ bool ha_mroonga::storage_inplace_alter_table_index( &tmp_share, sizeof(*tmp_share), &index_table, sizeof(char *) * tmp_table_share.keys, &index_table_length, sizeof(uint) * tmp_table_share.keys, - &key_parser, sizeof(char *) * tmp_table_share.keys, - &key_parser_length, sizeof(uint) * tmp_table_share.keys, + &key_tokenizer, sizeof(char *) * tmp_table_share.keys, + &key_tokenizer_length, sizeof(uint) * tmp_table_share.keys, &col_flags, sizeof(char *) * tmp_table_share.fields, &col_flags_length, sizeof(uint) * tmp_table_share.fields, &col_type, sizeof(char *) * tmp_table_share.fields, @@ -14035,8 +14410,8 @@ bool ha_mroonga::storage_inplace_alter_table_index( tmp_share->table_share = &tmp_table_share; tmp_share->index_table = index_table; tmp_share->index_table_length = index_table_length; - tmp_share->key_parser = key_parser; - tmp_share->key_parser_length = key_parser_length; + tmp_share->key_tokenizer = key_tokenizer; + tmp_share->key_tokenizer_length = key_tokenizer_length; tmp_share->col_flags = col_flags; tmp_share->col_flags_length = col_flags_length; tmp_share->col_type = col_type; @@ -14145,8 +14520,8 @@ bool ha_mroonga::storage_inplace_alter_table_add_column( MRN_SHARE *tmp_share; TABLE_SHARE tmp_table_share; - char **index_table, **key_parser, **col_flags, **col_type; - uint *index_table_length, *key_parser_length, *col_flags_length, *col_type_length; + char **index_table, **key_tokenizer, **col_flags, **col_type; + uint *index_table_length, *key_tokenizer_length, *col_flags_length, *col_type_length; tmp_table_share.keys = 0; tmp_table_share.fields = altered_table->s->fields; tmp_share = (MRN_SHARE *)mrn_my_multi_malloc( @@ -14154,8 +14529,8 @@ bool ha_mroonga::storage_inplace_alter_table_add_column( &tmp_share, sizeof(*tmp_share), &index_table, sizeof(char *) * tmp_table_share.keys, &index_table_length, sizeof(uint) * tmp_table_share.keys, - &key_parser, sizeof(char *) * tmp_table_share.keys, - &key_parser_length, sizeof(uint) * tmp_table_share.keys, + &key_tokenizer, sizeof(char *) * tmp_table_share.keys, + &key_tokenizer_length, sizeof(uint) * tmp_table_share.keys, &col_flags, sizeof(char *) * tmp_table_share.fields, &col_flags_length, sizeof(uint) * tmp_table_share.fields, &col_type, sizeof(char *) * tmp_table_share.fields, @@ -14169,8 +14544,8 @@ bool ha_mroonga::storage_inplace_alter_table_add_column( tmp_share->table_share = &tmp_table_share; tmp_share->index_table = index_table; tmp_share->index_table_length = index_table_length; - tmp_share->key_parser = key_parser; - tmp_share->key_parser_length = key_parser_length; + tmp_share->key_tokenizer = key_tokenizer; + tmp_share->key_tokenizer_length = key_tokenizer_length; tmp_share->col_flags = col_flags; tmp_share->col_flags_length = col_flags_length; tmp_share->col_type = col_type; @@ -14187,7 +14562,6 @@ bool ha_mroonga::storage_inplace_alter_table_add_column( continue; } - grn_obj *col_type; Field *field = altered_table->s->field[i]; const char *column_name = field->field_name; int column_name_size = strlen(column_name); @@ -14199,20 +14573,19 @@ bool ha_mroonga::storage_inplace_alter_table_add_column( } grn_obj_flags col_flags = GRN_OBJ_PERSISTENT; - if (tmp_share->col_flags[i]) { - col_flags |= mrn_parse_grn_column_create_flags(ha_thd(), - ctx, - tmp_share->col_flags[i], - tmp_share->col_flags_length[i]); - } else { + if (!find_column_flags(field, tmp_share, i, &col_flags)) { col_flags |= GRN_OBJ_COLUMN_SCALAR; } - grn_builtin_type gtype = mrn_grn_type_from_field(ctx, field, false); - if (tmp_share->col_type[i]) { - col_type = grn_ctx_get(ctx, tmp_share->col_type[i], -1); - } else { - col_type = grn_ctx_at(ctx, gtype); + grn_obj *col_type; + { + int column_type_error_code = ER_WRONG_FIELD_SPEC; + col_type = find_column_type(field, tmp_share, i, column_type_error_code); + if (!col_type) { + error = column_type_error_code; + have_error = true; + break; + } } char *col_path = NULL; // we don't specify path @@ -14418,6 +14791,7 @@ bool ha_mroonga::wrapper_commit_inplace_alter_table( bool result; MRN_DBUG_ENTER_METHOD(); if (!alter_handler_flags) { + free_root(&(wrap_altered_table_share->mem_root), MYF(0)); my_free(alter_key_info_buffer); alter_key_info_buffer = NULL; DBUG_RETURN(false); @@ -14431,6 +14805,7 @@ bool ha_mroonga::wrapper_commit_inplace_alter_table( MRN_SET_BASE_ALTER_KEY(this, ha_alter_info); MRN_SET_BASE_SHARE_KEY(share, table->s); MRN_SET_BASE_TABLE_KEY(this, table); + free_root(&(wrap_altered_table_share->mem_root), MYF(0)); my_free(alter_key_info_buffer); alter_key_info_buffer = NULL; DBUG_RETURN(result); @@ -14538,8 +14913,8 @@ int ha_mroonga::wrapper_add_index(TABLE *table_arg, KEY *key_info, THD *thd = ha_thd(); MRN_SHARE *tmp_share; TABLE_SHARE tmp_table_share; - char **key_parser; - uint *key_parser_length; + char **key_tokenizer; + uint *key_tokenizer_length; MRN_DBUG_ENTER_METHOD(); if (!(wrap_alter_key_info = (KEY *) mrn_my_malloc(sizeof(KEY) * num_of_keys, MYF(MY_WME)))) { @@ -14553,8 +14928,8 @@ int ha_mroonga::wrapper_add_index(TABLE *table_arg, KEY *key_info, if (!(tmp_share = (MRN_SHARE *) mrn_my_multi_malloc(MYF(MY_WME | MY_ZEROFILL), &tmp_share, sizeof(*tmp_share), - &key_parser, sizeof(char *) * (n_keys + num_of_keys), - &key_parser_length, sizeof(uint) * (n_keys + num_of_keys), + &key_tokenizer, sizeof(char *) * (n_keys + num_of_keys), + &key_tokenizer_length, sizeof(uint) * (n_keys + num_of_keys), NullS)) ) { MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_tables); @@ -14565,8 +14940,8 @@ int ha_mroonga::wrapper_add_index(TABLE *table_arg, KEY *key_info, tmp_share->table_share = &tmp_table_share; tmp_share->index_table = NULL; tmp_share->index_table_length = NULL; - tmp_share->key_parser = key_parser; - tmp_share->key_parser_length = key_parser_length; + tmp_share->key_tokenizer = key_tokenizer; + tmp_share->key_tokenizer_length = key_tokenizer_length; tmp_share->col_flags = NULL; tmp_share->col_type = NULL; #ifdef MRN_HANDLER_HAVE_FINAL_ADD_INDEX @@ -14677,8 +15052,8 @@ int ha_mroonga::storage_add_index(TABLE *table_arg, KEY *key_info, MRN_ALLOCATE_VARIABLE_LENGTH_ARRAYS(grn_obj *, index_columns, num_of_keys + n_keys); MRN_SHARE *tmp_share; TABLE_SHARE tmp_table_share; - char **index_table, **key_parser, **col_flags, **col_type; - uint *index_table_length, *key_parser_length, *col_flags_length, *col_type_length; + char **index_table, **key_tokenizer, **col_flags, **col_type; + uint *index_table_length, *key_tokenizer_length, *col_flags_length, *col_type_length; bool have_multiple_column_index = false; MRN_DBUG_ENTER_METHOD(); @@ -14689,8 +15064,8 @@ int ha_mroonga::storage_add_index(TABLE *table_arg, KEY *key_info, &tmp_share, sizeof(*tmp_share), &index_table, sizeof(char*) * tmp_table_share.keys, &index_table_length, sizeof(uint) * tmp_table_share.keys, - &key_parser, sizeof(char *) * tmp_table_share.keys, - &key_parser_length, sizeof(uint) * tmp_table_share.keys, + &key_tokenizer, sizeof(char *) * tmp_table_share.keys, + &key_tokenizer_length, sizeof(uint) * tmp_table_share.keys, &col_flags, sizeof(char *) * tmp_table_share.fields, &col_flags_length, sizeof(uint) * tmp_table_share.fields, &col_type, sizeof(char *) * tmp_table_share.fields, @@ -14705,8 +15080,8 @@ int ha_mroonga::storage_add_index(TABLE *table_arg, KEY *key_info, tmp_share->table_share = &tmp_table_share; tmp_share->index_table = index_table; tmp_share->index_table_length = index_table_length; - tmp_share->key_parser = key_parser; - tmp_share->key_parser_length = key_parser_length; + tmp_share->key_tokenizer = key_tokenizer; + tmp_share->key_tokenizer_length = key_tokenizer_length; tmp_share->col_flags = col_flags; tmp_share->col_flags_length = col_flags_length; tmp_share->col_type = col_type; @@ -15238,11 +15613,11 @@ int ha_mroonga::reset_auto_increment(ulonglong value) void ha_mroonga::set_pk_bitmap() { - KEY key_info = table->key_info[table_share->primary_key]; - uint j; MRN_DBUG_ENTER_METHOD(); - for (j = 0; j < KEY_N_KEY_PARTS(&key_info); j++) { - Field *field = key_info.key_part[j].field; + KEY *key_info = &(table->key_info[table_share->primary_key]); + uint j; + for (j = 0; j < KEY_N_KEY_PARTS(key_info); j++) { + Field *field = key_info->key_part[j].field; bitmap_set_bit(table->read_set, field->field_index); } DBUG_VOID_RETURN; @@ -15556,17 +15931,11 @@ char *ha_mroonga::storage_get_foreign_key_create_info() build_table_filename(ref_path, sizeof(ref_path) - 1, table_share->db.str, ref_table_buff, "", 0); DBUG_PRINT("info", ("mroonga: ref_path=%s", ref_path)); -#ifdef MRN_TABLE_LIST_INIT_REQUIRE_ALIAS table_list.init_one_table(table_share->db.str, table_share->db.length, ref_table_buff, ref_table_name_length, ref_table_buff, TL_WRITE); -#else - table_list.init_one_table(table_share->db.str, - ref_table_buff, - TL_WRITE); -#endif mrn_open_mutex_lock(table_share); tmp_ref_table_share = mrn_create_tmp_table_share(&table_list, ref_path, &error); @@ -15768,17 +16137,11 @@ int ha_mroonga::storage_get_foreign_key_list(THD *thd, build_table_filename(ref_path, sizeof(ref_path) - 1, table_share->db.str, ref_table_buff, "", 0); DBUG_PRINT("info", ("mroonga: ref_path=%s", ref_path)); -#ifdef MRN_TABLE_LIST_INIT_REQUIRE_ALIAS table_list.init_one_table(table_share->db.str, table_share->db.length, ref_table_buff, ref_table_name_length, ref_table_buff, TL_WRITE); -#else - table_list.init_one_table(table_share->db.str, - ref_table_buff, - TL_WRITE); -#endif mrn_open_mutex_lock(table_share); tmp_ref_table_share = mrn_create_tmp_table_share(&table_list, ref_path, &error); @@ -15831,7 +16194,6 @@ int ha_mroonga::get_foreign_key_list(THD *thd, DBUG_RETURN(res); } -#ifdef MRN_HANDLER_HAVE_GET_PARENT_FOREIGN_KEY_LIST int ha_mroonga::wrapper_get_parent_foreign_key_list(THD *thd, List *f_key_list) { @@ -15866,7 +16228,6 @@ int ha_mroonga::get_parent_foreign_key_list(THD *thd, } DBUG_RETURN(res); } -#endif uint ha_mroonga::wrapper_referenced_by_foreign_key() { diff --git a/storage/mroonga/ha_mroonga.hpp b/storage/mroonga/ha_mroonga.hpp index 78d5c3d2465..37059210dd1 100644 --- a/storage/mroonga/ha_mroonga.hpp +++ b/storage/mroonga/ha_mroonga.hpp @@ -33,18 +33,11 @@ extern "C" { #include #include "mrn_mysql_compat.h" -#if (MYSQL_VERSION_ID >= 50603) || \ - (MYSQL_VERSION_ID >= 50513 && MYSQL_VERSION_ID < 50600) || \ - (MYSQL_VERSION_ID >= 50158 && MYSQL_VERSION_ID < 50500) -# define MRN_HANDLER_CLONE_NEED_NAME 1 -#endif - #if (MYSQL_VERSION_ID >= 50514 && MYSQL_VERSION_ID < 50600) # define MRN_HANDLER_HAVE_FINAL_ADD_INDEX 1 #endif -#if (MYSQL_VERSION_ID >= 50603) || \ - (defined(MRN_MARIADB_P) && MYSQL_VERSION_ID >= 50209) +#if (MYSQL_VERSION_ID >= 50603) || defined(MRN_MARIADB_P) # define MRN_HANDLER_HAVE_HA_RND_NEXT 1 # define MRN_HANDLER_HAVE_HA_RND_POS 1 # define MRN_HANDLER_HAVE_HA_INDEX_READ_MAP 1 @@ -56,8 +49,7 @@ extern "C" { # define MRN_HANDLER_HAVE_HA_INDEX_NEXT_SAME 1 #endif -#if (MYSQL_VERSION_ID >= 50604) || \ - (defined(MRN_MARIADB_P) && MYSQL_VERSION_ID >= 50302) +#if (MYSQL_VERSION_ID >= 50604) || defined(MRN_MARIADB_P) # define MRN_HANDLER_HAVE_HA_CLOSE 1 # define MRN_HANDLER_HAVE_MULTI_RANGE_READ 1 #endif @@ -77,15 +69,10 @@ extern "C" { # endif #endif -#if (defined(MRN_MARIADB_P) && MYSQL_VERSION_ID >= 50302) +#ifdef MRN_MARIADB_P # define MRN_HANDLER_HAVE_MULTI_RANGE_READ_INFO_KEY_PARTS #endif -#if MYSQL_VERSION_ID >= 50500 -# define MRN_HANDLER_HAVE_TRUNCATE -# define MRN_HANDLER_HAVE_GET_PARENT_FOREIGN_KEY_LIST -#endif - #if MYSQL_VERSION_ID < 50600 # define MRN_HANDLER_HAVE_GET_TABLESPACE_NAME #endif @@ -94,10 +81,6 @@ extern "C" { # define MRN_HANDLER_HAVE_SET_HA_SHARE_REF #endif -#if MYSQL_VERSION_ID >= 50500 -# define MRN_TABLE_LIST_INIT_REQUIRE_ALIAS -#endif - #if MYSQL_VERSION_ID >= 50706 && !defined(MRN_MARIADB_P) # define MRN_BIG_TABLES #elif defined(BIG_TABLES) @@ -110,17 +93,10 @@ extern "C" { # define MRN_HA_ROWS_FORMAT "lu" #endif -#if (MYSQL_VERSION_ID < 50519) || \ - defined(MRN_MARIADB_P) || \ - (50600 <= MYSQL_VERSION_ID && MYSQL_VERSION_ID < 50604) +#ifdef MRN_MARIADB_P # define MRN_NEED_FREE_STRING_MEMALLOC_PLUGIN_VAR #endif -#if MYSQL_VERSION_ID >= 50500 -# define MRN_HAVE_HA_EXTRA_ADD_CHILDREN_LIST -# define MRN_HAVE_HA_EXTRA_IS_ATTACHED_CHILDREN -#endif - #ifdef MRN_MARIADB_P # define MRN_HAVE_HA_EXTRA_DETACH_CHILD # define MRN_HAVE_HA_EXTRA_PREPARE_FOR_FORCED_CLOSE @@ -147,10 +123,6 @@ extern "C" { # define MRN_FIELD_STORE_TIME_NEED_TYPE #endif -#if MYSQL_VERSION_ID < 50500 -# define MRN_HAVE_TL_WRITE_ALLOW_READ -#endif - #if MYSQL_VERSION_ID < 50706 || defined(MRN_MARIADB_P) # define MRN_HAVE_TL_WRITE_DELAYED #endif @@ -159,9 +131,7 @@ extern "C" { # define MRN_HAVE_TL_WRITE_CONCURRENT_DEFAULT #endif -#if (defined(MRN_MARIADB_P) && \ - ((MYSQL_VERSION_ID >= 50306 && MYSQL_VERSION_ID < 50500) || \ - MYSQL_VERSION_ID >= 50523)) +#ifdef MRN_MARIADB_P # define MRN_HANDLER_AUTO_REPAIR_HAVE_ERROR #endif @@ -191,6 +161,9 @@ extern "C" { #if (defined(MRN_MARIADB_P) && MYSQL_VERSION_ID >= 100010) # define MRN_HAVE_TDC_LOCK_TABLE_SHARE +# if MYSQL_VERSION_ID >= 100100 +# define MRN_TABLE_SHARE_TDC_IS_POINTER +# endif #endif #ifdef MRN_MARIADB_P @@ -256,6 +229,22 @@ struct st_mrn_ft_info ha_mroonga *mroonga; }; +#ifdef MRN_SUPPORT_CUSTOM_OPTIONS +struct ha_field_option_struct +{ + const char *groonga_type; + const char *flags; +}; + +struct ha_index_option_struct +{ + const char *tokenizer; + const char *normalizer; + const char *token_filters; + const char *flags; +}; +#endif + /* handler class */ class ha_mroonga: public handler { @@ -446,11 +435,7 @@ public: int reset(); -#ifdef MRN_HANDLER_CLONE_NEED_NAME handler *clone(const char *name, MEM_ROOT *mem_root); -#else - handler *clone(MEM_ROOT *mem_root); -#endif uint8 table_cache_type(); #ifdef MRN_HANDLER_HAVE_MULTI_RANGE_READ ha_rows multi_range_read_info_const(uint keyno, RANGE_SEQ_IF *seq, @@ -481,9 +466,7 @@ public: #endif int end_bulk_insert(); int delete_all_rows(); -#ifdef MRN_HANDLER_HAVE_TRUNCATE int truncate(); -#endif // MRN_HANDLER_HAVE_TRUNCATE double scan_time(); double read_time(uint index, uint ranges, ha_rows rows); const key_map *keys_to_use_for_scanning(); @@ -567,9 +550,7 @@ protected: #endif bool can_switch_engines(); int get_foreign_key_list(THD *thd, List *f_key_list); -#ifdef MRN_HANDLER_HAVE_GET_PARENT_FOREIGN_KEY_LIST int get_parent_foreign_key_list(THD *thd, List *f_key_list); -#endif uint referenced_by_foreign_key(); void init_table_handle_for_HANDLER(); void free_foreign_key_create_info(char* str); @@ -597,6 +578,8 @@ private: void mkdir_p(const char *directory); ulonglong file_size(const char *path); + bool have_unique_index(); + void push_warning_unsupported_spatial_index_search(enum ha_rkey_function flag); void clear_cursor(); void clear_cursor_geo(); @@ -604,14 +587,23 @@ private: void clear_search_result(); void clear_search_result_geo(); void clear_indexes(); - int alter_share_add(const char *path, TABLE_SHARE *table_share); + int add_wrap_hton(const char *path, handlerton *wrap_handlerton); void remove_related_files(const char *base_path); void remove_grn_obj_force(const char *name); int drop_index(MRN_SHARE *target_share, uint key_index); + int drop_indexes_normal(const char *table_name, grn_obj *table); + int drop_indexes_multiple(const char *table_name, grn_obj *table); + int drop_indexes(const char *table_name); + bool find_column_flags(Field *field, MRN_SHARE *mrn_share, int i, + grn_obj_flags *column_flags); + grn_obj *find_column_type(Field *field, MRN_SHARE *mrn_share, int i, + int error_code); + grn_obj *find_tokenizer(KEY *key, MRN_SHARE *mrn_share, int i); grn_obj *find_tokenizer(const char *name, int name_length); - grn_obj *find_normalizer(KEY *key_info); - bool find_index_column_flags(KEY *key_info, grn_obj_flags *index_column_flags); - bool find_token_filters(KEY *key_info, grn_obj *token_filters); + grn_obj *find_normalizer(KEY *key); + grn_obj *find_normalizer(KEY *key, const char *name); + bool find_index_column_flags(KEY *key, grn_obj_flags *index_column_flags); + bool find_token_filters(KEY *key, grn_obj *token_filters); bool find_token_filters_put(grn_obj *token_filters, const char *token_filter_name, int token_filter_name_length); @@ -788,12 +780,9 @@ private: int close_databases(); int ensure_database_open(const char *name); int ensure_database_remove(const char *name); - int wrapper_delete_table(const char *name, MRN_SHARE *tmp_share, - const char *table_name); - int wrapper_delete_index(const char *name, MRN_SHARE *tmp_share, - const char *table_name); - int storage_delete_table(const char *name, MRN_SHARE *tmp_share, + int wrapper_delete_table(const char *name, handlerton *wrap_handlerton, const char *table_name); + int generic_delete_table(const char *name, const char *table_name); int wrapper_open(const char *name, int mode, uint test_if_locked); int wrapper_open_indexes(const char *name); int storage_open(const char *name, int mode, uint test_if_locked); @@ -987,13 +976,8 @@ private: void storage_cond_pop(); bool wrapper_get_error_message(int error, String *buf); bool storage_get_error_message(int error, String *buf); -#ifdef MRN_HANDLER_CLONE_NEED_NAME handler *wrapper_clone(const char *name, MEM_ROOT *mem_root); handler *storage_clone(const char *name, MEM_ROOT *mem_root); -#else - handler *wrapper_clone(MEM_ROOT *mem_root); - handler *storage_clone(MEM_ROOT *mem_root); -#endif uint8 wrapper_table_cache_type(); uint8 storage_table_cache_type(); #ifdef MRN_HANDLER_HAVE_MULTI_RANGE_READ @@ -1049,9 +1033,7 @@ private: const char *function_name); int wrapper_delete_all_rows(); int storage_delete_all_rows(); -#ifdef MRN_HANDLER_HAVE_TRUNCATE int wrapper_truncate(); -#endif // MRN_HANDLER_HAVE_TRUNCATE int wrapper_truncate_index(); int storage_truncate(); int storage_truncate_index(); @@ -1216,10 +1198,8 @@ private: bool storage_can_switch_engines(); int wrapper_get_foreign_key_list(THD *thd, List *f_key_list); int storage_get_foreign_key_list(THD *thd, List *f_key_list); -#ifdef MRN_HANDLER_HAVE_GET_PARENT_FOREIGN_KEY_LIST int wrapper_get_parent_foreign_key_list(THD *thd, List *f_key_list); int storage_get_parent_foreign_key_list(THD *thd, List *f_key_list); -#endif uint wrapper_referenced_by_foreign_key(); uint storage_referenced_by_foreign_key(); void wrapper_init_table_handle_for_HANDLER(); diff --git a/storage/mroonga/lib/mrn_condition_converter.cpp b/storage/mroonga/lib/mrn_condition_converter.cpp index 1bfae1d4f8a..1527a546938 100644 --- a/storage/mroonga/lib/mrn_condition_converter.cpp +++ b/storage/mroonga/lib/mrn_condition_converter.cpp @@ -17,10 +17,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifdef HAVE_CONFIG_H -# include -#endif - #include "mrn_condition_converter.hpp" #include "mrn_time_converter.hpp" #include "mrn_smart_grn_obj.hpp" diff --git a/storage/mroonga/lib/mrn_condition_converter.hpp b/storage/mroonga/lib/mrn_condition_converter.hpp index bb85f5cdef5..3a7fbd048dc 100644 --- a/storage/mroonga/lib/mrn_condition_converter.hpp +++ b/storage/mroonga/lib/mrn_condition_converter.hpp @@ -20,11 +20,12 @@ #ifndef MRN_CONDITION_CONVERTER_HPP_ #define MRN_CONDITION_CONVERTER_HPP_ -#include #include #include +#include + namespace mrn { class ConditionConverter { public: diff --git a/storage/mroonga/lib/mrn_database_manager.cpp b/storage/mroonga/lib/mrn_database_manager.cpp index 365f47337fa..753d1551ff4 100644 --- a/storage/mroonga/lib/mrn_database_manager.cpp +++ b/storage/mroonga/lib/mrn_database_manager.cpp @@ -2,7 +2,7 @@ /* Copyright(C) 2010 Tetsuro IKEDA Copyright(C) 2010-2013 Kentoku SHIBA - Copyright(C) 2011-2014 Kouhei Sutou + Copyright(C) 2011-2015 Kouhei Sutou This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -126,13 +126,12 @@ namespace mrn { mapper.db_name(), strlen(mapper.db_name()), &db_address, NULL); memcpy(db_address, db, sizeof(grn_obj *)); + error = ensure_normalizers_registered(*db); } else { memcpy(db, db_address, sizeof(grn_obj *)); grn_ctx_use(ctx_, *db); } - error = ensure_normalizers_registered(*db); - DBUG_RETURN(error); } @@ -313,18 +312,18 @@ namespace mrn { int error = 0; #ifdef WITH_GROONGA_NORMALIZER_MYSQL { +# ifdef MRN_GROONGA_NORMALIZER_MYSQL_EMBEDDED + GRN_PLUGIN_IMPL_NAME_TAGGED(init, normalizers_mysql)(ctx_); + GRN_PLUGIN_IMPL_NAME_TAGGED(register, normalizers_mysql)(ctx_); +# else grn_obj *mysql_normalizer; mysql_normalizer = grn_ctx_get(ctx_, "NormalizerMySQLGeneralCI", -1); if (mysql_normalizer) { grn_obj_unlink(ctx_, mysql_normalizer); } else { -# ifdef MRN_GROONGA_NORMALIZER_MYSQL_EMBED - GRN_PLUGIN_IMPL_NAME_TAGGED(init, normalizers_mysql)(ctx_); - GRN_PLUGIN_IMPL_NAME_TAGGED(register, normalizers_mysql)(ctx_); -# else grn_plugin_register(ctx_, GROONGA_NORMALIZER_MYSQL_PLUGIN_NAME); -# endif } +# endif } #endif diff --git a/storage/mroonga/lib/mrn_database_repairer.cpp b/storage/mroonga/lib/mrn_database_repairer.cpp index 151330c9999..f04c027f8bb 100644 --- a/storage/mroonga/lib/mrn_database_repairer.cpp +++ b/storage/mroonga/lib/mrn_database_repairer.cpp @@ -233,7 +233,7 @@ namespace mrn { bool *succeeded = static_cast(user_data); if (grn_db_recover(ctx_, db) != GRN_SUCCESS) { push_warning_printf(thd_, - Sql_condition::WARN_LEVEL_WARN, + MRN_SEVERITY_WARNING, ER_NOT_KEYFILE, "mroonga: repair: " "Failed to recover database: <%s>: <%s>", diff --git a/storage/mroonga/lib/mrn_encoding.cpp b/storage/mroonga/lib/mrn_encoding.cpp index 35b8909fba2..f6f66758b2f 100644 --- a/storage/mroonga/lib/mrn_encoding.cpp +++ b/storage/mroonga/lib/mrn_encoding.cpp @@ -18,7 +18,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include #include #include "mrn_encoding.hpp" diff --git a/storage/mroonga/lib/mrn_encoding.hpp b/storage/mroonga/lib/mrn_encoding.hpp index b29b44d967e..9c3a65da0f1 100644 --- a/storage/mroonga/lib/mrn_encoding.hpp +++ b/storage/mroonga/lib/mrn_encoding.hpp @@ -1,6 +1,6 @@ /* -*- c-basic-offset: 2 -*- */ /* - Copyright(C) 2013 Kouhei Sutou + Copyright(C) 2013-2015 Kouhei Sutou This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,11 +20,11 @@ #ifndef MRN_ENCODING_HPP_ #define MRN_ENCODING_HPP_ -#include - #include #include +#include + namespace mrn { namespace encoding { void init(void); diff --git a/storage/mroonga/lib/mrn_field_normalizer.cpp b/storage/mroonga/lib/mrn_field_normalizer.cpp index f0b9d921599..d5b0b3ff43e 100644 --- a/storage/mroonga/lib/mrn_field_normalizer.cpp +++ b/storage/mroonga/lib/mrn_field_normalizer.cpp @@ -17,8 +17,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include - #include "mrn_field_normalizer.hpp" #include "mrn_encoding.hpp" diff --git a/storage/mroonga/lib/mrn_field_normalizer.hpp b/storage/mroonga/lib/mrn_field_normalizer.hpp index 5fd8974ce5b..3a855693481 100644 --- a/storage/mroonga/lib/mrn_field_normalizer.hpp +++ b/storage/mroonga/lib/mrn_field_normalizer.hpp @@ -1,6 +1,6 @@ /* -*- c-basic-offset: 2 -*- */ /* - Copyright(C) 2013 Kouhei Sutou + Copyright(C) 2013-2015 Kouhei Sutou This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,11 +20,11 @@ #ifndef MRN_FIELD_NORMALIZER_HPP_ #define MRN_FIELD_NORMALIZER_HPP_ -#include - #include #include +#include + namespace mrn { class FieldNormalizer { public: diff --git a/storage/mroonga/lib/mrn_index_table_name.cpp b/storage/mroonga/lib/mrn_index_table_name.cpp index 93f4ff8f8fd..a4a687c7996 100644 --- a/storage/mroonga/lib/mrn_index_table_name.cpp +++ b/storage/mroonga/lib/mrn_index_table_name.cpp @@ -26,6 +26,32 @@ #define MRN_CLASS_NAME "mrn::IndexTableName" namespace mrn { + const char *IndexTableName::SEPARATOR = "-"; + + bool IndexTableName::is_custom_name(const char *table_name, + size_t table_name_length, + const char *index_table_name, + size_t index_table_name_length) + { + MRN_DBUG_ENTER_METHOD(); + + if (index_table_name_length <= (table_name_length + strlen(SEPARATOR))) { + DBUG_RETURN(true); + } + + if (strncmp(table_name, index_table_name, table_name_length) != 0) { + DBUG_RETURN(true); + } + + if (strncmp(SEPARATOR, + index_table_name + table_name_length, + strlen(SEPARATOR)) != 0) { + DBUG_RETURN(true); + } + + DBUG_RETURN(false); + } + IndexTableName::IndexTableName(const char *table_name, const char *mysql_index_name) : table_name_(table_name), @@ -38,7 +64,10 @@ namespace mrn { mysql_index_name_multibyte, mysql_index_name_multibyte + strlen(mysql_index_name_)); snprintf(name_, MRN_MAX_KEY_SIZE, - "%s-%s", table_name_, encoded_mysql_index_name_multibyte); + "%s%s%s", + table_name_, + SEPARATOR, + encoded_mysql_index_name_multibyte); length_ = strlen(name_); } diff --git a/storage/mroonga/lib/mrn_index_table_name.hpp b/storage/mroonga/lib/mrn_index_table_name.hpp index 4ac4bfe087b..c4f16228610 100644 --- a/storage/mroonga/lib/mrn_index_table_name.hpp +++ b/storage/mroonga/lib/mrn_index_table_name.hpp @@ -26,6 +26,13 @@ namespace mrn { class IndexTableName { public: + static const char *SEPARATOR; + + static bool is_custom_name(const char *table_name, + size_t table_name_length, + const char *index_table_name, + size_t index_table_name_length); + IndexTableName(const char *table_name, const char *mysql_index_name); const char *c_str(); size_t length(); diff --git a/storage/mroonga/lib/mrn_lock.cpp b/storage/mroonga/lib/mrn_lock.cpp index 3340149b237..f518bca9af3 100644 --- a/storage/mroonga/lib/mrn_lock.cpp +++ b/storage/mroonga/lib/mrn_lock.cpp @@ -1,6 +1,6 @@ /* -*- c-basic-offset: 2 -*- */ /* - Copyright(C) 2013 Kouhei Sutou + Copyright(C) 2013-2015 Kouhei Sutou This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,12 +20,17 @@ #include "mrn_lock.hpp" namespace mrn { - Lock::Lock(mysql_mutex_t *mutex) - : mutex_(mutex) { - mysql_mutex_lock(mutex_); + Lock::Lock(mysql_mutex_t *mutex, bool execute) + : mutex_(mutex), + execute_(execute) { + if (execute_) { + mysql_mutex_lock(mutex_); + } } Lock::~Lock() { - mysql_mutex_unlock(mutex_); + if (execute_) { + mysql_mutex_unlock(mutex_); + } } } diff --git a/storage/mroonga/lib/mrn_lock.hpp b/storage/mroonga/lib/mrn_lock.hpp index 08e47b39c58..2ec71370fa1 100644 --- a/storage/mroonga/lib/mrn_lock.hpp +++ b/storage/mroonga/lib/mrn_lock.hpp @@ -1,6 +1,6 @@ /* -*- c-basic-offset: 2 -*- */ /* - Copyright(C) 2013 Kouhei Sutou + Copyright(C) 2013-2015 Kouhei Sutou This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -26,10 +26,11 @@ namespace mrn { class Lock { public: - Lock(mysql_mutex_t *mutex); + Lock(mysql_mutex_t *mutex, bool execute=true); ~Lock(); private: mysql_mutex_t *mutex_; + bool execute_; }; } diff --git a/storage/mroonga/lib/mrn_multiple_column_key_codec.cpp b/storage/mroonga/lib/mrn_multiple_column_key_codec.cpp index 1e55636f1bc..c7ef9dd5851 100644 --- a/storage/mroonga/lib/mrn_multiple_column_key_codec.cpp +++ b/storage/mroonga/lib/mrn_multiple_column_key_codec.cpp @@ -23,6 +23,7 @@ #include "mrn_multiple_column_key_codec.hpp" #include "mrn_field_normalizer.hpp" #include "mrn_smart_grn_obj.hpp" +#include "mrn_time_converter.hpp" #include "mrn_value_decoder.hpp" // for debug @@ -36,6 +37,13 @@ uint8 *key_ = (uint8 *)(key); \ while (size_--) { *buf_++ = *key_++; } \ } +#define mrn_byte_order_network_to_host(buf, key, size) \ +{ \ + uint32 size_ = (uint32)(size); \ + uint8 *buf_ = (uint8 *)(buf); \ + uint8 *key_ = (uint8 *)(key); \ + while (size_) { *buf_++ = *key_++; size_--; } \ +} #else /* WORDS_BIGENDIAN */ #define mrn_byte_order_host_to_network(buf, key, size) \ { \ @@ -44,6 +52,13 @@ uint8 *key_ = (uint8 *)(key) + size_; \ while (size_--) { *buf_++ = *(--key_); } \ } +#define mrn_byte_order_network_to_host(buf, key, size) \ +{ \ + uint32 size_ = (uint32)(size); \ + uint8 *buf_ = (uint8 *)(buf); \ + uint8 *key_ = (uint8 *)(key) + size_; \ + while (size_) { *buf_++ = *(--key_); size_--; } \ +} #endif /* WORDS_BIGENDIAN */ namespace mrn { @@ -87,6 +102,7 @@ namespace mrn { DataType data_type = TYPE_UNKNOWN; uint data_size = 0; get_key_info(key_part, &data_type, &data_size); + uint grn_key_data_size = data_size; switch (data_type) { case TYPE_UNKNOWN: @@ -97,26 +113,17 @@ namespace mrn { case TYPE_LONG_LONG_NUMBER: { long long int long_long_value = 0; - switch (data_size) { - case 3: - long_long_value = (long long int)sint3korr(current_mysql_key); - break; - case 8: - long_long_value = (long long int)sint8korr(current_mysql_key); - break; - } - mrn_byte_order_host_to_network(current_grn_key, &long_long_value, - data_size); - *((uint8 *)(current_grn_key)) ^= 0x80; + long_long_value = sint8korr(current_mysql_key); + encode_long_long_int(long_long_value, current_grn_key); } break; case TYPE_NUMBER: - mrn_byte_order_host_to_network(current_grn_key, current_mysql_key, data_size); { - Field_num *number_field = (Field_num *)field; - if (!number_field->unsigned_flag) { - *((uint8 *)(current_grn_key)) ^= 0x80; - } + Field_num *number_field = static_cast(field); + encode_number(current_mysql_key, + data_size, + !number_field->unsigned_flag, + current_grn_key); } break; case TYPE_FLOAT: @@ -133,6 +140,44 @@ namespace mrn { encode_double(value, data_size, current_grn_key); } break; + case TYPE_DATETIME: + { + long long int mysql_datetime; +#ifdef WORDS_BIGENDIAN + if (field->table && field->table->s->db_low_byte_first) { + mysql_datetime = sint8korr(current_mysql_key); + } else +#endif + { + value_decoder::decode(&mysql_datetime, current_mysql_key); + } + TimeConverter time_converter; + bool truncated; + long long int grn_time = + time_converter.mysql_datetime_to_grn_time(mysql_datetime, + &truncated); + encode_long_long_int(grn_time, current_grn_key); + } + break; +#ifdef MRN_HAVE_MYSQL_TYPE_DATETIME2 + case TYPE_DATETIME2: + { + Field_datetimef *datetimef_field = + static_cast(field); + long long int mysql_datetime_packed = + my_datetime_packed_from_binary(current_mysql_key, + datetimef_field->decimals()); + MYSQL_TIME mysql_time; + TIME_from_longlong_datetime_packed(&mysql_time, mysql_datetime_packed); + TimeConverter time_converter; + bool truncated; + long long int grn_time = + time_converter.mysql_time_to_grn_time(&mysql_time, &truncated); + grn_key_data_size = 8; + encode_long_long_int(grn_time, current_grn_key); + } + break; +#endif case TYPE_BYTE_SEQUENCE: memcpy(current_grn_key, current_mysql_key, data_size); break; @@ -140,7 +185,8 @@ namespace mrn { encode_reverse(current_mysql_key, data_size, current_grn_key); break; case TYPE_BYTE_BLOB: - encode_blob(field, current_mysql_key, current_grn_key, &data_size); + encode_blob(current_mysql_key, &data_size, field, current_grn_key); + grn_key_data_size = data_size; break; } @@ -149,8 +195,8 @@ namespace mrn { } current_mysql_key += data_size; - current_grn_key += data_size; - *grn_key_length += data_size; + current_grn_key += grn_key_data_size; + *grn_key_length += grn_key_data_size; } DBUG_RETURN(error); @@ -185,6 +231,7 @@ namespace mrn { DataType data_type = TYPE_UNKNOWN; uint data_size = 0; get_key_info(key_part, &data_type, &data_size); + uint grn_key_data_size = data_size; switch (data_type) { case TYPE_UNKNOWN: @@ -194,43 +241,68 @@ namespace mrn { break; case TYPE_LONG_LONG_NUMBER: { - long long int long_long_value = 0; - switch (data_size) { - case 3: - long_long_value = (long long int)sint3korr(current_grn_key); - break; - case 8: - long_long_value = (long long int)sint8korr(current_grn_key); - break; - } - *((uint8 *)(&long_long_value)) ^= 0x80; - mrn_byte_order_host_to_network(current_mysql_key, &long_long_value, - data_size); + long long int value; + decode_long_long_int(current_grn_key, &value); + int8store(current_mysql_key, value); } break; case TYPE_NUMBER: { - uchar buffer[8]; - memcpy(buffer, current_grn_key, data_size); - Field_num *number_field = (Field_num *)field; - if (!number_field->unsigned_flag) { - buffer[0] ^= 0x80; - } - mrn_byte_order_host_to_network(current_mysql_key, buffer, - data_size); + Field_num *number_field = static_cast(field); + decode_number(current_grn_key, + grn_key_data_size, + !number_field->unsigned_flag, + current_mysql_key); } break; case TYPE_FLOAT: - decode_float(current_grn_key, current_mysql_key, data_size); + decode_float(current_grn_key, grn_key_data_size, current_mysql_key); break; case TYPE_DOUBLE: - decode_double(current_grn_key, current_mysql_key, data_size); + decode_double(current_grn_key, grn_key_data_size, current_mysql_key); break; + case TYPE_DATETIME: + { + long long int grn_time; + decode_long_long_int(current_grn_key, &grn_time); + TimeConverter time_converter; + long long int mysql_datetime = + time_converter.grn_time_to_mysql_datetime(grn_time); +#ifdef WORDS_BIGENDIAN + if (field->table && field->table->s->db_low_byte_first) { + int8store(current_mysql_key, mysql_datetime); + } else +#endif + { + longlongstore(current_mysql_key, mysql_datetime); + } + } + break; +#ifdef MRN_HAVE_MYSQL_TYPE_DATETIME2 + case TYPE_DATETIME2: + { + Field_datetimef *datetimef_field = + static_cast(field); + long long int grn_time; + grn_key_data_size = 8; + decode_long_long_int(current_grn_key, &grn_time); + TimeConverter time_converter; + MYSQL_TIME mysql_time; + mysql_time.time_type = MYSQL_TIMESTAMP_DATETIME; + time_converter.grn_time_to_mysql_time(grn_time, &mysql_time); + long long int mysql_datetime_packed = + TIME_to_longlong_datetime_packed(&mysql_time); + my_datetime_packed_to_binary(mysql_datetime_packed, + current_mysql_key, + datetimef_field->decimals()); + } + break; +#endif case TYPE_BYTE_SEQUENCE: - memcpy(current_mysql_key, current_grn_key, data_size); + memcpy(current_mysql_key, current_grn_key, grn_key_data_size); break; case TYPE_BYTE_REVERSE: - decode_reverse(current_grn_key, current_mysql_key, data_size); + decode_reverse(current_grn_key, grn_key_data_size, current_mysql_key); break; case TYPE_BYTE_BLOB: memcpy(current_mysql_key, @@ -240,6 +312,7 @@ namespace mrn { current_grn_key, data_size); data_size += HA_KEY_BLOB_LENGTH; + grn_key_data_size = data_size; break; } @@ -247,7 +320,7 @@ namespace mrn { break; } - current_grn_key += data_size; + current_grn_key += grn_key_data_size; current_mysql_key += data_size; *mysql_key_length += data_size; } @@ -275,10 +348,19 @@ namespace mrn { DataType data_type = TYPE_UNKNOWN; uint data_size = 0; get_key_info(key_part, &data_type, &data_size); - total_size += data_size; - if (data_type == TYPE_BYTE_BLOB) { - total_size += HA_KEY_BLOB_LENGTH; + switch (data_type) { +#ifdef MRN_HAVE_MYSQL_TYPE_DATETIME2 + case TYPE_DATETIME2: + data_size = 8; + break; +#endif + case TYPE_BYTE_BLOB: + data_size += HA_KEY_BLOB_LENGTH; + break; + default: + break; } + total_size += data_size; } DBUG_RETURN(total_size); @@ -331,10 +413,22 @@ namespace mrn { *data_size = 1; break; case MYSQL_TYPE_TIMESTAMP: + DBUG_PRINT("info", ("mroonga: MYSQL_TYPE_TIMESTAMP")); + *data_type = TYPE_BYTE_REVERSE; + *data_size = key_part->length; + break; case MYSQL_TYPE_DATE: + DBUG_PRINT("info", ("mroonga: MYSQL_TYPE_DATE")); + *data_type = TYPE_BYTE_REVERSE; + *data_size = key_part->length; + break; case MYSQL_TYPE_DATETIME: - case MYSQL_TYPE_NEWDATE: DBUG_PRINT("info", ("mroonga: MYSQL_TYPE_DATETIME")); + *data_type = TYPE_DATETIME; + *data_size = key_part->length; + break; + case MYSQL_TYPE_NEWDATE: + DBUG_PRINT("info", ("mroonga: MYSQL_TYPE_NEWDATE")); *data_type = TYPE_BYTE_REVERSE; *data_size = key_part->length; break; @@ -350,7 +444,7 @@ namespace mrn { break; case MYSQL_TYPE_TIME: DBUG_PRINT("info", ("mroonga: MYSQL_TYPE_TIME")); - *data_type = TYPE_LONG_LONG_NUMBER; + *data_type = TYPE_NUMBER; *data_size = 3; break; case MYSQL_TYPE_VARCHAR: @@ -374,7 +468,7 @@ namespace mrn { #ifdef MRN_HAVE_MYSQL_TYPE_DATETIME2 case MYSQL_TYPE_DATETIME2: DBUG_PRINT("info", ("mroonga: MYSQL_TYPE_DATETIME2")); - *data_type = TYPE_BYTE_SEQUENCE; + *data_type = TYPE_DATETIME2; *data_size = key_part->length; break; #endif @@ -428,77 +522,127 @@ namespace mrn { DBUG_VOID_RETURN; } - void MultipleColumnKeyCodec::encode_float(volatile float value, uint data_size, + void MultipleColumnKeyCodec::encode_number(const uchar *mysql_key, + uint mysql_key_size, + bool is_signed, + uchar *grn_key) { + MRN_DBUG_ENTER_METHOD(); + mrn_byte_order_host_to_network(grn_key, mysql_key, mysql_key_size); + if (is_signed) { + grn_key[0] ^= 0x80; + } + DBUG_VOID_RETURN; + } + + void MultipleColumnKeyCodec::decode_number(const uchar *grn_key, + uint grn_key_size, + bool is_signed, + uchar *mysql_key) { + MRN_DBUG_ENTER_METHOD(); + uchar buffer[8]; + memcpy(buffer, grn_key, grn_key_size); + if (is_signed) { + buffer[0] ^= 0x80; + } + mrn_byte_order_network_to_host(mysql_key, buffer, grn_key_size); + DBUG_VOID_RETURN; + } + + void MultipleColumnKeyCodec::encode_long_long_int(volatile long long int value, + uchar *grn_key) { + MRN_DBUG_ENTER_METHOD(); + uint value_size = 8; + mrn_byte_order_host_to_network(grn_key, &value, value_size); + grn_key[0] ^= 0x80; + DBUG_VOID_RETURN; + } + + void MultipleColumnKeyCodec::decode_long_long_int(const uchar *grn_key, + long long int *value) { + MRN_DBUG_ENTER_METHOD(); + uint grn_key_size = 8; + uchar buffer[8]; + memcpy(buffer, grn_key, grn_key_size); + buffer[0] ^= 0x80; + mrn_byte_order_network_to_host(value, buffer, grn_key_size); + DBUG_VOID_RETURN; + } + + void MultipleColumnKeyCodec::encode_float(volatile float value, + uint value_size, uchar *grn_key) { MRN_DBUG_ENTER_METHOD(); - int n_bits = (data_size * 8 - 1); + int n_bits = (value_size * 8 - 1); volatile int *int_value_pointer = (int *)(&value); int int_value = *int_value_pointer; int_value ^= ((int_value >> n_bits) | (1 << n_bits)); - mrn_byte_order_host_to_network(grn_key, &int_value, data_size); + mrn_byte_order_host_to_network(grn_key, &int_value, value_size); DBUG_VOID_RETURN; } void MultipleColumnKeyCodec::decode_float(const uchar *grn_key, - uchar *mysql_key, - uint data_size) { + uint grn_key_size, + uchar *mysql_key) { MRN_DBUG_ENTER_METHOD(); int int_value; - mrn_byte_order_host_to_network(&int_value, grn_key, data_size); - int max_bit = (data_size * 8 - 1); + mrn_byte_order_network_to_host(&int_value, grn_key, grn_key_size); + int max_bit = (grn_key_size * 8 - 1); *((int *)mysql_key) = int_value ^ (((int_value ^ (1 << max_bit)) >> max_bit) | (1 << max_bit)); DBUG_VOID_RETURN; } - void MultipleColumnKeyCodec::encode_double(volatile double value, uint data_size, + void MultipleColumnKeyCodec::encode_double(volatile double value, + uint value_size, uchar *grn_key) { MRN_DBUG_ENTER_METHOD(); - int n_bits = (data_size * 8 - 1); + int n_bits = (value_size * 8 - 1); volatile long long int *long_long_value_pointer = (long long int *)(&value); volatile long long int long_long_value = *long_long_value_pointer; long_long_value ^= ((long_long_value >> n_bits) | (1LL << n_bits)); - mrn_byte_order_host_to_network(grn_key, &long_long_value, data_size); + mrn_byte_order_host_to_network(grn_key, &long_long_value, value_size); DBUG_VOID_RETURN; } void MultipleColumnKeyCodec::decode_double(const uchar *grn_key, - uchar *mysql_key, - uint data_size) { + uint grn_key_size, + uchar *mysql_key) { MRN_DBUG_ENTER_METHOD(); long long int long_long_value; - mrn_byte_order_host_to_network(&long_long_value, grn_key, data_size); - int max_bit = (data_size * 8 - 1); + mrn_byte_order_network_to_host(&long_long_value, grn_key, grn_key_size); + int max_bit = (grn_key_size * 8 - 1); *((long long int *)mysql_key) = long_long_value ^ (((long_long_value ^ (1LL << max_bit)) >> max_bit) | (1LL << max_bit)); DBUG_VOID_RETURN; } - void MultipleColumnKeyCodec::encode_reverse(const uchar *mysql_key, uint data_size, + void MultipleColumnKeyCodec::encode_reverse(const uchar *mysql_key, + uint mysql_key_size, uchar *grn_key) { MRN_DBUG_ENTER_METHOD(); - for (uint i = 0; i < data_size; i++) { - grn_key[i] = mysql_key[data_size - i - 1]; + for (uint i = 0; i < mysql_key_size; i++) { + grn_key[i] = mysql_key[mysql_key_size - i - 1]; } DBUG_VOID_RETURN; } void MultipleColumnKeyCodec::decode_reverse(const uchar *grn_key, - uchar *mysql_key, - uint data_size) { + uint grn_key_size, + uchar *mysql_key) { MRN_DBUG_ENTER_METHOD(); - for (uint i = 0; i < data_size; i++) { - mysql_key[i] = grn_key[data_size - i - 1]; + for (uint i = 0; i < grn_key_size; i++) { + mysql_key[i] = grn_key[grn_key_size - i - 1]; } DBUG_VOID_RETURN; } - void MultipleColumnKeyCodec::encode_blob(Field *field, - const uchar *mysql_key, - uchar *grn_key, - uint *data_size) { + void MultipleColumnKeyCodec::encode_blob(const uchar *mysql_key, + uint *mysql_key_size, + Field *field, + uchar *grn_key) { + MRN_DBUG_ENTER_METHOD(); FieldNormalizer normalizer(ctx_, thread_, field); if (normalizer.should_normalize()) { #if HA_KEY_BLOB_LENGTH != 2 @@ -517,15 +661,15 @@ namespace mrn { uint16 new_blob_data_length; if (normalized_length <= UINT_MAX16) { memcpy(grn_key, normalized, normalized_length); - if (normalized_length < *data_size) { + if (normalized_length < *mysql_key_size) { memset(grn_key + normalized_length, - '\0', *data_size - normalized_length); + '\0', *mysql_key_size - normalized_length); } new_blob_data_length = normalized_length; } else { push_warning_printf(thread_, MRN_SEVERITY_WARNING, - WARN_DATA_TRUNCATED, + MRN_ERROR_CODE_DATA_TRUNCATE(thread_), "normalized data truncated " "for multiple column index: " "normalized-data-size: <%u> " @@ -539,11 +683,14 @@ namespace mrn { memcpy(grn_key, normalized, blob_data_length); new_blob_data_length = blob_data_length; } - memcpy(grn_key + *data_size, &new_blob_data_length, HA_KEY_BLOB_LENGTH); + memcpy(grn_key + *mysql_key_size, + &new_blob_data_length, + HA_KEY_BLOB_LENGTH); } else { - memcpy(grn_key + *data_size, mysql_key, HA_KEY_BLOB_LENGTH); - memcpy(grn_key, mysql_key + HA_KEY_BLOB_LENGTH, *data_size); + memcpy(grn_key + *mysql_key_size, mysql_key, HA_KEY_BLOB_LENGTH); + memcpy(grn_key, mysql_key + HA_KEY_BLOB_LENGTH, *mysql_key_size); } - *data_size += HA_KEY_BLOB_LENGTH; + *mysql_key_size += HA_KEY_BLOB_LENGTH; + DBUG_VOID_RETURN; } } diff --git a/storage/mroonga/lib/mrn_multiple_column_key_codec.hpp b/storage/mroonga/lib/mrn_multiple_column_key_codec.hpp index fc6ae285357..2b3f935d4e4 100644 --- a/storage/mroonga/lib/mrn_multiple_column_key_codec.hpp +++ b/storage/mroonga/lib/mrn_multiple_column_key_codec.hpp @@ -44,6 +44,10 @@ namespace mrn { TYPE_NUMBER, TYPE_FLOAT, TYPE_DOUBLE, + TYPE_DATETIME, +#ifdef MRN_HAVE_MYSQL_TYPE_DATETIME2 + TYPE_DATETIME2, +#endif TYPE_BYTE_SEQUENCE, TYPE_BYTE_REVERSE, TYPE_BYTE_BLOB @@ -56,14 +60,40 @@ namespace mrn { void get_key_info(KEY_PART_INFO *key_part, DataType *data_type, uint *data_size); - void encode_float(volatile float value, uint data_size, uchar *grn_key); - void decode_float(const uchar *grn_key, uchar *mysql_key, uint data_size); - void encode_double(volatile double value, uint data_size, uchar *grn_key); - void decode_double(const uchar *grn_key, uchar *mysql_key, uint data_size); - void encode_reverse(const uchar *mysql_key, uint data_size, uchar *grn_key); - void decode_reverse(const uchar *grn_key, uchar *mysql_key, uint data_size); - void encode_blob(Field *field, - const uchar *mysql_key, uchar *grn_key, uint *data_size); + void encode_number(const uchar *mysql_key, + uint mysql_key_size, + bool is_signed, + uchar *grn_key); + void decode_number(const uchar *grn_key, + uint grn_key_size, + bool is_signed, + uchar *mysql_key); + void encode_long_long_int(volatile long long int value, + uchar *grn_key); + void decode_long_long_int(const uchar *grn_key, + long long int *value); + void encode_float(volatile float value, + uint value_size, + uchar *grn_key); + void decode_float(const uchar *grn_key, + uint grn_key_size, + uchar *mysql_key); + void encode_double(volatile double value, + uint value_size, + uchar *grn_key); + void decode_double(const uchar *grn_key, + uint grn_key_size, + uchar *mysql_key); + void encode_reverse(const uchar *mysql_key, + uint mysql_key_size, + uchar *grn_key); + void decode_reverse(const uchar *grn_key, + uint grn_key_size, + uchar *mysql_key); + void encode_blob(const uchar *mysql_key, + uint *mysql_key_size, + Field *field, + uchar *grn_key); }; } diff --git a/storage/mroonga/lib/mrn_mysqlservices.cpp b/storage/mroonga/lib/mrn_mysqlservices.cpp index 9c7af9acfe0..693aa8607c3 100644 --- a/storage/mroonga/lib/mrn_mysqlservices.cpp +++ b/storage/mroonga/lib/mrn_mysqlservices.cpp @@ -17,10 +17,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifdef HAVE_CONFIG_H -# include -#endif - #include #include diff --git a/storage/mroonga/lib/mrn_smart_grn_obj.cpp b/storage/mroonga/lib/mrn_smart_grn_obj.cpp index 9dbae6528f9..40ea9cb079c 100644 --- a/storage/mroonga/lib/mrn_smart_grn_obj.cpp +++ b/storage/mroonga/lib/mrn_smart_grn_obj.cpp @@ -50,4 +50,10 @@ namespace mrn { grn_obj *SmartGrnObj::get() { return obj_; } + + grn_obj *SmartGrnObj::release() { + grn_obj *obj = obj_; + obj_ = NULL; + return obj; + } } diff --git a/storage/mroonga/lib/mrn_smart_grn_obj.hpp b/storage/mroonga/lib/mrn_smart_grn_obj.hpp index c9c86f3e46e..0a44a6ac9db 100644 --- a/storage/mroonga/lib/mrn_smart_grn_obj.hpp +++ b/storage/mroonga/lib/mrn_smart_grn_obj.hpp @@ -33,6 +33,7 @@ namespace mrn { ~SmartGrnObj(); grn_obj *get(); + grn_obj *release(); }; } diff --git a/storage/mroonga/lib/mrn_time_converter.cpp b/storage/mroonga/lib/mrn_time_converter.cpp index 63b2e53766d..3c6821c8d11 100644 --- a/storage/mroonga/lib/mrn_time_converter.cpp +++ b/storage/mroonga/lib/mrn_time_converter.cpp @@ -1,7 +1,7 @@ /* -*- c-basic-offset: 2 -*- */ /* Copyright(C) 2010-2013 Kentoku SHIBA - Copyright(C) 2011-2013 Kouhei Sutou + Copyright(C) 2011-2015 Kouhei Sutou This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -18,10 +18,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifdef HAVE_CONFIG_H -# include -#endif - #include "mrn_time_converter.hpp" #ifdef min @@ -257,4 +253,43 @@ namespace mrn { } DBUG_VOID_RETURN; } + + long long int TimeConverter::mysql_datetime_to_grn_time(long long int mysql_datetime, + bool *truncated) { + MRN_DBUG_ENTER_METHOD(); + + MYSQL_TIME mysql_time; + mysql_time.time_type = MYSQL_TIMESTAMP_DATETIME; + mysql_time.neg = 0; + mysql_time.second_part = 0; + mysql_time.second = (mysql_datetime % 100); + mysql_time.minute = (mysql_datetime / 100 % 100); + mysql_time.hour = (mysql_datetime / 10000 % 100); + mysql_time.day = (mysql_datetime / 1000000 % 100); + mysql_time.month = (mysql_datetime / 100000000 % 100); + mysql_time.year = (mysql_datetime / 10000000000LL % 10000); + + long long int grn_time = mysql_time_to_grn_time(&mysql_time, truncated); + + DBUG_RETURN(grn_time); + } + + long long int TimeConverter::grn_time_to_mysql_datetime(long long int grn_time) { + MRN_DBUG_ENTER_METHOD(); + + MYSQL_TIME mysql_time; + mysql_time.time_type = MYSQL_TIMESTAMP_DATETIME; + + grn_time_to_mysql_time(grn_time, &mysql_time); + + long long int mysql_datetime = + (mysql_time.second * 1) + + (mysql_time.minute * 100) + + (mysql_time.hour * 10000) + + (mysql_time.day * 1000000) + + (mysql_time.month * 100000000) + + (mysql_time.year * 10000000000LL); + + DBUG_RETURN(mysql_datetime); + } } diff --git a/storage/mroonga/lib/mrn_time_converter.hpp b/storage/mroonga/lib/mrn_time_converter.hpp index c5c69a0a8ad..9d297f92e59 100644 --- a/storage/mroonga/lib/mrn_time_converter.hpp +++ b/storage/mroonga/lib/mrn_time_converter.hpp @@ -1,7 +1,7 @@ /* -*- c-basic-offset: 2 -*- */ /* Copyright(C) 2010-2013 Kentoku SHIBA - Copyright(C) 2011-2013 Kouhei Sutou + Copyright(C) 2011-2015 Kouhei Sutou This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -21,9 +21,10 @@ #ifndef MRN_TIME_CONVERTER_HPP_ #define MRN_TIME_CONVERTER_HPP_ -#include #include +#include + namespace mrn { class TimeConverter { public: @@ -34,10 +35,13 @@ namespace mrn { long long int mysql_time_to_grn_time(MYSQL_TIME *mysql_time, bool *truncated); + long long int mysql_datetime_to_grn_time(long long int mysql_datetime, + bool *truncated); long long int tm_to_grn_time(struct tm *time, int usec, bool *truncated); void grn_time_to_mysql_time(long long int grn_time, MYSQL_TIME *mysql_time); + long long int grn_time_to_mysql_datetime(long long int grn_time); private: time_t tm_to_time_gm(struct tm *time, bool *truncated); diff --git a/storage/mroonga/lib/mrn_value_decoder.cpp b/storage/mroonga/lib/mrn_value_decoder.cpp index 8356789915f..c01b01718b1 100644 --- a/storage/mroonga/lib/mrn_value_decoder.cpp +++ b/storage/mroonga/lib/mrn_value_decoder.cpp @@ -57,6 +57,17 @@ namespace mrn { double value; float8get(value, source); *dest = value; +#endif + DBUG_VOID_RETURN; + } + void decode(long long int *dest, const uchar *source) { + MRN_DBUG_ENTER_FUNCTION(); +#ifdef MRN_DEST_IS_POINTER + longlongget(dest, source); +#else + long long int value; + longlongget(value, source); + *dest = value; #endif DBUG_VOID_RETURN; } diff --git a/storage/mroonga/lib/mrn_value_decoder.hpp b/storage/mroonga/lib/mrn_value_decoder.hpp index 8a48de0b003..fe651f574f0 100644 --- a/storage/mroonga/lib/mrn_value_decoder.hpp +++ b/storage/mroonga/lib/mrn_value_decoder.hpp @@ -27,6 +27,7 @@ namespace mrn { void decode(uint16 *dest, const uchar *source); void decode(float *dest, const uchar *source); void decode(double *dest, const uchar *source); + void decode(long long int *dest, const uchar *source); } } diff --git a/storage/mroonga/mrn_constants.hpp b/storage/mroonga/mrn_constants.hpp index 5bc6da6b9b6..b11ebe8bd93 100644 --- a/storage/mroonga/mrn_constants.hpp +++ b/storage/mroonga/mrn_constants.hpp @@ -42,8 +42,8 @@ #define MRN_COLUMN_NAME_ID "_id" #define MRN_COLUMN_NAME_KEY "_key" #define MRN_COLUMN_NAME_SCORE "_score" -#ifndef MRN_PARSER_DEFAULT -# define MRN_PARSER_DEFAULT "TokenBigram" +#ifndef MRN_DEFAULT_TOKENIZER +# define MRN_DEFAULT_TOKENIZER "TokenBigram" #endif #endif /* MRN_CONSTANTS_HPP_ */ diff --git a/storage/mroonga/mrn_err.h b/storage/mroonga/mrn_err.h index cd4515a034e..d109f87bb48 100644 --- a/storage/mroonga/mrn_err.h +++ b/storage/mroonga/mrn_err.h @@ -1,4 +1,6 @@ -/* Copyright(C) 2011 Kentoku SHIBA +/* + Copyright(C) 2011 Kentoku SHIBA + Copyright(C) 2014-2015 Kouhei Sutou This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -33,7 +35,7 @@ "The column flag '%-.64s' is unsupported. It is ignored" #define ER_MRN_INVALID_COLUMN_FLAG_NUM 16507 #define ER_MRN_INVALID_COLUMN_FLAG_STR \ - "The column flag '%-.64s' is invalid. '%-64s' is used instead" + "The column flag '%-.64s' is invalid. It is ignored" #define ER_MRN_INVALID_INDEX_FLAG_NUM 16508 #define ER_MRN_INVALID_INDEX_FLAG_STR \ "The index flag '%-.64s' is invalid. It is ignored" diff --git a/storage/mroonga/mrn_mysql_compat.h b/storage/mroonga/mrn_mysql_compat.h index a717220a35c..660c72b4d25 100644 --- a/storage/mroonga/mrn_mysql_compat.h +++ b/storage/mroonga/mrn_mysql_compat.h @@ -33,20 +33,11 @@ #endif #if defined(MRN_MARIADB_P) -# if MYSQL_VERSION_ID >= 50302 && MYSQL_VERSION_ID < 100000 +# if MYSQL_VERSION_ID < 100000 typedef COST_VECT Cost_estimate; # endif #endif -#if MYSQL_VERSION_ID >= 50516 -# define MRN_PLUGIN_HAVE_FLAGS 1 -#endif - -// for MySQL < 5.5 -#ifndef MY_ALL_CHARSETS_SIZE -# define MY_ALL_CHARSETS_SIZE 256 -#endif - #ifndef MRN_MARIADB_P typedef char *range_id_t; #endif @@ -79,9 +70,11 @@ #if MYSQL_VERSION_ID >= 50607 # if MYSQL_VERSION_ID >= 100007 && defined(MRN_MARIADB_P) # define MRN_GET_ERROR_MESSAGE thd_get_error_message(current_thd) +# define MRN_GET_ERROR_NUMBER thd_get_error_number(current_thd) # define MRN_GET_CURRENT_ROW_FOR_WARNING(thd) thd_get_error_row(thd) # else # define MRN_GET_ERROR_MESSAGE current_thd->get_stmt_da()->message() +# define MRN_GET_ERROR_NUMBER current_thd->get_stmt_da()->sql_errno() # if MYSQL_VERSION_ID >= 50706 # define MRN_GET_CURRENT_ROW_FOR_WARNING(thd) \ thd->get_stmt_da()->current_row_for_condition() @@ -91,20 +84,16 @@ # endif # endif #else -# if MYSQL_VERSION_ID >= 50500 -# define MRN_GET_ERROR_MESSAGE current_thd->stmt_da->message() -# define MRN_GET_CURRENT_ROW_FOR_WARNING(thd) thd->warning_info->current_row_for_warning() -# else -# define MRN_GET_ERROR_MESSAGE current_thd->main_da.message() -# define MRN_GET_CURRENT_ROW_FOR_WARNING(thd) thd->row_count -# endif +# define MRN_GET_ERROR_MESSAGE current_thd->stmt_da->message() +# define MRN_GET_ERROR_NUMBER current_thd->stmt_da->sql_errno() +# define MRN_GET_CURRENT_ROW_FOR_WARNING(thd) thd->warning_info->current_row_for_warning() #endif #if MYSQL_VERSION_ID >= 50607 && !defined(MRN_MARIADB_P) # define MRN_ITEM_HAVE_ITEM_NAME #endif -#if MYSQL_VERSION_ID >= 50500 && MYSQL_VERSION_ID < 100000 +#if MYSQL_VERSION_ID < 100000 # define MRN_HAVE_TABLE_DEF_CACHE #endif @@ -124,10 +113,6 @@ # define MRN_TABLE_SHARE_HAVE_LOCK_SHARE #endif -#if MYSQL_VERSION_ID >= 50404 -# define MRN_TABLE_SHARE_HAVE_LOCK_HA_DATA -#endif - #ifndef TIME_FUZZY_DATE /* For MariaDB 10. */ # ifdef TIME_FUZZY_DATES @@ -217,4 +202,42 @@ # define MRN_FORMAT_STRING_LENGTH "u" #endif +#ifdef MRN_MARIADB_P +# define MRN_SUPPORT_CUSTOM_OPTIONS +#endif + +#if defined(MRN_MARIADB_P) && MYSQL_VERSION_ID >= 100000 +# if MYSQL_VERSION_ID >= 100104 +# define mrn_init_sql_alloc(thd, mem_root) \ + init_sql_alloc(mem_root, \ + TABLE_ALLOC_BLOCK_SIZE, \ + 0, \ + MYF(thd->slave_thread ? 0 : MY_THREAD_SPECIFIC)) +# else +# define mrn_init_sql_alloc(thd, mem_root) \ + init_sql_alloc(mem_root, \ + TABLE_ALLOC_BLOCK_SIZE, \ + 0, \ + MYF(0)) +# endif +#else +# define mrn_init_sql_alloc(thd, mem_root) \ + init_sql_alloc(mem_root, \ + TABLE_ALLOC_BLOCK_SIZE, \ + 0) +#endif + +#ifdef MRN_MARIADB_P +# define MRN_ABORT_ON_WARNING(thd) thd->abort_on_warning +#else +# if MYSQL_VERSION_ID >= 50706 +# define MRN_ABORT_ON_WARNING(thd) false +# else +# define MRN_ABORT_ON_WARNING(thd) thd->abort_on_warning +# endif +#endif + +#define MRN_ERROR_CODE_DATA_TRUNCATE(thd) \ + (MRN_ABORT_ON_WARNING(thd) ? ER_WARN_DATA_OUT_OF_RANGE : WARN_DATA_TRUNCATED) + #endif /* MRN_MYSQL_COMPAT_H_ */ diff --git a/storage/mroonga/mrn_table.cpp b/storage/mroonga/mrn_table.cpp index 890d21a415b..af07dc09cf3 100644 --- a/storage/mroonga/mrn_table.cpp +++ b/storage/mroonga/mrn_table.cpp @@ -35,10 +35,18 @@ #include "mrn_variables.hpp" #include -#if MYSQL_VERSION_ID >= 50603 -# define MRN_HA_RESOLVE_BY_NAME(name) ha_resolve_by_name(NULL, (name), TRUE) +#ifdef MRN_MARIADB_P +# if MYSQL_VERSION_ID >= 100100 +# define MRN_HA_RESOLVE_BY_NAME(name) ha_resolve_by_name(NULL, (name), TRUE) +# else +# define MRN_HA_RESOLVE_BY_NAME(name) ha_resolve_by_name(NULL, (name)) +# endif #else -# define MRN_HA_RESOLVE_BY_NAME(name) ha_resolve_by_name(NULL, (name)) +# if MYSQL_VERSION_ID >= 50603 +# define MRN_HA_RESOLVE_BY_NAME(name) ha_resolve_by_name(NULL, (name), TRUE) +# else +# define MRN_HA_RESOLVE_BY_NAME(name) ha_resolve_by_name(NULL, (name)) +# endif #endif #if MYSQL_VERSION_ID >= 50706 && !defined(MRN_MARIADB_P) @@ -68,9 +76,7 @@ extern "C" { # ifdef MRN_TABLE_SHARE_HAVE_LOCK_SHARE extern PSI_mutex_key *mrn_table_share_lock_share; # endif -# ifdef MRN_TABLE_SHARE_HAVE_LOCK_HA_DATA extern PSI_mutex_key *mrn_table_share_lock_ha_data; -# endif # endif extern PSI_mutex_key mrn_share_mutex_key; extern PSI_mutex_key mrn_long_term_share_auto_inc_mutex_key; @@ -80,7 +86,7 @@ extern HASH mrn_open_tables; extern mysql_mutex_t mrn_open_tables_mutex; extern HASH mrn_long_term_share; extern mysql_mutex_t mrn_long_term_share_mutex; -extern char *mrn_default_parser; +extern char *mrn_default_tokenizer; extern char *mrn_default_wrapper_engine; extern handlerton *mrn_hton_ptr; extern HASH mrn_allocated_thds; @@ -333,8 +339,8 @@ int mrn_parse_table_param(MRN_SHARE *share, TABLE *table) for (i = 2; i > 0; i--) #endif { - const char *params_string_value; - uint params_string_length; + const char *params_string_value = NULL; + uint params_string_length = 0; switch (i) { #ifdef WITH_PARTITION_STORAGE_ENGINE @@ -515,16 +521,16 @@ int mrn_add_index_param(MRN_SHARE *share, KEY *key_info, int i) #if MYSQL_VERSION_ID >= 50500 if (key_info->comment.length == 0) { - if (share->key_parser[i]) { - my_free(share->key_parser[i]); + if (share->key_tokenizer[i]) { + my_free(share->key_tokenizer[i]); } - if ( - !(share->key_parser[i] = mrn_my_strdup(mrn_default_parser, MYF(MY_WME))) - ) { + share->key_tokenizer[i] = mrn_my_strdup(mrn_default_tokenizer, MYF(MY_WME)); + if (!share->key_tokenizer[i]) { error = HA_ERR_OUT_OF_MEM; goto error; } - share->key_parser_length[i] = strlen(share->key_parser[i]); + share->key_tokenizer_length[i] = strlen(share->key_tokenizer[i]); + DBUG_RETURN(0); } DBUG_PRINT("info", ("mroonga create comment string")); @@ -572,21 +578,23 @@ int mrn_add_index_param(MRN_SHARE *share, KEY *key_info, int i) MRN_PARAM_STR_LIST("table", index_table, i); break; case 6: - MRN_PARAM_STR_LIST("parser", key_parser, i); + MRN_PARAM_STR_LIST("parser", key_tokenizer, i); + break; + case 9: + MRN_PARAM_STR_LIST("tokenizer", key_tokenizer, i); break; default: break; } } #endif - if (!share->key_parser[i]) { - if ( - !(share->key_parser[i] = mrn_my_strdup(mrn_default_parser, MYF(MY_WME))) - ) { + if (!share->key_tokenizer[i]) { + share->key_tokenizer[i] = mrn_my_strdup(mrn_default_tokenizer, MYF(MY_WME)); + if (!share->key_tokenizer[i]) { error = HA_ERR_OUT_OF_MEM; goto error; } - share->key_parser_length[i] = strlen(share->key_parser[i]); + share->key_tokenizer_length[i] = strlen(share->key_tokenizer[i]); } if (param_string) @@ -687,6 +695,9 @@ int mrn_add_column_param(MRN_SHARE *share, Field *field, int i) case 5: MRN_PARAM_STR_LIST("flags", col_flags, i); break; + case 12: + MRN_PARAM_STR_LIST("groonga_type", col_type, i); + break; default: break; } @@ -741,8 +752,8 @@ int mrn_free_share_alloc( { if (share->index_table && share->index_table[i]) my_free(share->index_table[i]); - if (share->key_parser[i]) - my_free(share->key_parser[i]); + if (share->key_tokenizer[i]) + my_free(share->key_tokenizer[i]); } for (i = 0; i < share->table_share->fields; i++) { @@ -817,9 +828,9 @@ error_alloc_long_term_share: MRN_SHARE *mrn_get_share(const char *table_name, TABLE *table, int *error) { MRN_SHARE *share; - char *tmp_name, **index_table, **key_parser, **col_flags, **col_type; + char *tmp_name, **index_table, **key_tokenizer, **col_flags, **col_type; uint length, *wrap_key_nr, *index_table_length; - uint *key_parser_length, *col_flags_length, *col_type_length, i, j; + uint *key_tokenizer_length, *col_flags_length, *col_type_length, i, j; KEY *wrap_key_info; TABLE_SHARE *wrap_table_share; MRN_DBUG_ENTER_FUNCTION(); @@ -834,8 +845,8 @@ MRN_SHARE *mrn_get_share(const char *table_name, TABLE *table, int *error) &tmp_name, length + 1, &index_table, sizeof(char *) * table->s->keys, &index_table_length, sizeof(uint) * table->s->keys, - &key_parser, sizeof(char *) * table->s->keys, - &key_parser_length, sizeof(uint) * table->s->keys, + &key_tokenizer, sizeof(char *) * table->s->keys, + &key_tokenizer_length, sizeof(uint) * table->s->keys, &col_flags, sizeof(char *) * table->s->fields, &col_flags_length, sizeof(uint) * table->s->fields, &col_type, sizeof(char *) * table->s->fields, @@ -853,8 +864,8 @@ MRN_SHARE *mrn_get_share(const char *table_name, TABLE *table, int *error) share->table_name = tmp_name; share->index_table = index_table; share->index_table_length = index_table_length; - share->key_parser = key_parser; - share->key_parser_length = key_parser_length; + share->key_tokenizer = key_tokenizer; + share->key_tokenizer_length = key_tokenizer_length; share->col_flags = col_flags; share->col_flags_length = col_flags_length; share->col_type = col_type; @@ -903,6 +914,7 @@ MRN_SHARE *mrn_get_share(const char *table_name, TABLE *table, int *error) share->wrap_primary_key = MAX_KEY; } memcpy(wrap_table_share, table->s, sizeof(*wrap_table_share)); + mrn_init_sql_alloc(current_thd, &(wrap_table_share->mem_root)); wrap_table_share->keys = share->wrap_keys; wrap_table_share->key_info = share->wrap_key_info; wrap_table_share->primary_key = share->wrap_primary_key; @@ -917,20 +929,18 @@ MRN_SHARE *mrn_get_share(const char *table_name, TABLE *table, int *error) &(wrap_table_share->LOCK_share), MY_MUTEX_INIT_SLOW); # endif #endif -#ifdef MRN_TABLE_SHARE_HAVE_LOCK_HA_DATA -# ifdef WIN32 +#ifdef WIN32 mysql_mutex_init(*mrn_table_share_lock_ha_data, &(wrap_table_share->LOCK_ha_data), MY_MUTEX_INIT_FAST); -# else +#else mysql_mutex_init(key_TABLE_SHARE_LOCK_ha_data, &(wrap_table_share->LOCK_ha_data), MY_MUTEX_INIT_FAST); -# endif #endif share->wrap_table_share = wrap_table_share; } if (mysql_mutex_init(mrn_share_mutex_key, - &share->mutex, + &share->record_mutex, MY_MUTEX_INIT_FAST) != 0) { *error = HA_ERR_OUT_OF_MEM; @@ -953,7 +963,7 @@ MRN_SHARE *mrn_get_share(const char *table_name, TABLE *table, int *error) error_hash_insert: error_get_long_term_share: - mysql_mutex_destroy(&share->mutex); + mysql_mutex_destroy(&share->record_mutex); error_init_mutex: error_parse_table_param: mrn_free_share_alloc(share); @@ -973,14 +983,13 @@ int mrn_free_share(MRN_SHARE *share) plugin_unlock(NULL, share->plugin); mrn_free_share_alloc(share); thr_lock_delete(&share->lock); - mysql_mutex_destroy(&share->mutex); + mysql_mutex_destroy(&share->record_mutex); if (share->wrapper_mode) { #ifdef MRN_TABLE_SHARE_HAVE_LOCK_SHARE mysql_mutex_destroy(&(share->wrap_table_share->LOCK_share)); #endif -#ifdef MRN_TABLE_SHARE_HAVE_LOCK_HA_DATA mysql_mutex_destroy(&(share->wrap_table_share->LOCK_ha_data)); -#endif + free_root(&(share->wrap_table_share->mem_root), MYF(0)); } my_free(share); } @@ -1114,7 +1123,7 @@ st_mrn_slot_data *mrn_get_slot_data(THD *thd, bool can_create) if (slot_data == NULL) { slot_data = (st_mrn_slot_data*) malloc(sizeof(st_mrn_slot_data)); slot_data->last_insert_record_id = GRN_ID_NIL; - slot_data->first_alter_share = NULL; + slot_data->first_wrap_hton = NULL; slot_data->alter_create_info = NULL; slot_data->disable_keys_create_info = NULL; slot_data->alter_connect_string = NULL; @@ -1132,22 +1141,21 @@ st_mrn_slot_data *mrn_get_slot_data(THD *thd, bool can_create) DBUG_RETURN(slot_data); } -void mrn_clear_alter_share(THD *thd) +void mrn_clear_slot_data(THD *thd) { MRN_DBUG_ENTER_FUNCTION(); st_mrn_slot_data *slot_data = mrn_get_slot_data(thd, FALSE); if (slot_data) { - if (slot_data->first_alter_share) { - st_mrn_alter_share *tmp_alter_share; - st_mrn_alter_share *alter_share = slot_data->first_alter_share; - while (alter_share) + if (slot_data->first_wrap_hton) { + st_mrn_wrap_hton *tmp_wrap_hton; + st_mrn_wrap_hton *wrap_hton = slot_data->first_wrap_hton; + while (wrap_hton) { - tmp_alter_share = alter_share->next; - mrn_free_tmp_table_share(alter_share->alter_share); - free(alter_share); - alter_share = tmp_alter_share; + tmp_wrap_hton = wrap_hton->next; + free(wrap_hton); + wrap_hton = tmp_wrap_hton; } - slot_data->first_alter_share = NULL; + slot_data->first_wrap_hton = NULL; } slot_data->alter_create_info = NULL; slot_data->disable_keys_create_info = NULL; diff --git a/storage/mroonga/mrn_table.hpp b/storage/mroonga/mrn_table.hpp index 9118455b53d..0066fc23f08 100644 --- a/storage/mroonga/mrn_table.hpp +++ b/storage/mroonga/mrn_table.hpp @@ -1,7 +1,7 @@ /* -*- c-basic-offset: 2 -*- */ /* Copyright(C) 2011-2013 Kentoku SHIBA - Copyright(C) 2011-2013 Kouhei Sutou + Copyright(C) 2011-2015 Kouhei Sutou This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -43,7 +43,7 @@ typedef struct st_mroonga_share char *table_name; uint table_name_length; uint use_count; - mysql_mutex_t mutex; + mysql_mutex_t record_mutex; THR_LOCK lock; TABLE_SHARE *table_share; TABLE_SHARE *wrap_table_share; @@ -60,11 +60,11 @@ typedef struct st_mroonga_share plugin_ref plugin; handlerton *hton; char **index_table; - char **key_parser; + char **key_tokenizer; char **col_flags; char **col_type; uint *index_table_length; - uint *key_parser_length; + uint *key_tokenizer_length; uint *col_flags_length; uint *col_type_length; uint *wrap_key_nr; @@ -78,17 +78,17 @@ typedef struct st_mroonga_share bool disable_keys; } MRN_SHARE; -struct st_mrn_alter_share +struct st_mrn_wrap_hton { char path[FN_REFLEN + 1]; - TABLE_SHARE *alter_share; - st_mrn_alter_share *next; + handlerton *hton; + st_mrn_wrap_hton *next; }; struct st_mrn_slot_data { grn_id last_insert_record_id; - st_mrn_alter_share *first_alter_share; + st_mrn_wrap_hton *first_wrap_hton; HA_CREATE_INFO *alter_create_info; HA_CREATE_INFO *disable_keys_create_info; char *alter_connect_string; @@ -167,7 +167,7 @@ void mrn_free_tmp_table_share(TABLE_SHARE *table_share); KEY *mrn_create_key_info_for_table(MRN_SHARE *share, TABLE *table, int *error); void mrn_set_bitmap_by_key(MY_BITMAP *map, KEY *key_info); st_mrn_slot_data *mrn_get_slot_data(THD *thd, bool can_create); -void mrn_clear_alter_share(THD *thd); +void mrn_clear_slot_data(THD *thd); #ifdef __cplusplus } diff --git a/storage/mroonga/mysql-test/mroonga/include/mroonga/check_libgroonga_embedded.inc b/storage/mroonga/mysql-test/mroonga/include/mroonga/check_libgroonga_embedded.inc new file mode 100644 index 00000000000..02c21ff32c6 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/include/mroonga/check_libgroonga_embedded.inc @@ -0,0 +1,19 @@ +# Copyright(C) 2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--disable_query_log +let $libgroonga_embedded = `SELECT @@mroonga_libgroonga_embedded;`; +--enable_query_log diff --git a/storage/mroonga/mysql-test/mroonga/include/mroonga/have_groonga_plugin_register.inc b/storage/mroonga/mysql-test/mroonga/include/mroonga/have_groonga_plugin_register.inc new file mode 100644 index 00000000000..414eb1702de --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/include/mroonga/have_groonga_plugin_register.inc @@ -0,0 +1,22 @@ +# Copyright(C) 2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/check_libgroonga_embedded.inc + +if ($libgroonga_embedded) { + --source ../../include/mroonga/have_mroonga_deinit.inc + skip "This test requires plugin_register of Groonga. libgroonga embedded build doesn't support it."; +} diff --git a/storage/mroonga/mysql-test/mroonga/include/mroonga/have_fulltext_index_comment.inc b/storage/mroonga/mysql-test/mroonga/include/mroonga/have_mariadb.inc similarity index 73% rename from storage/mroonga/mysql-test/mroonga/include/mroonga/have_fulltext_index_comment.inc rename to storage/mroonga/mysql-test/mroonga/include/mroonga/have_mariadb.inc index e8c79936cc6..24c65a61dd9 100644 --- a/storage/mroonga/mysql-test/mroonga/include/mroonga/have_fulltext_index_comment.inc +++ b/storage/mroonga/mysql-test/mroonga/include/mroonga/have_mariadb.inc @@ -1,4 +1,4 @@ -# Copyright(C) 2012 Kouhei Sutou +# Copyright(C) 2015 Kouhei Sutou # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -14,12 +14,8 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---source ../../include/mroonga/check_version.inc +--source ../../include/mroonga/check_mariadb.inc -if ($version_55_or_later) { - let $fulltext_index_comment = 1; -} - -if (!$fulltext_index_comment) { - skip Fulltext index comment is available in version 5.5 or later; +if (!$mariadb) { + skip This test is for MariaDB; } diff --git a/storage/mroonga/mysql-test/mroonga/include/mroonga/have_mroonga.inc b/storage/mroonga/mysql-test/mroonga/include/mroonga/have_mroonga.inc index 2ebec2df8c4..cd17adebfe9 100644 --- a/storage/mroonga/mysql-test/mroonga/include/mroonga/have_mroonga.inc +++ b/storage/mroonga/mysql-test/mroonga/include/mroonga/have_mroonga.inc @@ -38,6 +38,9 @@ if (!$have_default_storage_engine_variable) { let have_default_tmp_storage_engine_variable=`SELECT 1 FROM information_schema.global_variables WHERE variable_name = "default_tmp_storage_engine"`; if ($have_default_tmp_storage_engine_variable) { let original_default_tmp_storage_engine=`SELECT variable_value FROM information_schema.global_variables WHERE variable_name = "default_tmp_storage_engine"`; + if (!$original_default_tmp_storage_engine) { + let original_default_tmp_storage_engine=NULL; + } set default_tmp_storage_engine=Mroonga; } diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/alter_table_add_column_with_flags.result b/storage/mroonga/mysql-test/mroonga/storage/r/alter_table_add_column_flags_comment.result similarity index 100% rename from storage/mroonga/mysql-test/mroonga/storage/r/alter_table_add_column_with_flags.result rename to storage/mroonga/mysql-test/mroonga/storage/r/alter_table_add_column_flags_comment.result diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/alter_table_add_column_flags_parameter.result b/storage/mroonga/mysql-test/mroonga/storage/r/alter_table_add_column_flags_parameter.result new file mode 100644 index 00000000000..6f2a1870ac7 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/r/alter_table_add_column_flags_parameter.result @@ -0,0 +1,17 @@ +CREATE TABLE tags ( +id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY +) DEFAULT CHARSET=utf8; +ALTER TABLE tags ADD COLUMN name VARCHAR(64) FLAGS='COLUMN_VECTOR'; +SHOW CREATE TABLE tags; +Table Create Table +tags CREATE TABLE `tags` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(64) DEFAULT NULL `FLAGS`='COLUMN_VECTOR', + PRIMARY KEY (`id`) +) ENGINE=Mroonga DEFAULT CHARSET=utf8 +SELECT mroonga_command("dump --dump_plugins no"); +mroonga_command("dump --dump_plugins no") +table_create tags TABLE_PAT_KEY UInt32 +column_create tags id COLUMN_SCALAR UInt32 +column_create tags name COLUMN_VECTOR ShortText +DROP TABLE tags; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/alter_table_add_column_groonga_type_comment.result b/storage/mroonga/mysql-test/mroonga/storage/r/alter_table_add_column_groonga_type_comment.result new file mode 100644 index 00000000000..0bd8985f2e8 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/r/alter_table_add_column_groonga_type_comment.result @@ -0,0 +1,18 @@ +CREATE TABLE tags ( +id INT UNSIGNED PRIMARY KEY +) DEFAULT CHARSET=utf8; +CREATE TABLE bugs ( +id INT UNSIGNED PRIMARY KEY +) DEFAULT CHARSET=utf8; +ALTER TABLE bugs ADD COLUMN name VARCHAR(64) COMMENT 'groonga_type "tags"'; +SELECT mroonga_command("dump --dump_plugins no"); +mroonga_command("dump --dump_plugins no") +table_create tags TABLE_PAT_KEY UInt32 +column_create tags id COLUMN_SCALAR UInt32 + +table_create bugs TABLE_PAT_KEY UInt32 +column_create bugs id COLUMN_SCALAR UInt32 + +column_create bugs name COLUMN_SCALAR tags +DROP TABLE bugs; +DROP TABLE tags; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/alter_table_add_column_groonga_type_parameter.result b/storage/mroonga/mysql-test/mroonga/storage/r/alter_table_add_column_groonga_type_parameter.result new file mode 100644 index 00000000000..fe484372999 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/r/alter_table_add_column_groonga_type_parameter.result @@ -0,0 +1,26 @@ +CREATE TABLE tags ( +id INT UNSIGNED PRIMARY KEY +) DEFAULT CHARSET=utf8; +CREATE TABLE bugs ( +id INT UNSIGNED PRIMARY KEY +) DEFAULT CHARSET=utf8; +ALTER TABLE bugs ADD COLUMN name VARCHAR(64) GROONGA_TYPE='tags'; +SHOW CREATE TABLE bugs; +Table Create Table +bugs CREATE TABLE `bugs` ( + `id` int(10) unsigned NOT NULL, + `name` varchar(64) DEFAULT NULL `GROONGA_TYPE`='tags', + PRIMARY KEY (`id`), + CONSTRAINT `name` FOREIGN KEY (`name`) REFERENCES `test`.`tags` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE=Mroonga DEFAULT CHARSET=utf8 +SELECT mroonga_command("dump --dump_plugins no"); +mroonga_command("dump --dump_plugins no") +table_create tags TABLE_PAT_KEY UInt32 +column_create tags id COLUMN_SCALAR UInt32 + +table_create bugs TABLE_PAT_KEY UInt32 +column_create bugs id COLUMN_SCALAR UInt32 + +column_create bugs name COLUMN_SCALAR tags +DROP TABLE bugs; +DROP TABLE tags; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/alter_table_add_column_with_type.result b/storage/mroonga/mysql-test/mroonga/storage/r/alter_table_add_column_type_comment.result similarity index 100% rename from storage/mroonga/mysql-test/mroonga/storage/r/alter_table_add_column_with_type.result rename to storage/mroonga/mysql-test/mroonga/storage/r/alter_table_add_column_type_comment.result diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/alter_table_add_index_token_filters_one_token_filter.result b/storage/mroonga/mysql-test/mroonga/storage/r/alter_table_add_index_token_filters_one_token_filter.result index 21784decb88..65e608dddeb 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/r/alter_table_add_index_token_filters_one_token_filter.result +++ b/storage/mroonga/mysql-test/mroonga/storage/r/alter_table_add_index_token_filters_one_token_filter.result @@ -1,5 +1,5 @@ -SELECT mroonga_command("register token_filters/stop_word"); -mroonga_command("register token_filters/stop_word") +SELECT mroonga_command("plugin_register token_filters/stop_word"); +mroonga_command("plugin_register token_filters/stop_word") true SET NAMES utf8; CREATE TABLE memos ( diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/alter_table_change_token_filter.result b/storage/mroonga/mysql-test/mroonga/storage/r/alter_table_change_token_filter.result index 1c96236230b..60d302cc6a5 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/r/alter_table_change_token_filter.result +++ b/storage/mroonga/mysql-test/mroonga/storage/r/alter_table_change_token_filter.result @@ -1,5 +1,5 @@ -SELECT mroonga_command("register token_filters/stop_word"); -mroonga_command("register token_filters/stop_word") +SELECT mroonga_command("plugin_register token_filters/stop_word"); +mroonga_command("plugin_register token_filters/stop_word") true CREATE TABLE terms ( term VARCHAR(64) NOT NULL PRIMARY KEY, diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/column_datetime_zero_date_strict.result b/storage/mroonga/mysql-test/mroonga/storage/r/column_datetime_zero_date_strict.result new file mode 100644 index 00000000000..c4d73e2f57d --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/r/column_datetime_zero_date_strict.result @@ -0,0 +1,23 @@ +DROP TABLE IF EXISTS timestamps; +CREATE TABLE timestamps ( +id INT PRIMARY KEY AUTO_INCREMENT, +create_dt DATETIME +) DEFAULT CHARSET UTF8; +SHOW CREATE TABLE timestamps; +Table Create Table +timestamps CREATE TABLE `timestamps` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `create_dt` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=Mroonga DEFAULT CHARSET=utf8 +SET sql_mode='STRICT_TRANS_TABLES'; +INSERT INTO timestamps (create_dt) VALUES ("0000-00-00 00:00:00"); +ERROR 22003: Out of range value for column 'create_dt' at row 1 +SET sql_mode=default; +SELECT * FROM timestamps; +id create_dt +INSERT INTO timestamps (create_dt) VALUES ("2015-06-17 00:00:00"); +SELECT * FROM timestamps; +id create_dt +2 2015-06-17 00:00:00 +DROP TABLE timestamps; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_vector.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_field_flags_comment.result similarity index 100% rename from storage/mroonga/mysql-test/mroonga/storage/r/create_table_vector.result rename to storage/mroonga/mysql-test/mroonga/storage/r/create_table_field_flags_comment.result diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_field_flags_parameter.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_field_flags_parameter.result new file mode 100644 index 00000000000..9e089e53f49 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_field_flags_parameter.result @@ -0,0 +1,17 @@ +CREATE TABLE bugs ( +id INT UNSIGNED PRIMARY KEY, +tags TEXT FLAGS='COLUMN_VECTOR' +) DEFAULT CHARSET=utf8; +SHOW CREATE TABLE bugs; +Table Create Table +bugs CREATE TABLE `bugs` ( + `id` int(10) unsigned NOT NULL, + `tags` text `FLAGS`='COLUMN_VECTOR', + PRIMARY KEY (`id`) +) ENGINE=Mroonga DEFAULT CHARSET=utf8 +SELECT mroonga_command("dump --dump_plugins no"); +mroonga_command("dump --dump_plugins no") +table_create bugs TABLE_PAT_KEY UInt32 +column_create bugs id COLUMN_SCALAR UInt32 +column_create bugs tags COLUMN_VECTOR LongText +DROP TABLE bugs; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_field_groonga_type_comment.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_field_groonga_type_comment.result new file mode 100644 index 00000000000..5e5980ac62b --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_field_groonga_type_comment.result @@ -0,0 +1,18 @@ +CREATE TABLE tags ( +name VARCHAR(64) PRIMARY KEY +) DEFAULT CHARSET=utf8 COLLATE=utf8_bin; +CREATE TABLE bugs ( +id INT UNSIGNED PRIMARY KEY, +tag VARCHAR(64) COMMENT 'groonga_type "tags"' +) DEFAULT CHARSET=utf8; +SELECT mroonga_command("dump --dump_plugins no"); +mroonga_command("dump --dump_plugins no") +table_create tags TABLE_PAT_KEY ShortText +column_create tags name COLUMN_SCALAR ShortText + +table_create bugs TABLE_PAT_KEY UInt32 +column_create bugs id COLUMN_SCALAR UInt32 + +column_create bugs tag COLUMN_SCALAR tags +DROP TABLE bugs; +DROP TABLE tags; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_field_groonga_type_nonexistent.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_field_groonga_type_nonexistent.result new file mode 100644 index 00000000000..99dc30aaa02 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_field_groonga_type_nonexistent.result @@ -0,0 +1,6 @@ +DROP TABLE IF EXISTS bugs; +CREATE TABLE bugs ( +id INT UNSIGNED PRIMARY KEY, +tag VARCHAR(64) COMMENT 'groonga_type "Nonexistent"' +) DEFAULT CHARSET=utf8mb4; +ERROR HY000: unknown custom Groonga type name for column: diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_field_groonga_type_parameter.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_field_groonga_type_parameter.result new file mode 100644 index 00000000000..24941f043c7 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_field_groonga_type_parameter.result @@ -0,0 +1,26 @@ +CREATE TABLE tags ( +name VARCHAR(64) PRIMARY KEY +) DEFAULT CHARSET=utf8 COLLATE=utf8_bin; +CREATE TABLE bugs ( +id INT UNSIGNED PRIMARY KEY, +tag VARCHAR(64) GROONGA_TYPE='tags' +) DEFAULT CHARSET=utf8; +SHOW CREATE TABLE bugs; +Table Create Table +bugs CREATE TABLE `bugs` ( + `id` int(10) unsigned NOT NULL, + `tag` varchar(64) DEFAULT NULL `GROONGA_TYPE`='tags', + PRIMARY KEY (`id`), + CONSTRAINT `tag` FOREIGN KEY (`tag`) REFERENCES `test`.`tags` (`name`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE=Mroonga DEFAULT CHARSET=utf8 +SELECT mroonga_command("dump --dump_plugins no"); +mroonga_command("dump --dump_plugins no") +table_create tags TABLE_PAT_KEY ShortText +column_create tags name COLUMN_SCALAR ShortText + +table_create bugs TABLE_PAT_KEY UInt32 +column_create bugs id COLUMN_SCALAR UInt32 + +column_create bugs tag COLUMN_SCALAR tags +DROP TABLE bugs; +DROP TABLE tags; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_reference_type.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_field_type_comment.result similarity index 100% rename from storage/mroonga/mysql-test/mroonga/storage/r/create_table_reference_type.result rename to storage/mroonga/mysql-test/mroonga/storage/r/create_table_field_type_comment.result diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_field_type_nonexistent.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_field_type_nonexistent.result new file mode 100644 index 00000000000..a66a2bd2185 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_field_type_nonexistent.result @@ -0,0 +1,6 @@ +DROP TABLE IF EXISTS bugs; +CREATE TABLE bugs ( +id INT UNSIGNED PRIMARY KEY, +tag VARCHAR(64) COMMENT 'type "Nonexistent"' +) DEFAULT CHARSET=utf8mb4; +ERROR HY000: unknown custom Groonga type name for column: diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_flags_comment.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_flags_comment.result new file mode 100644 index 00000000000..828de3ebbad --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_flags_comment.result @@ -0,0 +1,9 @@ +SET NAMES utf8; +CREATE TABLE memos ( +content VARCHAR(64) NOT NULL, +FULLTEXT INDEX (content) COMMENT 'flags "WITH_POSITION|WITH_WEIGHT"' +) DEFAULT CHARSET=utf8; +SELECT mroonga_command("dump --dump_plugins no --dump_schema no"); +mroonga_command("dump --dump_plugins no --dump_schema no") +column_create memos-content index COLUMN_INDEX|WITH_WEIGHT|WITH_POSITION memos content +DROP TABLE memos; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_flags_none.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_flags_none.result index c9283db72bb..b5368b433e6 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_flags_none.result +++ b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_flags_none.result @@ -1,7 +1,7 @@ SET NAMES utf8; CREATE TABLE memos ( content VARCHAR(64) NOT NULL, -FULLTEXT INDEX (content) COMMENT 'index_flags "NONE"' +FULLTEXT INDEX (content) COMMENT 'flags "NONE"' ) DEFAULT CHARSET=utf8; SELECT mroonga_command("dump --dump_plugins no --dump_schema no"); mroonga_command("dump --dump_plugins no --dump_schema no") diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_flags_parameter.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_flags_parameter.result new file mode 100644 index 00000000000..7e0d29a1e1f --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_flags_parameter.result @@ -0,0 +1,15 @@ +SET NAMES utf8; +CREATE TABLE memos ( +content VARCHAR(64) NOT NULL, +FULLTEXT INDEX (content) FLAGS='WITH_POSITION|WITH_WEIGHT' +) DEFAULT CHARSET=utf8; +SHOW CREATE TABLE memos; +Table Create Table +memos CREATE TABLE `memos` ( + `content` varchar(64) NOT NULL, + FULLTEXT KEY `content` (`content`) `FLAGS`='WITH_POSITION|WITH_WEIGHT' +) ENGINE=Mroonga DEFAULT CHARSET=utf8 +SELECT mroonga_command("dump --dump_plugins no --dump_schema no"); +mroonga_command("dump --dump_plugins no --dump_schema no") +column_create memos-content index COLUMN_INDEX|WITH_WEIGHT|WITH_POSITION memos content +DROP TABLE memos; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_index_flags_none.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_index_flags_none.result new file mode 100644 index 00000000000..c9283db72bb --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_index_flags_none.result @@ -0,0 +1,9 @@ +SET NAMES utf8; +CREATE TABLE memos ( +content VARCHAR(64) NOT NULL, +FULLTEXT INDEX (content) COMMENT 'index_flags "NONE"' +) DEFAULT CHARSET=utf8; +SELECT mroonga_command("dump --dump_plugins no --dump_schema no"); +mroonga_command("dump --dump_plugins no --dump_schema no") +column_create memos-content index COLUMN_INDEX memos content +DROP TABLE memos; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_flags_with_position_and_with_weight.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_index_flags_with_position_and_with_weight.result similarity index 100% rename from storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_flags_with_position_and_with_weight.result rename to storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_index_flags_with_position_and_with_weight.result diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_normalizer_fulltext_index_comment.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_normalizer_comment.result similarity index 100% rename from storage/mroonga/mysql-test/mroonga/storage/r/create_table_normalizer_fulltext_index_comment.result rename to storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_normalizer_comment.result diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_normalizer_fulltext_index_no_utf8_charset_with_utf8_normalizer.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_normalizer_no_utf8_charset_with_utf8_normalizer.result similarity index 100% rename from storage/mroonga/mysql-test/mroonga/storage/r/create_table_normalizer_fulltext_index_no_utf8_charset_with_utf8_normalizer.result rename to storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_normalizer_no_utf8_charset_with_utf8_normalizer.result diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_normalizer_fulltext_index_none.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_normalizer_none.result similarity index 100% rename from storage/mroonga/mysql-test/mroonga/storage/r/create_table_normalizer_fulltext_index_none.result rename to storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_normalizer_none.result diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_normalizer_parameter.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_normalizer_parameter.result new file mode 100644 index 00000000000..d68de436c92 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_normalizer_parameter.result @@ -0,0 +1,21 @@ +DROP TABLE IF EXISTS memos; +SET NAMES utf8; +CREATE TABLE memos ( +id INT NOT NULL PRIMARY KEY, +content TEXT NOT NULL, +FULLTEXT INDEX (content) NORMALIZER='NormalizerAuto' +) DEFAULT CHARSET=utf8; +SHOW CREATE TABLE memos; +Table Create Table +memos CREATE TABLE `memos` ( + `id` int(11) NOT NULL, + `content` text NOT NULL, + PRIMARY KEY (`id`), + FULLTEXT KEY `content` (`content`) `NORMALIZER`='NormalizerAuto' +) ENGINE=Mroonga DEFAULT CHARSET=utf8 +INSERT INTO memos VALUES (1, "1日の消費㌍は約2000㌔㌍"); +SELECT * FROM memos +WHERE MATCH (content) AGAINST ("+カロリー" IN BOOLEAN MODE); +id content +1 1日の消費㌍は約2000㌔㌍ +DROP TABLE memos; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_parser_comment.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_parser_comment.result new file mode 100644 index 00000000000..4088caf49d5 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_parser_comment.result @@ -0,0 +1,31 @@ +DROP TABLE IF EXISTS diaries; +CREATE TABLE diaries ( +id int PRIMARY KEY AUTO_INCREMENT, +body text, +FULLTEXT INDEX body_index (body) +COMMENT 'parser "TokenBigramSplitSymbolAlphaDigit"' +) DEFAULT CHARSET utf8; +SHOW CREATE TABLE diaries; +Table Create Table +diaries CREATE TABLE `diaries` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `body` text, + PRIMARY KEY (`id`), + FULLTEXT KEY `body_index` (`body`) COMMENT 'parser "TokenBigramSplitSymbolAlphaDigit"' +) ENGINE=Mroonga DEFAULT CHARSET=utf8 +INSERT INTO diaries (body) VALUES ("will start Groonga!"); +INSERT INTO diaries (body) VALUES ("starting Groonga..."); +INSERT INTO diaries (body) VALUES ("started Groonga."); +SELECT * FROM diaries; +id body +1 will start Groonga! +2 starting Groonga... +3 started Groonga. +SELECT * FROM diaries +WHERE MATCH(body) AGAINST("+start" IN BOOLEAN MODE) +ORDER BY id; +id body +1 will start Groonga! +2 starting Groonga... +3 started Groonga. +DROP TABLE diaries; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_parser_default.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_parser_default.result similarity index 58% rename from storage/mroonga/mysql-test/mroonga/storage/r/fulltext_parser_default.result rename to storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_parser_default.result index 6c04cae59f2..a18614d19fc 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_parser_default.result +++ b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_parser_default.result @@ -14,20 +14,20 @@ diaries CREATE TABLE `diaries` ( PRIMARY KEY (`id`), FULLTEXT KEY `body_index` (`body`) ) ENGINE=Mroonga DEFAULT CHARSET=utf8 -insert into diaries (body) values ("will start groonga!"); -insert into diaries (body) values ("starting groonga..."); -insert into diaries (body) values ("started groonga."); -insert into diaries (body) values ("finished groonga."); +insert into diaries (body) values ("will start Groonga!"); +insert into diaries (body) values ("starting Groonga..."); +insert into diaries (body) values ("started Groonga."); +insert into diaries (body) values ("finished Groonga."); select * from diaries; id body -1 will start groonga! -2 starting groonga... -3 started groonga. -4 finished groonga. -select * from diaries where match(body) against("start"); +1 will start Groonga! +2 starting Groonga... +3 started Groonga. +4 finished Groonga. +select * from diaries where match(body) against("+start" IN BOOLEAN MODE) order by id; id body -1 will start groonga! -2 starting groonga... -3 started groonga. +1 will start Groonga! +2 starting Groonga... +3 started Groonga. drop table diaries; set global mroonga_default_parser=@mroonga_default_parser_backup; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_parser_off.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_parser_off.result similarity index 100% rename from storage/mroonga/mysql-test/mroonga/storage/r/fulltext_parser_off.result rename to storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_parser_off.result diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_token_filters_index_comment_multiple_token_filters.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_token_filters_multiple_token_filters.result similarity index 83% rename from storage/mroonga/mysql-test/mroonga/storage/r/create_table_token_filters_index_comment_multiple_token_filters.result rename to storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_token_filters_multiple_token_filters.result index 785c5d785b9..c730bafc8e3 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_token_filters_index_comment_multiple_token_filters.result +++ b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_token_filters_multiple_token_filters.result @@ -1,5 +1,5 @@ -SELECT mroonga_command("register token_filters/stop_word"); -mroonga_command("register token_filters/stop_word") +SELECT mroonga_command("plugin_register token_filters/stop_word"); +mroonga_command("plugin_register token_filters/stop_word") true SET NAMES utf8; CREATE TABLE memos ( diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_token_filters_index_comment_one_token_filter.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_token_filters_one_token_filter.result similarity index 82% rename from storage/mroonga/mysql-test/mroonga/storage/r/create_table_token_filters_index_comment_one_token_filter.result rename to storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_token_filters_one_token_filter.result index 9ce60054300..e0809eb0f4b 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_token_filters_index_comment_one_token_filter.result +++ b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_token_filters_one_token_filter.result @@ -1,5 +1,5 @@ -SELECT mroonga_command("register token_filters/stop_word"); -mroonga_command("register token_filters/stop_word") +SELECT mroonga_command("plugin_register token_filters/stop_word"); +mroonga_command("plugin_register token_filters/stop_word") true SET NAMES utf8; CREATE TABLE memos ( diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_token_filters_parameter.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_token_filters_parameter.result new file mode 100644 index 00000000000..df529282a91 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_token_filters_parameter.result @@ -0,0 +1,23 @@ +SELECT mroonga_command("plugin_register token_filters/stop_word"); +mroonga_command("plugin_register token_filters/stop_word") +true +SET NAMES utf8; +CREATE TABLE memos ( +content VARCHAR(64) NOT NULL, +FULLTEXT INDEX (content) TOKEN_FILTERS='TokenFilterStopWord,TokenFilterStopWord' +) DEFAULT CHARSET=utf8; +SHOW CREATE TABLE memos; +Table Create Table +memos CREATE TABLE `memos` ( + `content` varchar(64) NOT NULL, + FULLTEXT KEY `content` (`content`) `TOKEN_FILTERS`='TokenFilterStopWord,TokenFilterStopWord' +) ENGINE=Mroonga DEFAULT CHARSET=utf8 +SELECT mroonga_command("dump --dump_plugins no"); +mroonga_command("dump --dump_plugins no") +table_create memos TABLE_NO_KEY +column_create memos content COLUMN_SCALAR ShortText + +table_create memos-content TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerMySQLGeneralCI --token_filters TokenFilterStopWord,TokenFilterStopWord + +column_create memos-content index COLUMN_INDEX|WITH_POSITION memos content +DROP TABLE memos; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_tokenizer_comment.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_tokenizer_comment.result new file mode 100644 index 00000000000..5b8d0cd780e --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_tokenizer_comment.result @@ -0,0 +1,31 @@ +DROP TABLE IF EXISTS diaries; +CREATE TABLE diaries ( +id int PRIMARY KEY AUTO_INCREMENT, +body text, +FULLTEXT INDEX body_index (body) +COMMENT 'tokenizer "TokenBigramSplitSymbolAlphaDigit"' +) DEFAULT CHARSET utf8; +SHOW CREATE TABLE diaries; +Table Create Table +diaries CREATE TABLE `diaries` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `body` text, + PRIMARY KEY (`id`), + FULLTEXT KEY `body_index` (`body`) COMMENT 'tokenizer "TokenBigramSplitSymbolAlphaDigit"' +) ENGINE=Mroonga DEFAULT CHARSET=utf8 +INSERT INTO diaries (body) VALUES ("will start Groonga!"); +INSERT INTO diaries (body) VALUES ("starting Groonga..."); +INSERT INTO diaries (body) VALUES ("started Groonga."); +SELECT * FROM diaries; +id body +1 will start Groonga! +2 starting Groonga... +3 started Groonga. +SELECT * FROM diaries +WHERE MATCH(body) AGAINST("+start" IN BOOLEAN MODE) +ORDER BY id; +id body +1 will start Groonga! +2 starting Groonga... +3 started Groonga. +DROP TABLE diaries; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_tokenizer_default.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_tokenizer_default.result new file mode 100644 index 00000000000..9efa08bab53 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_tokenizer_default.result @@ -0,0 +1,33 @@ +drop table if exists diaries; +set @mroonga_default_tokenizer_backup=@@mroonga_default_tokenizer; +set global mroonga_default_tokenizer=TokenBigramSplitSymbolAlphaDigit; +create table diaries ( +id int primary key auto_increment, +body text, +fulltext index body_index (body) +) default charset utf8; +show create table diaries; +Table Create Table +diaries CREATE TABLE `diaries` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `body` text, + PRIMARY KEY (`id`), + FULLTEXT KEY `body_index` (`body`) +) ENGINE=Mroonga DEFAULT CHARSET=utf8 +insert into diaries (body) values ("will start Groonga!"); +insert into diaries (body) values ("starting Groonga..."); +insert into diaries (body) values ("started Groonga."); +insert into diaries (body) values ("finished Groonga."); +select * from diaries; +id body +1 will start Groonga! +2 starting Groonga... +3 started Groonga. +4 finished Groonga. +select * from diaries where match(body) against("+start" IN BOOLEAN MODE) order by id; +id body +1 will start Groonga! +2 starting Groonga... +3 started Groonga. +drop table diaries; +set global mroonga_default_tokenizer=@mroonga_default_tokenizer_backup; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_tokenizer_off.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_tokenizer_off.result new file mode 100644 index 00000000000..780ac2faa3d --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_tokenizer_off.result @@ -0,0 +1,42 @@ +DROP TABLE IF EXISTS variables; +CREATE TABLE variables ( +id INT PRIMARY KEY AUTO_INCREMENT, +name TEXT, +FULLTEXT INDEX (name) COMMENT 'tokenizer "off"' +) DEFAULT CHARSET=utf8; +SHOW CREATE TABLE variables; +Table Create Table +variables CREATE TABLE `variables` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` text, + PRIMARY KEY (`id`), + FULLTEXT KEY `name` (`name`) COMMENT 'tokenizer "off"' +) ENGINE=Mroonga DEFAULT CHARSET=utf8 +INSERT INTO variables (name) VALUES ("mroonga_database_path_prefix"); +INSERT INTO variables (name) VALUES ("mroonga_default_tokenizer"); +INSERT INTO variables (name) VALUES ("mroonga_default_wrapper_engine"); +INSERT INTO variables (name) VALUES ("mroonga_dry_write"); +INSERT INTO variables (name) VALUES ("mroonga_enable_optimization"); +INSERT INTO variables (name) VALUES ("mroonga_libgroonga_version"); +INSERT INTO variables (name) VALUES ("mroonga_log_file"); +INSERT INTO variables (name) VALUES ("mroonga_log_level"); +INSERT INTO variables (name) VALUES ("mroonga_match_escalation_threshold"); +INSERT INTO variables (name) VALUES ("mroonga_version"); +SELECT * FROM variables; +id name +1 mroonga_database_path_prefix +2 mroonga_default_tokenizer +3 mroonga_default_wrapper_engine +4 mroonga_dry_write +5 mroonga_enable_optimization +6 mroonga_libgroonga_version +7 mroonga_log_file +8 mroonga_log_level +9 mroonga_match_escalation_threshold +10 mroonga_version +SELECT * FROM variables +WHERE MATCH (name) AGAINST ("mroonga_default*" IN BOOLEAN MODE); +id name +3 mroonga_default_wrapper_engine +2 mroonga_default_tokenizer +DROP TABLE variables; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_tokenizer_parameter.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_tokenizer_parameter.result new file mode 100644 index 00000000000..67170925826 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_index_tokenizer_parameter.result @@ -0,0 +1,30 @@ +DROP TABLE IF EXISTS diaries; +CREATE TABLE diaries ( +id int PRIMARY KEY AUTO_INCREMENT, +body text, +FULLTEXT INDEX body_index (body) TOKENIZER='TokenBigramSplitSymbolAlphaDigit' +) DEFAULT CHARSET utf8; +SHOW CREATE TABLE diaries; +Table Create Table +diaries CREATE TABLE `diaries` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `body` text, + PRIMARY KEY (`id`), + FULLTEXT KEY `body_index` (`body`) `TOKENIZER`='TokenBigramSplitSymbolAlphaDigit' +) ENGINE=Mroonga DEFAULT CHARSET=utf8 +INSERT INTO diaries (body) VALUES ("will start Groonga!"); +INSERT INTO diaries (body) VALUES ("starting Groonga..."); +INSERT INTO diaries (body) VALUES ("started Groonga."); +SELECT * FROM diaries; +id body +1 will start Groonga! +2 starting Groonga... +3 started Groonga. +SELECT * FROM diaries +WHERE MATCH(body) AGAINST("+start" IN BOOLEAN MODE) +ORDER BY id; +id body +1 will start Groonga! +2 starting Groonga... +3 started Groonga. +DROP TABLE diaries; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_normalizer_primary_key_table_comment.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_table_normalizer_default.result similarity index 100% rename from storage/mroonga/mysql-test/mroonga/storage/r/create_table_normalizer_primary_key_table_comment.result rename to storage/mroonga/mysql-test/mroonga/storage/r/create_table_table_normalizer_default.result diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_normalizer_primary_key_table_comment_with_using_hash.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_table_normalizer_hash.result similarity index 100% rename from storage/mroonga/mysql-test/mroonga/storage/r/create_table_normalizer_primary_key_table_comment_with_using_hash.result rename to storage/mroonga/mysql-test/mroonga/storage/r/create_table_table_normalizer_hash.result diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_token_filters_table_comment_multiple_token_filters.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_table_token_filters_multiple_token_filters.result similarity index 88% rename from storage/mroonga/mysql-test/mroonga/storage/r/create_table_token_filters_table_comment_multiple_token_filters.result rename to storage/mroonga/mysql-test/mroonga/storage/r/create_table_table_token_filters_multiple_token_filters.result index de1946e9214..6308b33d4cf 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_token_filters_table_comment_multiple_token_filters.result +++ b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_table_token_filters_multiple_token_filters.result @@ -1,5 +1,5 @@ -SELECT mroonga_command("register token_filters/stop_word"); -mroonga_command("register token_filters/stop_word") +SELECT mroonga_command("plugin_register token_filters/stop_word"); +mroonga_command("plugin_register token_filters/stop_word") true CREATE TABLE terms ( term VARCHAR(64) NOT NULL PRIMARY KEY, diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_token_filters_table_comment_one_token_filter.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_table_token_filters_one_token_filter.result similarity index 87% rename from storage/mroonga/mysql-test/mroonga/storage/r/create_table_token_filters_table_comment_one_token_filter.result rename to storage/mroonga/mysql-test/mroonga/storage/r/create_table_table_token_filters_one_token_filter.result index f3349980db1..2f4a90d4086 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/r/create_table_token_filters_table_comment_one_token_filter.result +++ b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_table_token_filters_one_token_filter.result @@ -1,5 +1,5 @@ -SELECT mroonga_command("register token_filters/stop_word"); -mroonga_command("register token_filters/stop_word") +SELECT mroonga_command("plugin_register token_filters/stop_word"); +mroonga_command("plugin_register token_filters/stop_word") true CREATE TABLE terms ( term VARCHAR(64) NOT NULL PRIMARY KEY, diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_token_filters_skip.result b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_table_token_filters_stop_word.result similarity index 84% rename from storage/mroonga/mysql-test/mroonga/storage/r/fulltext_token_filters_skip.result rename to storage/mroonga/mysql-test/mroonga/storage/r/create_table_table_token_filters_stop_word.result index 290f96df35d..bc21ed97502 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_token_filters_skip.result +++ b/storage/mroonga/mysql-test/mroonga/storage/r/create_table_table_token_filters_stop_word.result @@ -1,5 +1,5 @@ -SELECT mroonga_command("register token_filters/stop_word"); -mroonga_command("register token_filters/stop_word") +SELECT mroonga_command("plugin_register token_filters/stop_word"); +mroonga_command("plugin_register token_filters/stop_word") true CREATE TABLE terms ( term VARCHAR(64) NOT NULL PRIMARY KEY, diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_boolean_mode_pragma_default_operator_or_no_operator.result b/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_boolean_mode_pragma_default_operator_or_no_operator.result index f45e8fd4fb6..0c81bf6c3ad 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_boolean_mode_pragma_default_operator_or_no_operator.result +++ b/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_boolean_mode_pragma_default_operator_or_no_operator.result @@ -10,9 +10,10 @@ INSERT INTO memos VALUES ("Today is fine."); INSERT INTO memos VALUES ("Tomorrow will be fine."); INSERT INTO memos VALUES ("Yesterday was fine."); SELECT * FROM memos -WHERE MATCH (content) AGAINST ("*DOR today good" IN BOOLEAN MODE); +WHERE MATCH (content) AGAINST ("*DOR today good" IN BOOLEAN MODE) +ORDER BY content; content -Today is good day. Today is fine. +Today is good day. Tomorrow will be good day. DROP TABLE memos; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_boolean_mode_pragma_default_operator_or_with_minus.result b/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_boolean_mode_pragma_default_operator_or_with_minus.result index 103866902c2..dfeb71f0d14 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_boolean_mode_pragma_default_operator_or_with_minus.result +++ b/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_boolean_mode_pragma_default_operator_or_with_minus.result @@ -10,9 +10,10 @@ INSERT INTO memos VALUES ("Today is fine."); INSERT INTO memos VALUES ("Tomorrow will be fine."); INSERT INTO memos VALUES ("Yesterday was fine."); SELECT * FROM memos -WHERE MATCH (content) AGAINST ("*DOR today -good tomorrow" IN BOOLEAN MODE); +WHERE MATCH (content) AGAINST ("*DOR today -good tomorrow" IN BOOLEAN MODE) +ORDER BY content; content -Tomorrow will be good day. Today is fine. Tomorrow will be fine. +Tomorrow will be good day. DROP TABLE memos; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_boolean_mode_pragma_default_operator_or_with_plus.result b/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_boolean_mode_pragma_default_operator_or_with_plus.result index fd52868b4bc..e72cf8d4052 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_boolean_mode_pragma_default_operator_or_with_plus.result +++ b/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_boolean_mode_pragma_default_operator_or_with_plus.result @@ -10,9 +10,10 @@ INSERT INTO memos VALUES ("Today is fine."); INSERT INTO memos VALUES ("Tomorrow will be fine."); INSERT INTO memos VALUES ("Yesterday was fine."); SELECT * FROM memos -WHERE MATCH (content) AGAINST ("*DOR today +good tomorrow" IN BOOLEAN MODE); +WHERE MATCH (content) AGAINST ("*DOR today +good tomorrow" IN BOOLEAN MODE) +ORDER BY content; content Today is good day. -Tomorrow will be good day. Tomorrow will be fine. +Tomorrow will be good day. DROP TABLE memos; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_boolean_mode_pragma_default_operator_plus_with_astarisk.result b/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_boolean_mode_pragma_default_operator_plus_with_astarisk.result new file mode 100644 index 00000000000..7a30baab5a0 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_boolean_mode_pragma_default_operator_plus_with_astarisk.result @@ -0,0 +1,14 @@ +DROP TABLE IF EXISTS memos; +SET NAMES utf8; +CREATE TABLE memos ( +content TEXT, +FULLTEXT INDEX (content) +) DEFAULT CHARSET=utf8; +INSERT INTO memos VALUES ("Today is good day."); +INSERT INTO memos VALUES ("Tomorrow will be good day."); +INSERT INTO memos VALUES ("Today is fine."); +SELECT * FROM memos +WHERE MATCH (content) AGAINST ("*D+ today fi*" IN BOOLEAN MODE); +content +Today is fine. +DROP TABLE memos; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_not_match_against.result b/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_not_match_against.result index 2c1666369a5..b6d6febf0b3 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_not_match_against.result +++ b/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_not_match_against.result @@ -18,21 +18,21 @@ c1 c2 c3 6 20 ka ki ku ke ko 7 20 aa ii uu ee oo 8 20 ka ki ku ke ko -select * from t1 where match(c3) against("uu"); +select * from t1 where match(c3) against("+uu" in boolean mode) order by c1; c1 c2 c3 1 10 aa ii uu ee oo 3 10 aa ii uu ee oo 5 20 aa ii uu ee oo 7 20 aa ii uu ee oo -select * from t1 where not match(c3) against("uu"); +select * from t1 where not match(c3) against("+uu" in boolean mode) order by c1; c1 c2 c3 2 10 ka ki ku ke ko 4 10 ka ki ku ke ko 6 20 ka ki ku ke ko 8 20 ka ki ku ke ko -select * from t1 where match(c3) against("dummy"); +select * from t1 where match(c3) against("+dummy" in boolean mode) order by c1; c1 c2 c3 -select * from t1 where not match(c3) against("dummy"); +select * from t1 where not match(c3) against("+dummy" in boolean mode) order by c1; c1 c2 c3 1 10 aa ii uu ee oo 2 10 ka ki ku ke ko @@ -42,26 +42,26 @@ c1 c2 c3 6 20 ka ki ku ke ko 7 20 aa ii uu ee oo 8 20 ka ki ku ke ko -select * from t1 where c1 = 4 and not match(c3) against("uu"); +select * from t1 where c1 = 4 and not match(c3) against("+uu" in boolean mode) order by c1; c1 c2 c3 4 10 ka ki ku ke ko -select * from t1 where c1 <= 4 and not match(c3) against("uu"); +select * from t1 where c1 <= 4 and not match(c3) against("+uu" in boolean mode) order by c1; c1 c2 c3 2 10 ka ki ku ke ko 4 10 ka ki ku ke ko -select * from t1 where c1 > 4 and not match(c3) against("uu"); +select * from t1 where c1 > 4 and not match(c3) against("+uu" in boolean mode) order by c1; c1 c2 c3 6 20 ka ki ku ke ko 8 20 ka ki ku ke ko -select * from t1 where c2 = 10 and not match(c3) against("uu"); +select * from t1 where c2 = 10 and not match(c3) against("+uu" in boolean mode) order by c1; c1 c2 c3 2 10 ka ki ku ke ko 4 10 ka ki ku ke ko -select * from t1 where c2 >= 15 and not match(c3) against("uu"); +select * from t1 where c2 >= 15 and not match(c3) against("+uu" in boolean mode) order by c1; c1 c2 c3 6 20 ka ki ku ke ko 8 20 ka ki ku ke ko -select * from t1 where c2 < 15 and not match(c3) against("uu"); +select * from t1 where c2 < 15 and not match(c3) against("+uu" in boolean mode) order by c1; c1 c2 c3 2 10 ka ki ku ke ko 4 10 ka ki ku ke ko diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_parser_comment.result b/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_parser_comment.result deleted file mode 100644 index f2abfe85dd6..00000000000 --- a/storage/mroonga/mysql-test/mroonga/storage/r/fulltext_parser_comment.result +++ /dev/null @@ -1,29 +0,0 @@ -drop table if exists diaries; -create table diaries ( -id int primary key auto_increment, -body text, -fulltext index body_index (body) -comment 'parser "TokenBigramSplitSymbolAlphaDigit"' -) default charset utf8; -show create table diaries; -Table Create Table -diaries CREATE TABLE `diaries` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `body` text, - PRIMARY KEY (`id`), - FULLTEXT KEY `body_index` (`body`) COMMENT 'parser "TokenBigramSplitSymbolAlphaDigit"' -) ENGINE=Mroonga DEFAULT CHARSET=utf8 -insert into diaries (body) values ("will start groonga!"); -insert into diaries (body) values ("starting groonga..."); -insert into diaries (body) values ("started groonga."); -select * from diaries; -id body -1 will start groonga! -2 starting groonga... -3 started groonga. -select * from diaries where match(body) against("start"); -id body -1 will start groonga! -2 starting groonga... -3 started groonga. -drop table diaries; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/index_multiple_column_unique_datetime_insert_delete_insert_invalid_value.result b/storage/mroonga/mysql-test/mroonga/storage/r/index_multiple_column_unique_datetime_insert_delete_insert_invalid_value.result new file mode 100644 index 00000000000..155faf85510 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/r/index_multiple_column_unique_datetime_insert_delete_insert_invalid_value.result @@ -0,0 +1,21 @@ +DROP TABLE IF EXISTS ranges; +CREATE TABLE ranges ( +id int PRIMARY KEY, +start datetime, +end datetime, +UNIQUE KEY range_key(start, end) +); +INSERT INTO ranges VALUES (1, "1990-00-00 00:00:00", "2012-10-05 23:59:59"); +Warnings: +Warning 1265 Data truncated for column 'start' at row 1 +SELECT * FROM ranges; +id start end +1 1990-01-01 00:00:00 2012-10-05 23:59:59 +DELETE FROM ranges WHERE id = 1; +INSERT INTO ranges VALUES (1, "1990-00-00 00:00:00", "2012-10-05 23:59:59"); +Warnings: +Warning 1265 Data truncated for column 'start' at row 1 +SELECT * FROM ranges; +id start end +1 1990-01-01 00:00:00 2012-10-05 23:59:59 +DROP TABLE ranges; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/replace_select_varchar.result b/storage/mroonga/mysql-test/mroonga/storage/r/replace_select_varchar.result index 9cbe11c5574..b9aebee3f9e 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/r/replace_select_varchar.result +++ b/storage/mroonga/mysql-test/mroonga/storage/r/replace_select_varchar.result @@ -31,7 +31,8 @@ SELECT v.id, v.video_id, v.description, NULL FROM videos_master AS v WHERE v.video_id = (video_id); SELECT *, MATCH(description) AGAINST("my") FROM videos_groonga -WHERE MATCH(description) AGAINST("my"); +WHERE MATCH(description) AGAINST("my") +ORDER BY id; id video_id description tags_unpack MATCH(description) AGAINST("my") 1 video-1 My Familly 209716 2 video-2 My Cat 209716 diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/replace_without_key.result b/storage/mroonga/mysql-test/mroonga/storage/r/replace_without_key.result index 2c6c1cbc7e8..e67f0fe4007 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/r/replace_without_key.result +++ b/storage/mroonga/mysql-test/mroonga/storage/r/replace_without_key.result @@ -6,5 +6,5 @@ content text, FULLTEXT INDEX (content) ) DEFAULT CHARSET=utf8; REPLACE INTO diaries(content) VALUES("Hello"); -ERROR HY000: primary key is empty +Got one of the listed errors DROP TABLE diaries; diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/truncate.result b/storage/mroonga/mysql-test/mroonga/storage/r/truncate.result index 0e33976eb17..104d1d51504 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/r/truncate.result +++ b/storage/mroonga/mysql-test/mroonga/storage/r/truncate.result @@ -31,15 +31,18 @@ id year month day title content 1 2011 11 9 Hello 今日からはじめました。 2 2011 11 10 天気 明日の富士山の天気について 3 2011 11 11 富士山 今日も天気がよくてきれいに見える。 -SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日 天気" IN BOOLEAN MODE); +SELECT * FROM diaries +WHERE MATCH(content) AGAINST("+今日" IN BOOLEAN MODE) +ORDER BY id; id year month day title content 1 2011 11 9 Hello 今日からはじめました。 3 2011 11 11 富士山 今日も天気がよくてきれいに見える。 -2 2011 11 10 天気 明日の富士山の天気について TRUNCATE TABLE diaries; SELECT * FROM diaries; id year month day title content -SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日 天気" IN BOOLEAN MODE); +SELECT * FROM diaries +WHERE MATCH(content) AGAINST("+今日" IN BOOLEAN MODE) +ORDER BY id; id year month day title content INSERT INTO diaries VALUES(1, 2011, 11, 11, "帰り道", "つかれたー"); INSERT INTO diaries VALUES(2, 2011, 12, 1, "久しぶり", "天気が悪いからずっと留守番。"); @@ -49,7 +52,9 @@ id year month day title content 1 2011 11 11 帰り道 つかれたー 2 2011 12 1 久しぶり 天気が悪いからずっと留守番。 3 2011 12 2 初雪 今年はじめての雪! -SELECT * FROM diaries WHERE MATCH(content) AGAINST("悪い" IN BOOLEAN MODE); +SELECT * FROM diaries +WHERE MATCH(content) AGAINST("+悪い" IN BOOLEAN MODE) +ORDER BY id; id year month day title content 2 2011 12 1 久しぶり 天気が悪いからずっと留守番。 DROP TABLE diaries; diff --git a/storage/mroonga/mysql-test/mroonga/storage/suite.pm b/storage/mroonga/mysql-test/mroonga/storage/suite.pm index 6b345c0fd6f..528ccc5d693 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/suite.pm +++ b/storage/mroonga/mysql-test/mroonga/storage/suite.pm @@ -5,11 +5,6 @@ package My::Suite::Mroonga; return "No Mroonga engine" unless $ENV{HA_MROONGA_SO} or $::mysqld_variables{'mroonga'} eq "ON"; -# RECOMPILE_FOR_EMBEDDED also means that a plugin -# cannot be dynamically loaded into embedded -return "Not run for embedded server" if $::opt_embedded_server and - $ENV{HA_MROONGA_SO}; - sub is_default { 1 } my $groonga_normalizer_mysql_dir=$::basedir . '/storage/mroonga/vendor/groonga/vendor/plugins/groonga-normalizer-mysql'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/alter_table_add_column_with_flags.test b/storage/mroonga/mysql-test/mroonga/storage/t/alter_table_add_column_flags_comment.test similarity index 100% rename from storage/mroonga/mysql-test/mroonga/storage/t/alter_table_add_column_with_flags.test rename to storage/mroonga/mysql-test/mroonga/storage/t/alter_table_add_column_flags_comment.test diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/alter_table_add_column_flags_parameter.test b/storage/mroonga/mysql-test/mroonga/storage/t/alter_table_add_column_flags_parameter.test new file mode 100644 index 00000000000..0c389ba3197 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/t/alter_table_add_column_flags_parameter.test @@ -0,0 +1,41 @@ +# Copyright(C) 2014 Kenji Maruyama +# Copyright(C) 2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/have_mariadb.inc +--source include/not_embedded.inc +--source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/load_mroonga_functions.inc + +--disable_query_log +DROP DATABASE test; +CREATE DATABASE test; +USE test; +--enable_query_log + +CREATE TABLE tags ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY +) DEFAULT CHARSET=utf8; + +ALTER TABLE tags ADD COLUMN name VARCHAR(64) FLAGS='COLUMN_VECTOR'; +SHOW CREATE TABLE tags; + +SELECT mroonga_command("dump --dump_plugins no"); + +DROP TABLE tags; + +--source ../../include/mroonga/unload_mroonga_functions.inc +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/alter_table_add_column_groonga_type_comment.test b/storage/mroonga/mysql-test/mroonga/storage/t/alter_table_add_column_groonga_type_comment.test new file mode 100644 index 00000000000..d77809c1a6c --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/t/alter_table_add_column_groonga_type_comment.test @@ -0,0 +1,44 @@ +# Copyright(C) 2014 Kenji Maruyama +# Copyright(C) 2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source include/not_embedded.inc +--source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/load_mroonga_functions.inc + +--disable_query_log +DROP DATABASE test; +CREATE DATABASE test; +USE test; +--enable_query_log + +CREATE TABLE tags ( + id INT UNSIGNED PRIMARY KEY +) DEFAULT CHARSET=utf8; + +CREATE TABLE bugs ( + id INT UNSIGNED PRIMARY KEY +) DEFAULT CHARSET=utf8; + +ALTER TABLE bugs ADD COLUMN name VARCHAR(64) COMMENT 'groonga_type "tags"'; + +SELECT mroonga_command("dump --dump_plugins no"); + +DROP TABLE bugs; +DROP TABLE tags; + +--source ../../include/mroonga/unload_mroonga_functions.inc +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/alter_table_add_column_groonga_type_parameter.test b/storage/mroonga/mysql-test/mroonga/storage/t/alter_table_add_column_groonga_type_parameter.test new file mode 100644 index 00000000000..a65eff4529f --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/t/alter_table_add_column_groonga_type_parameter.test @@ -0,0 +1,47 @@ +# Copyright(C) 2014 Kenji Maruyama +# Copyright(C) 2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/have_mariadb.inc +--source ../../include/mroonga/have_version_56_or_later.inc +--source include/not_embedded.inc +--source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/load_mroonga_functions.inc + +--disable_query_log +DROP DATABASE test; +CREATE DATABASE test; +USE test; +--enable_query_log + +CREATE TABLE tags ( + id INT UNSIGNED PRIMARY KEY +) DEFAULT CHARSET=utf8; + +CREATE TABLE bugs ( + id INT UNSIGNED PRIMARY KEY +) DEFAULT CHARSET=utf8; + +ALTER TABLE bugs ADD COLUMN name VARCHAR(64) GROONGA_TYPE='tags'; +SHOW CREATE TABLE bugs; + +SELECT mroonga_command("dump --dump_plugins no"); + +DROP TABLE bugs; +DROP TABLE tags; + +--source ../../include/mroonga/unload_mroonga_functions.inc +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/alter_table_add_column_with_type.test b/storage/mroonga/mysql-test/mroonga/storage/t/alter_table_add_column_type_comment.test similarity index 100% rename from storage/mroonga/mysql-test/mroonga/storage/t/alter_table_add_column_with_type.test rename to storage/mroonga/mysql-test/mroonga/storage/t/alter_table_add_column_type_comment.test diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/alter_table_add_index_token_filters_one_token_filter.test b/storage/mroonga/mysql-test/mroonga/storage/t/alter_table_add_index_token_filters_one_token_filter.test index 9c01dc27e3e..b2312997709 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/alter_table_add_index_token_filters_one_token_filter.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/alter_table_add_index_token_filters_one_token_filter.test @@ -15,6 +15,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/have_groonga_plugin_register.inc --source ../../include/mroonga/load_mroonga_functions.inc --disable_query_log @@ -23,7 +24,7 @@ CREATE DATABASE test; USE test; --enable_query_log -SELECT mroonga_command("register token_filters/stop_word"); +SELECT mroonga_command("plugin_register token_filters/stop_word"); SET NAMES utf8; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/alter_table_change_token_filter.test b/storage/mroonga/mysql-test/mroonga/storage/t/alter_table_change_token_filter.test index 7ec047818e3..ada266fff0c 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/alter_table_change_token_filter.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/alter_table_change_token_filter.test @@ -15,6 +15,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/have_groonga_plugin_register.inc --source ../../include/mroonga/load_mroonga_functions.inc --disable_query_log @@ -23,7 +24,7 @@ CREATE DATABASE test; USE test; --enable_query_log -SELECT mroonga_command("register token_filters/stop_word"); +SELECT mroonga_command("plugin_register token_filters/stop_word"); CREATE TABLE terms ( term VARCHAR(64) NOT NULL PRIMARY KEY, diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/column_datetime_zero_date_strict.test b/storage/mroonga/mysql-test/mroonga/storage/t/column_datetime_zero_date_strict.test new file mode 100644 index 00000000000..7736fc45b7b --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/t/column_datetime_zero_date_strict.test @@ -0,0 +1,41 @@ +# Copyright(C) 2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/have_mroonga.inc + +--disable_warnings +DROP TABLE IF EXISTS timestamps; +--enable_warnings + +CREATE TABLE timestamps ( + id INT PRIMARY KEY AUTO_INCREMENT, + create_dt DATETIME +) DEFAULT CHARSET UTF8; +SHOW CREATE TABLE timestamps; + +SET sql_mode='STRICT_TRANS_TABLES'; +--error ER_WARN_DATA_OUT_OF_RANGE +INSERT INTO timestamps (create_dt) VALUES ("0000-00-00 00:00:00"); +SET sql_mode=default; + +SELECT * FROM timestamps; + +INSERT INTO timestamps (create_dt) VALUES ("2015-06-17 00:00:00"); +SELECT * FROM timestamps; + +DROP TABLE timestamps; + +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_vector.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_field_flags_comment.test similarity index 100% rename from storage/mroonga/mysql-test/mroonga/storage/t/create_table_vector.test rename to storage/mroonga/mysql-test/mroonga/storage/t/create_table_field_flags_comment.test diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_field_flags_parameter.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_field_flags_parameter.test new file mode 100644 index 00000000000..dbecd47dac6 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_field_flags_parameter.test @@ -0,0 +1,39 @@ +# Copyright(C) 2013-2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/have_mariadb.inc +--source include/not_embedded.inc +--source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/load_mroonga_functions.inc + +--disable_query_log +DROP DATABASE test; +CREATE DATABASE test; +USE test; +--enable_query_log + +CREATE TABLE bugs ( + id INT UNSIGNED PRIMARY KEY, + tags TEXT FLAGS='COLUMN_VECTOR' +) DEFAULT CHARSET=utf8; +SHOW CREATE TABLE bugs; + +SELECT mroonga_command("dump --dump_plugins no"); + +DROP TABLE bugs; + +--source ../../include/mroonga/unload_mroonga_functions.inc +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_field_groonga_type_comment.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_field_groonga_type_comment.test new file mode 100644 index 00000000000..aa4723b087c --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_field_groonga_type_comment.test @@ -0,0 +1,42 @@ +# Copyright(C) 2013-2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source include/not_embedded.inc +--source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/load_mroonga_functions.inc + +--disable_query_log +DROP DATABASE test; +CREATE DATABASE test; +USE test; +--enable_query_log + +CREATE TABLE tags ( + name VARCHAR(64) PRIMARY KEY +) DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +CREATE TABLE bugs ( + id INT UNSIGNED PRIMARY KEY, + tag VARCHAR(64) COMMENT 'groonga_type "tags"' +) DEFAULT CHARSET=utf8; + +SELECT mroonga_command("dump --dump_plugins no"); + +DROP TABLE bugs; +DROP TABLE tags; + +--source ../../include/mroonga/unload_mroonga_functions.inc +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_field_groonga_type_nonexistent.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_field_groonga_type_nonexistent.test new file mode 100644 index 00000000000..56d81fad16c --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_field_groonga_type_nonexistent.test @@ -0,0 +1,29 @@ +# Copyright(C) 2013-2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/have_mroonga.inc + +--disable_warnings +DROP TABLE IF EXISTS bugs; +--enable_warnings + +--error ER_CANT_CREATE_TABLE +CREATE TABLE bugs ( + id INT UNSIGNED PRIMARY KEY, + tag VARCHAR(64) COMMENT 'groonga_type "Nonexistent"' +) DEFAULT CHARSET=utf8mb4; + +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_field_groonga_type_parameter.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_field_groonga_type_parameter.test new file mode 100644 index 00000000000..325536af3d2 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_field_groonga_type_parameter.test @@ -0,0 +1,45 @@ +# Copyright(C) 2013-2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/have_mariadb.inc +--source ../../include/mroonga/have_version_56_or_later.inc +--source include/not_embedded.inc +--source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/load_mroonga_functions.inc + +--disable_query_log +DROP DATABASE test; +CREATE DATABASE test; +USE test; +--enable_query_log + +CREATE TABLE tags ( + name VARCHAR(64) PRIMARY KEY +) DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +CREATE TABLE bugs ( + id INT UNSIGNED PRIMARY KEY, + tag VARCHAR(64) GROONGA_TYPE='tags' +) DEFAULT CHARSET=utf8; +SHOW CREATE TABLE bugs; + +SELECT mroonga_command("dump --dump_plugins no"); + +DROP TABLE bugs; +DROP TABLE tags; + +--source ../../include/mroonga/unload_mroonga_functions.inc +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_reference_type.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_field_type_comment.test similarity index 100% rename from storage/mroonga/mysql-test/mroonga/storage/t/create_table_reference_type.test rename to storage/mroonga/mysql-test/mroonga/storage/t/create_table_field_type_comment.test diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_field_type_nonexistent.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_field_type_nonexistent.test new file mode 100644 index 00000000000..2b9a58c887c --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_field_type_nonexistent.test @@ -0,0 +1,29 @@ +# Copyright(C) 2013-2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/have_mroonga.inc + +--disable_warnings +DROP TABLE IF EXISTS bugs; +--enable_warnings + +--error ER_CANT_CREATE_TABLE +CREATE TABLE bugs ( + id INT UNSIGNED PRIMARY KEY, + tag VARCHAR(64) COMMENT 'type "Nonexistent"' +) DEFAULT CHARSET=utf8mb4; + +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_flags_comment.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_flags_comment.test new file mode 100644 index 00000000000..668a148edf9 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_flags_comment.test @@ -0,0 +1,39 @@ +# Copyright(C) 2015 Naoya Murakami +# Copyright(C) 2015 Kouhei SUtou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/load_mroonga_functions.inc + +--disable_query_log +DROP DATABASE test; +CREATE DATABASE test; +USE test; +--enable_query_log + +SET NAMES utf8; + +CREATE TABLE memos ( + content VARCHAR(64) NOT NULL, + FULLTEXT INDEX (content) COMMENT 'flags "WITH_POSITION|WITH_WEIGHT"' +) DEFAULT CHARSET=utf8; + +SELECT mroonga_command("dump --dump_plugins no --dump_schema no"); + +DROP TABLE memos; + +--source ../../include/mroonga/unload_mroonga_functions.inc +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_flags_none.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_flags_none.test index 039c518e673..107b045c8fc 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_flags_none.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_flags_none.test @@ -1,4 +1,5 @@ # Copyright(C) 2015 Naoya Murakami +# Copyright(C) 2015 Kouhei SUtou # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -27,7 +28,7 @@ SET NAMES utf8; CREATE TABLE memos ( content VARCHAR(64) NOT NULL, - FULLTEXT INDEX (content) COMMENT 'index_flags "NONE"' + FULLTEXT INDEX (content) COMMENT 'flags "NONE"' ) DEFAULT CHARSET=utf8; SELECT mroonga_command("dump --dump_plugins no --dump_schema no"); diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_flags_parameter.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_flags_parameter.test new file mode 100644 index 00000000000..14c65ad54c1 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_flags_parameter.test @@ -0,0 +1,41 @@ +# Copyright(C) 2015 Naoya Murakami +# Copyright(C) 2015 Kouhei SUtou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/have_mariadb.inc +--source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/load_mroonga_functions.inc + +--disable_query_log +DROP DATABASE test; +CREATE DATABASE test; +USE test; +--enable_query_log + +SET NAMES utf8; + +CREATE TABLE memos ( + content VARCHAR(64) NOT NULL, + FULLTEXT INDEX (content) FLAGS='WITH_POSITION|WITH_WEIGHT' +) DEFAULT CHARSET=utf8; +SHOW CREATE TABLE memos; + +SELECT mroonga_command("dump --dump_plugins no --dump_schema no"); + +DROP TABLE memos; + +--source ../../include/mroonga/unload_mroonga_functions.inc +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_index_flags_none.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_index_flags_none.test new file mode 100644 index 00000000000..039c518e673 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_index_flags_none.test @@ -0,0 +1,38 @@ +# Copyright(C) 2015 Naoya Murakami +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/load_mroonga_functions.inc + +--disable_query_log +DROP DATABASE test; +CREATE DATABASE test; +USE test; +--enable_query_log + +SET NAMES utf8; + +CREATE TABLE memos ( + content VARCHAR(64) NOT NULL, + FULLTEXT INDEX (content) COMMENT 'index_flags "NONE"' +) DEFAULT CHARSET=utf8; + +SELECT mroonga_command("dump --dump_plugins no --dump_schema no"); + +DROP TABLE memos; + +--source ../../include/mroonga/unload_mroonga_functions.inc +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_flags_with_position_and_with_weight.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_index_flags_with_position_and_with_weight.test similarity index 100% rename from storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_flags_with_position_and_with_weight.test rename to storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_index_flags_with_position_and_with_weight.test diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_normalizer_fulltext_index_comment.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_normalizer_comment.test similarity index 100% rename from storage/mroonga/mysql-test/mroonga/storage/t/create_table_normalizer_fulltext_index_comment.test rename to storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_normalizer_comment.test diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_normalizer_fulltext_index_no_utf8_charset_with_utf8_normalizer.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_normalizer_no_utf8_charset_with_utf8_normalizer.test similarity index 100% rename from storage/mroonga/mysql-test/mroonga/storage/t/create_table_normalizer_fulltext_index_no_utf8_charset_with_utf8_normalizer.test rename to storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_normalizer_no_utf8_charset_with_utf8_normalizer.test diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_normalizer_fulltext_index_none.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_normalizer_none.test similarity index 100% rename from storage/mroonga/mysql-test/mroonga/storage/t/create_table_normalizer_fulltext_index_none.test rename to storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_normalizer_none.test diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_normalizer_parameter.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_normalizer_parameter.test new file mode 100644 index 00000000000..a42b30b72a1 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_normalizer_parameter.test @@ -0,0 +1,40 @@ +# Copyright(C) 2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/have_mariadb.inc +--source ../../include/mroonga/have_mroonga.inc + +--disable_warnings +DROP TABLE IF EXISTS memos; +--enable_warnings + +SET NAMES utf8; + +CREATE TABLE memos ( + id INT NOT NULL PRIMARY KEY, + content TEXT NOT NULL, + FULLTEXT INDEX (content) NORMALIZER='NormalizerAuto' +) DEFAULT CHARSET=utf8; +SHOW CREATE TABLE memos; + +INSERT INTO memos VALUES (1, "1日の消費㌍は約2000㌔㌍"); + +SELECT * FROM memos + WHERE MATCH (content) AGAINST ("+カロリー" IN BOOLEAN MODE); + +DROP TABLE memos; + +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_parser_comment.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_parser_comment.test new file mode 100644 index 00000000000..1b728afa1c1 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_parser_comment.test @@ -0,0 +1,42 @@ +# Copyright(C) 2011-2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/have_mroonga.inc + +--disable_warnings +DROP TABLE IF EXISTS diaries; +--enable_warnings + +CREATE TABLE diaries ( + id int PRIMARY KEY AUTO_INCREMENT, + body text, + FULLTEXT INDEX body_index (body) + COMMENT 'parser "TokenBigramSplitSymbolAlphaDigit"' +) DEFAULT CHARSET utf8; +SHOW CREATE TABLE diaries; + +INSERT INTO diaries (body) VALUES ("will start Groonga!"); +INSERT INTO diaries (body) VALUES ("starting Groonga..."); +INSERT INTO diaries (body) VALUES ("started Groonga."); + +SELECT * FROM diaries; +SELECT * FROM diaries + WHERE MATCH(body) AGAINST("+start" IN BOOLEAN MODE) + ORDER BY id; + +DROP TABLE diaries; + +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_parser_default.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_parser_default.test similarity index 77% rename from storage/mroonga/mysql-test/mroonga/storage/t/fulltext_parser_default.test rename to storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_parser_default.test index 1e08cc46221..a1756ad268e 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_parser_default.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_parser_default.test @@ -1,4 +1,4 @@ -# Copyright(C) 2011 Kouhei Sutou +# Copyright(C) 2011-2015 Kouhei Sutou # Copyright(C) 2014 Kentoku SHIBA # # This library is free software; you can redistribute it and/or @@ -29,12 +29,12 @@ create table diaries ( fulltext index body_index (body) ) default charset utf8; show create table diaries; -insert into diaries (body) values ("will start groonga!"); -insert into diaries (body) values ("starting groonga..."); -insert into diaries (body) values ("started groonga."); -insert into diaries (body) values ("finished groonga."); +insert into diaries (body) values ("will start Groonga!"); +insert into diaries (body) values ("starting Groonga..."); +insert into diaries (body) values ("started Groonga."); +insert into diaries (body) values ("finished Groonga."); select * from diaries; -select * from diaries where match(body) against("start"); +select * from diaries where match(body) against("+start" IN BOOLEAN MODE) order by id; drop table diaries; set global mroonga_default_parser=@mroonga_default_parser_backup; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_parser_off.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_parser_off.test similarity index 96% rename from storage/mroonga/mysql-test/mroonga/storage/t/fulltext_parser_off.test rename to storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_parser_off.test index 0dcf494c684..0869e2334b7 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_parser_off.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_parser_off.test @@ -14,7 +14,6 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---source ../../include/mroonga/have_fulltext_index_comment.inc --source ../../include/mroonga/have_mroonga.inc --disable_warnings diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_token_filters_index_comment_multiple_token_filters.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_token_filters_multiple_token_filters.test similarity index 91% rename from storage/mroonga/mysql-test/mroonga/storage/t/create_table_token_filters_index_comment_multiple_token_filters.test rename to storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_token_filters_multiple_token_filters.test index 18a2607fa0b..534ff998ff0 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_token_filters_index_comment_multiple_token_filters.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_token_filters_multiple_token_filters.test @@ -15,6 +15,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/have_groonga_plugin_register.inc --source ../../include/mroonga/load_mroonga_functions.inc --disable_query_log @@ -23,7 +24,7 @@ CREATE DATABASE test; USE test; --enable_query_log -SELECT mroonga_command("register token_filters/stop_word"); +SELECT mroonga_command("plugin_register token_filters/stop_word"); SET NAMES utf8; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_token_filters_index_comment_one_token_filter.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_token_filters_one_token_filter.test similarity index 91% rename from storage/mroonga/mysql-test/mroonga/storage/t/create_table_token_filters_index_comment_one_token_filter.test rename to storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_token_filters_one_token_filter.test index 20df762d31b..77d886579ba 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_token_filters_index_comment_one_token_filter.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_token_filters_one_token_filter.test @@ -15,6 +15,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/have_groonga_plugin_register.inc --source ../../include/mroonga/load_mroonga_functions.inc --disable_query_log @@ -23,7 +24,7 @@ CREATE DATABASE test; USE test; --enable_query_log -SELECT mroonga_command("register token_filters/stop_word"); +SELECT mroonga_command("plugin_register token_filters/stop_word"); SET NAMES utf8; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_token_filters_parameter.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_token_filters_parameter.test new file mode 100644 index 00000000000..d9458f4402d --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_token_filters_parameter.test @@ -0,0 +1,44 @@ +# Copyright(C) 2014 Naoya Murakami +# Copyright(C) 2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/have_mariadb.inc +--source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/have_groonga_plugin_register.inc +--source ../../include/mroonga/load_mroonga_functions.inc + +--disable_query_log +DROP DATABASE test; +CREATE DATABASE test; +USE test; +--enable_query_log + +SELECT mroonga_command("plugin_register token_filters/stop_word"); + +SET NAMES utf8; + +CREATE TABLE memos ( + content VARCHAR(64) NOT NULL, + FULLTEXT INDEX (content) TOKEN_FILTERS='TokenFilterStopWord,TokenFilterStopWord' +) DEFAULT CHARSET=utf8; +SHOW CREATE TABLE memos; + +SELECT mroonga_command("dump --dump_plugins no"); + +DROP TABLE memos; + +--source ../../include/mroonga/unload_mroonga_functions.inc +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_tokenizer_comment.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_tokenizer_comment.test new file mode 100644 index 00000000000..4bf386a4c11 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_tokenizer_comment.test @@ -0,0 +1,42 @@ +# Copyright(C) 2011-2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/have_mroonga.inc + +--disable_warnings +DROP TABLE IF EXISTS diaries; +--enable_warnings + +CREATE TABLE diaries ( + id int PRIMARY KEY AUTO_INCREMENT, + body text, + FULLTEXT INDEX body_index (body) + COMMENT 'tokenizer "TokenBigramSplitSymbolAlphaDigit"' +) DEFAULT CHARSET utf8; +SHOW CREATE TABLE diaries; + +INSERT INTO diaries (body) VALUES ("will start Groonga!"); +INSERT INTO diaries (body) VALUES ("starting Groonga..."); +INSERT INTO diaries (body) VALUES ("started Groonga."); + +SELECT * FROM diaries; +SELECT * FROM diaries + WHERE MATCH(body) AGAINST("+start" IN BOOLEAN MODE) + ORDER BY id; + +DROP TABLE diaries; + +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_tokenizer_default.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_tokenizer_default.test new file mode 100644 index 00000000000..069e06b4a84 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_tokenizer_default.test @@ -0,0 +1,41 @@ +# Copyright(C) 2011-2015 Kouhei Sutou +# Copyright(C) 2014 Kentoku SHIBA +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/have_mroonga.inc + +--disable_warnings +drop table if exists diaries; +--enable_warnings + +set @mroonga_default_tokenizer_backup=@@mroonga_default_tokenizer; +set global mroonga_default_tokenizer=TokenBigramSplitSymbolAlphaDigit; +create table diaries ( + id int primary key auto_increment, + body text, + fulltext index body_index (body) +) default charset utf8; +show create table diaries; +insert into diaries (body) values ("will start Groonga!"); +insert into diaries (body) values ("starting Groonga..."); +insert into diaries (body) values ("started Groonga."); +insert into diaries (body) values ("finished Groonga."); +select * from diaries; +select * from diaries where match(body) against("+start" IN BOOLEAN MODE) order by id; +drop table diaries; +set global mroonga_default_tokenizer=@mroonga_default_tokenizer_backup; + +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_tokenizer_off.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_tokenizer_off.test new file mode 100644 index 00000000000..5aff5e3575b --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_tokenizer_off.test @@ -0,0 +1,47 @@ +# Copyright(C) 2013-2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/have_mroonga.inc + +--disable_warnings +DROP TABLE IF EXISTS variables; +--enable_warnings + +CREATE TABLE variables ( + id INT PRIMARY KEY AUTO_INCREMENT, + name TEXT, + FULLTEXT INDEX (name) COMMENT 'tokenizer "off"' +) DEFAULT CHARSET=utf8; +SHOW CREATE TABLE variables; + +INSERT INTO variables (name) VALUES ("mroonga_database_path_prefix"); +INSERT INTO variables (name) VALUES ("mroonga_default_tokenizer"); +INSERT INTO variables (name) VALUES ("mroonga_default_wrapper_engine"); +INSERT INTO variables (name) VALUES ("mroonga_dry_write"); +INSERT INTO variables (name) VALUES ("mroonga_enable_optimization"); +INSERT INTO variables (name) VALUES ("mroonga_libgroonga_version"); +INSERT INTO variables (name) VALUES ("mroonga_log_file"); +INSERT INTO variables (name) VALUES ("mroonga_log_level"); +INSERT INTO variables (name) VALUES ("mroonga_match_escalation_threshold"); +INSERT INTO variables (name) VALUES ("mroonga_version"); + +SELECT * FROM variables; +SELECT * FROM variables + WHERE MATCH (name) AGAINST ("mroonga_default*" IN BOOLEAN MODE); + +DROP TABLE variables; + +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_tokenizer_parameter.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_tokenizer_parameter.test new file mode 100644 index 00000000000..d79eaefe3f6 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_index_tokenizer_parameter.test @@ -0,0 +1,42 @@ +# Copyright(C) 2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/have_mariadb.inc +--source ../../include/mroonga/have_mroonga.inc + +--disable_warnings +DROP TABLE IF EXISTS diaries; +--enable_warnings + +CREATE TABLE diaries ( + id int PRIMARY KEY AUTO_INCREMENT, + body text, + FULLTEXT INDEX body_index (body) TOKENIZER='TokenBigramSplitSymbolAlphaDigit' +) DEFAULT CHARSET utf8; +SHOW CREATE TABLE diaries; + +INSERT INTO diaries (body) VALUES ("will start Groonga!"); +INSERT INTO diaries (body) VALUES ("starting Groonga..."); +INSERT INTO diaries (body) VALUES ("started Groonga."); + +SELECT * FROM diaries; +SELECT * FROM diaries + WHERE MATCH(body) AGAINST("+start" IN BOOLEAN MODE) + ORDER BY id; + +DROP TABLE diaries; + +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_normalizer_primary_key_table_comment.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_table_normalizer_default.test similarity index 100% rename from storage/mroonga/mysql-test/mroonga/storage/t/create_table_normalizer_primary_key_table_comment.test rename to storage/mroonga/mysql-test/mroonga/storage/t/create_table_table_normalizer_default.test diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_normalizer_primary_key_table_comment_with_using_hash.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_table_normalizer_hash.test similarity index 100% rename from storage/mroonga/mysql-test/mroonga/storage/t/create_table_normalizer_primary_key_table_comment_with_using_hash.test rename to storage/mroonga/mysql-test/mroonga/storage/t/create_table_table_normalizer_hash.test diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_token_filters_table_comment_multiple_token_filters.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_table_token_filters_multiple_token_filters.test similarity index 92% rename from storage/mroonga/mysql-test/mroonga/storage/t/create_table_token_filters_table_comment_multiple_token_filters.test rename to storage/mroonga/mysql-test/mroonga/storage/t/create_table_table_token_filters_multiple_token_filters.test index e4d7d8618fa..944838e2fe0 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_token_filters_table_comment_multiple_token_filters.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_table_token_filters_multiple_token_filters.test @@ -15,6 +15,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/have_groonga_plugin_register.inc --source ../../include/mroonga/load_mroonga_functions.inc --disable_query_log @@ -23,7 +24,7 @@ CREATE DATABASE test; USE test; --enable_query_log -SELECT mroonga_command("register token_filters/stop_word"); +SELECT mroonga_command("plugin_register token_filters/stop_word"); CREATE TABLE terms ( term VARCHAR(64) NOT NULL PRIMARY KEY, diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_token_filters_table_comment_one_token_filter.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_table_token_filters_one_token_filter.test similarity index 92% rename from storage/mroonga/mysql-test/mroonga/storage/t/create_table_token_filters_table_comment_one_token_filter.test rename to storage/mroonga/mysql-test/mroonga/storage/t/create_table_table_token_filters_one_token_filter.test index 905181175d0..701a4ae425b 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/create_table_token_filters_table_comment_one_token_filter.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_table_token_filters_one_token_filter.test @@ -15,6 +15,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/have_groonga_plugin_register.inc --source ../../include/mroonga/load_mroonga_functions.inc --disable_query_log @@ -23,7 +24,7 @@ CREATE DATABASE test; USE test; --enable_query_log -SELECT mroonga_command("register token_filters/stop_word"); +SELECT mroonga_command("plugin_register token_filters/stop_word"); CREATE TABLE terms ( term VARCHAR(64) NOT NULL PRIMARY KEY, diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_token_filters_skip.test b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_table_token_filters_stop_word.test similarity index 93% rename from storage/mroonga/mysql-test/mroonga/storage/t/fulltext_token_filters_skip.test rename to storage/mroonga/mysql-test/mroonga/storage/t/create_table_table_token_filters_stop_word.test index b27fb5b70d6..b2e6be600f1 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_token_filters_skip.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/create_table_table_token_filters_stop_word.test @@ -15,6 +15,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/have_groonga_plugin_register.inc --source ../../include/mroonga/load_mroonga_functions.inc --disable_query_log @@ -23,7 +24,7 @@ CREATE DATABASE test; USE test; --enable_query_log -SELECT mroonga_command("register token_filters/stop_word"); +SELECT mroonga_command("plugin_register token_filters/stop_word"); CREATE TABLE terms ( term VARCHAR(64) NOT NULL PRIMARY KEY, diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_boolean_mode_pragma_default_operator_or_no_operator.test b/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_boolean_mode_pragma_default_operator_or_no_operator.test index 4d0f15b203a..66ff69d77e2 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_boolean_mode_pragma_default_operator_or_no_operator.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_boolean_mode_pragma_default_operator_or_no_operator.test @@ -1,4 +1,4 @@ -# Copyright(C) 2011-2013 Kouhei Sutou +# Copyright(C) 2011-2015 Kouhei Sutou # Copyright(C) 2013 Kenji Maruyama # # This library is free software; you can redistribute it and/or @@ -34,7 +34,8 @@ INSERT INTO memos VALUES ("Tomorrow will be fine."); INSERT INTO memos VALUES ("Yesterday was fine."); SELECT * FROM memos - WHERE MATCH (content) AGAINST ("*DOR today good" IN BOOLEAN MODE); + WHERE MATCH (content) AGAINST ("*DOR today good" IN BOOLEAN MODE) + ORDER BY content; DROP TABLE memos; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_boolean_mode_pragma_default_operator_or_with_minus.test b/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_boolean_mode_pragma_default_operator_or_with_minus.test index ed93b543869..1d91bdc7a56 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_boolean_mode_pragma_default_operator_or_with_minus.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_boolean_mode_pragma_default_operator_or_with_minus.test @@ -1,4 +1,4 @@ -# Copyright(C) 2011-2013 Kouhei Sutou +# Copyright(C) 2011-2015 Kouhei Sutou # Copyright(C) 2013 Kenji Maruyama # # This library is free software; you can redistribute it and/or @@ -34,7 +34,8 @@ INSERT INTO memos VALUES ("Tomorrow will be fine."); INSERT INTO memos VALUES ("Yesterday was fine."); SELECT * FROM memos - WHERE MATCH (content) AGAINST ("*DOR today -good tomorrow" IN BOOLEAN MODE); + WHERE MATCH (content) AGAINST ("*DOR today -good tomorrow" IN BOOLEAN MODE) + ORDER BY content; DROP TABLE memos; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_boolean_mode_pragma_default_operator_or_with_plus.test b/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_boolean_mode_pragma_default_operator_or_with_plus.test index 3a078c7eccb..63e5baeeb68 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_boolean_mode_pragma_default_operator_or_with_plus.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_boolean_mode_pragma_default_operator_or_with_plus.test @@ -1,4 +1,4 @@ -# Copyright(C) 2011-2013 Kouhei Sutou +# Copyright(C) 2011-2015 Kouhei Sutou # Copyright(C) 2013 Kenji Maruyama # # This library is free software; you can redistribute it and/or @@ -34,7 +34,8 @@ INSERT INTO memos VALUES ("Tomorrow will be fine."); INSERT INTO memos VALUES ("Yesterday was fine."); SELECT * FROM memos - WHERE MATCH (content) AGAINST ("*DOR today +good tomorrow" IN BOOLEAN MODE); + WHERE MATCH (content) AGAINST ("*DOR today +good tomorrow" IN BOOLEAN MODE) + ORDER BY content; DROP TABLE memos; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_boolean_mode_pragma_default_operator_plus_with_astarisk.test b/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_boolean_mode_pragma_default_operator_plus_with_astarisk.test new file mode 100644 index 00000000000..ded739d8e8b --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_boolean_mode_pragma_default_operator_plus_with_astarisk.test @@ -0,0 +1,38 @@ +# Copyright(C) 2015 Naoya Murakami +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/have_mroonga.inc + +--disable_warnings +DROP TABLE IF EXISTS memos; +--enable_warnings + +SET NAMES utf8; +CREATE TABLE memos ( + content TEXT, + FULLTEXT INDEX (content) +) DEFAULT CHARSET=utf8; + +INSERT INTO memos VALUES ("Today is good day."); +INSERT INTO memos VALUES ("Tomorrow will be good day."); +INSERT INTO memos VALUES ("Today is fine."); + +SELECT * FROM memos + WHERE MATCH (content) AGAINST ("*D+ today fi*" IN BOOLEAN MODE); + +DROP TABLE memos; + +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_not_match_against.test b/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_not_match_against.test index 7b4e62ba0a9..ffb49f2f396 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_not_match_against.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_not_match_against.test @@ -1,4 +1,5 @@ # Copyright(C) 2010 Tetsuro IKEDA +# Copyright(C) 2015 Kouhei Sutou # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -31,16 +32,16 @@ insert into t1 values(6,20,"ka ki ku ke ko"); insert into t1 values(7,20,"aa ii uu ee oo"); insert into t1 values(8,20,"ka ki ku ke ko"); select * from t1; -select * from t1 where match(c3) against("uu"); -select * from t1 where not match(c3) against("uu"); -select * from t1 where match(c3) against("dummy"); -select * from t1 where not match(c3) against("dummy"); -select * from t1 where c1 = 4 and not match(c3) against("uu"); -select * from t1 where c1 <= 4 and not match(c3) against("uu"); -select * from t1 where c1 > 4 and not match(c3) against("uu"); -select * from t1 where c2 = 10 and not match(c3) against("uu"); -select * from t1 where c2 >= 15 and not match(c3) against("uu"); -select * from t1 where c2 < 15 and not match(c3) against("uu"); +select * from t1 where match(c3) against("+uu" in boolean mode) order by c1; +select * from t1 where not match(c3) against("+uu" in boolean mode) order by c1; +select * from t1 where match(c3) against("+dummy" in boolean mode) order by c1; +select * from t1 where not match(c3) against("+dummy" in boolean mode) order by c1; +select * from t1 where c1 = 4 and not match(c3) against("+uu" in boolean mode) order by c1; +select * from t1 where c1 <= 4 and not match(c3) against("+uu" in boolean mode) order by c1; +select * from t1 where c1 > 4 and not match(c3) against("+uu" in boolean mode) order by c1; +select * from t1 where c2 = 10 and not match(c3) against("+uu" in boolean mode) order by c1; +select * from t1 where c2 >= 15 and not match(c3) against("+uu" in boolean mode) order by c1; +select * from t1 where c2 < 15 and not match(c3) against("+uu" in boolean mode) order by c1; drop table t1; --source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/index_multiple_column_unique_datetime_insert_delete_insert_invalid_value.test b/storage/mroonga/mysql-test/mroonga/storage/t/index_multiple_column_unique_datetime_insert_delete_insert_invalid_value.test new file mode 100644 index 00000000000..2782fc15363 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/storage/t/index_multiple_column_unique_datetime_insert_delete_insert_invalid_value.test @@ -0,0 +1,39 @@ +# Copyright(C) 2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/have_mroonga.inc + +--disable_warnings +DROP TABLE IF EXISTS ranges; +--enable_warnings + +CREATE TABLE ranges ( + id int PRIMARY KEY, + start datetime, + end datetime, + UNIQUE KEY range_key(start, end) +); + +INSERT INTO ranges VALUES (1, "1990-00-00 00:00:00", "2012-10-05 23:59:59"); +SELECT * FROM ranges; + +DELETE FROM ranges WHERE id = 1; +INSERT INTO ranges VALUES (1, "1990-00-00 00:00:00", "2012-10-05 23:59:59"); +SELECT * FROM ranges; + +DROP TABLE ranges; + +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/replace_select_varchar.test b/storage/mroonga/mysql-test/mroonga/storage/t/replace_select_varchar.test index 192a4976cbd..d7cd89cf78c 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/replace_select_varchar.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/replace_select_varchar.test @@ -57,7 +57,8 @@ REPLACE INTO videos_groonga FROM videos_master AS v WHERE v.video_id = (video_id); SELECT *, MATCH(description) AGAINST("my") FROM videos_groonga - WHERE MATCH(description) AGAINST("my"); + WHERE MATCH(description) AGAINST("my") + ORDER BY id; DROP TABLE videos_master, videos_groonga; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/replace_without_key.test b/storage/mroonga/mysql-test/mroonga/storage/t/replace_without_key.test index a38c4953e67..5cbeab60fb0 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/replace_without_key.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/replace_without_key.test @@ -27,7 +27,7 @@ CREATE TABLE diaries ( FULLTEXT INDEX (content) ) DEFAULT CHARSET=utf8; --- error ER_ERROR_ON_WRITE +-- error ER_ERROR_ON_WRITE, ER_NO_DEFAULT_FOR_FIELD REPLACE INTO diaries(content) VALUES("Hello"); DROP TABLE diaries; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/truncate.test b/storage/mroonga/mysql-test/mroonga/storage/t/truncate.test index 5833f77722a..dac32178011 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/truncate.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/truncate.test @@ -1,4 +1,4 @@ -# Copyright(C) 2011-2012 Kouhei Sutou +# Copyright(C) 2011-2015 Kouhei Sutou # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -38,17 +38,23 @@ INSERT INTO diaries VALUES(2, 2011, 11, 10, "天気", "明日の富士山の天 INSERT INTO diaries VALUES(3, 2011, 11, 11, "富士山", "今日も天気がよくてきれいに見える。"); SELECT * FROM diaries; -SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日 天気" IN BOOLEAN MODE); +SELECT * FROM diaries + WHERE MATCH(content) AGAINST("+今日" IN BOOLEAN MODE) + ORDER BY id; TRUNCATE TABLE diaries; SELECT * FROM diaries; -SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日 天気" IN BOOLEAN MODE); +SELECT * FROM diaries + WHERE MATCH(content) AGAINST("+今日" IN BOOLEAN MODE) + ORDER BY id; INSERT INTO diaries VALUES(1, 2011, 11, 11, "帰り道", "つかれたー"); INSERT INTO diaries VALUES(2, 2011, 12, 1, "久しぶり", "天気が悪いからずっと留守番。"); INSERT INTO diaries VALUES(3, 2011, 12, 2, "初雪", "今年はじめての雪!"); SELECT * FROM diaries; -SELECT * FROM diaries WHERE MATCH(content) AGAINST("悪い" IN BOOLEAN MODE); +SELECT * FROM diaries + WHERE MATCH(content) AGAINST("+悪い" IN BOOLEAN MODE) + ORDER BY id; DROP TABLE diaries; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/variable_match_escalation_threshold_global.test b/storage/mroonga/mysql-test/mroonga/storage/t/variable_match_escalation_threshold_global.test index 55a318b786a..9018bd75626 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/variable_match_escalation_threshold_global.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/variable_match_escalation_threshold_global.test @@ -14,7 +14,6 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---source ../../include/mroonga/have_fulltext_index_comment.inc --source ../../include/mroonga/have_mroonga.inc --disable_warnings diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/variable_match_escalation_threshold_session.test b/storage/mroonga/mysql-test/mroonga/storage/t/variable_match_escalation_threshold_session.test index c459e50c0d7..49557069965 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/variable_match_escalation_threshold_session.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/variable_match_escalation_threshold_session.test @@ -14,7 +14,6 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---source ../../include/mroonga/have_fulltext_index_comment.inc --source ../../include/mroonga/have_mroonga.inc --disable_warnings diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_flags_comment.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_flags_comment.result new file mode 100644 index 00000000000..fb03bfe8d8d --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_flags_comment.result @@ -0,0 +1,9 @@ +SET NAMES utf8; +CREATE TABLE memos ( +content VARCHAR(64) NOT NULL PRIMARY KEY, +FULLTEXT INDEX (content) COMMENT 'flags "WITH_POSITION|WITH_WEIGHT"' +) COMMENT='engine "InnoDB"' DEFAULT CHARSET=utf8; +SELECT mroonga_command("dump --dump_plugins no --dump_schema no"); +mroonga_command("dump --dump_plugins no --dump_schema no") +column_create memos-content index COLUMN_INDEX|WITH_WEIGHT|WITH_POSITION memos +DROP TABLE memos; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_flags_none.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_flags_none.result new file mode 100644 index 00000000000..4a7107146ce --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_flags_none.result @@ -0,0 +1,9 @@ +SET NAMES utf8; +CREATE TABLE memos ( +content VARCHAR(64) NOT NULL PRIMARY KEY, +FULLTEXT INDEX (content) COMMENT 'flags "NONE"' +) COMMENT='engine "InnoDB"' DEFAULT CHARSET=utf8; +SELECT mroonga_command("dump --dump_plugins no --dump_schema no"); +mroonga_command("dump --dump_plugins no --dump_schema no") +column_create memos-content index COLUMN_INDEX memos +DROP TABLE memos; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_flags_parameter.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_flags_parameter.result new file mode 100644 index 00000000000..6e00526c736 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_flags_parameter.result @@ -0,0 +1,16 @@ +SET NAMES utf8; +CREATE TABLE memos ( +content VARCHAR(64) NOT NULL PRIMARY KEY, +FULLTEXT INDEX (content) FLAGS='WITH_POSITION|WITH_WEIGHT' +) COMMENT='ENGINE "InnoDB"' DEFAULT CHARSET=utf8; +SHOW CREATE TABLE memos; +Table Create Table +memos CREATE TABLE `memos` ( + `content` varchar(64) NOT NULL, + PRIMARY KEY (`content`), + FULLTEXT KEY `content` (`content`) `FLAGS`='WITH_POSITION|WITH_WEIGHT' +) ENGINE=Mroonga DEFAULT CHARSET=utf8 COMMENT='ENGINE "InnoDB"' +SELECT mroonga_command("dump --dump_plugins no --dump_schema no"); +mroonga_command("dump --dump_plugins no --dump_schema no") +column_create memos-content index COLUMN_INDEX|WITH_WEIGHT|WITH_POSITION memos +DROP TABLE memos; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_normalizer_comment.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_normalizer_comment.result new file mode 100644 index 00000000000..1c9bf50fad9 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_normalizer_comment.result @@ -0,0 +1,21 @@ +DROP TABLE IF EXISTS memos; +SET NAMES utf8; +CREATE TABLE memos ( +id INT NOT NULL PRIMARY KEY, +content TEXT NOT NULL, +FULLTEXT INDEX (content) COMMENT 'normalizer "NormalizerAuto"' +) COMMENT='ENGINE "InnoDB"' DEFAULT CHARSET=utf8; +SHOW CREATE TABLE memos; +Table Create Table +memos CREATE TABLE `memos` ( + `id` int(11) NOT NULL, + `content` text NOT NULL, + PRIMARY KEY (`id`), + FULLTEXT KEY `content` (`content`) COMMENT 'normalizer "NormalizerAuto"' +) ENGINE=Mroonga DEFAULT CHARSET=utf8 COMMENT='ENGINE "InnoDB"' +INSERT INTO memos VALUES (1, "1日の消費㌍は約2000㌔㌍"); +SELECT * FROM memos +WHERE MATCH (content) AGAINST ("+カロリー" IN BOOLEAN MODE); +id content +1 1日の消費㌍は約2000㌔㌍ +DROP TABLE memos; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_normalizer_fulltext_index.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_normalizer_fulltext_index.result deleted file mode 100644 index ea992f827ca..00000000000 --- a/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_normalizer_fulltext_index.result +++ /dev/null @@ -1,16 +0,0 @@ -DROP TABLE IF EXISTS diaries; -SET NAMES utf8; -CREATE TABLE diaries ( -day DATE PRIMARY KEY, -content VARCHAR(64) NOT NULL, -FULLTEXT INDEX (content) COMMENT 'normalizer "NormalizerAuto"' -) COMMENT='engine "InnoDB"' DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -INSERT INTO diaries VALUES ("2013-04-23", "ブラックコーヒーを飲んだ。"); -SELECT * FROM diaries -WHERE MATCH (content) AGAINST ("+ふらつく" IN BOOLEAN MODE); -day content -SELECT * FROM diaries -WHERE MATCH (content) AGAINST ("+ブラック" IN BOOLEAN MODE); -day content -2013-04-23 ブラックコーヒーを飲んだ。 -DROP TABLE diaries; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_normalizer_parameter.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_normalizer_parameter.result new file mode 100644 index 00000000000..d3bc05a9b7d --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_normalizer_parameter.result @@ -0,0 +1,21 @@ +DROP TABLE IF EXISTS memos; +SET NAMES utf8; +CREATE TABLE memos ( +id INT NOT NULL PRIMARY KEY, +content TEXT NOT NULL, +FULLTEXT INDEX (content) NORMALIZER='NormalizerAuto' +) COMMENT='ENGINE "InnoDB"' DEFAULT CHARSET=utf8; +SHOW CREATE TABLE memos; +Table Create Table +memos CREATE TABLE `memos` ( + `id` int(11) NOT NULL, + `content` text NOT NULL, + PRIMARY KEY (`id`), + FULLTEXT KEY `content` (`content`) `NORMALIZER`='NormalizerAuto' +) ENGINE=Mroonga DEFAULT CHARSET=utf8 COMMENT='ENGINE "InnoDB"' +INSERT INTO memos VALUES (1, "1日の消費㌍は約2000㌔㌍"); +SELECT * FROM memos +WHERE MATCH (content) AGAINST ("+カロリー" IN BOOLEAN MODE); +id content +1 1日の消費㌍は約2000㌔㌍ +DROP TABLE memos; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_parser_comment.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_parser_comment.result similarity index 60% rename from storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_parser_comment.result rename to storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_parser_comment.result index d7b20a3714f..7ee07329f21 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_parser_comment.result +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_parser_comment.result @@ -13,17 +13,17 @@ diaries CREATE TABLE `diaries` ( PRIMARY KEY (`id`), FULLTEXT KEY `body_index` (`body`) COMMENT 'parser "TokenBigramSplitSymbolAlphaDigit"' ) ENGINE=Mroonga DEFAULT CHARSET=utf8 COMMENT='engine "innodb"' -insert into diaries (body) values ("will start groonga!"); -insert into diaries (body) values ("starting groonga..."); -insert into diaries (body) values ("started groonga."); +insert into diaries (body) values ("will start Groonga!"); +insert into diaries (body) values ("starting Groonga..."); +insert into diaries (body) values ("started Groonga."); select * from diaries; id body -1 will start groonga! -2 starting groonga... -3 started groonga. -select * from diaries where match(body) against("start"); +1 will start Groonga! +2 starting Groonga... +3 started Groonga. +select * from diaries where match(body) against("+start" in boolean mode) order by id; id body -1 will start groonga! -2 starting groonga... -3 started groonga. +1 will start Groonga! +2 starting Groonga... +3 started Groonga. drop table diaries; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_token_filters_index_comment_multiple_token_filters.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_token_filters_index_multiple_token_filters.result similarity index 83% rename from storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_token_filters_index_comment_multiple_token_filters.result rename to storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_token_filters_index_multiple_token_filters.result index 68319844df8..e1e32dccc37 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_token_filters_index_comment_multiple_token_filters.result +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_token_filters_index_multiple_token_filters.result @@ -1,5 +1,5 @@ -SELECT mroonga_command("register token_filters/stop_word"); -mroonga_command("register token_filters/stop_word") +SELECT mroonga_command("plugin_register token_filters/stop_word"); +mroonga_command("plugin_register token_filters/stop_word") true SET NAMES utf8; CREATE TABLE memos ( diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_token_filters_index_comment_one_token_filter.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_token_filters_index_one_token_filter.result similarity index 82% rename from storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_token_filters_index_comment_one_token_filter.result rename to storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_token_filters_index_one_token_filter.result index fa3012705ad..11ee04e2998 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_token_filters_index_comment_one_token_filter.result +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_token_filters_index_one_token_filter.result @@ -1,5 +1,5 @@ -SELECT mroonga_command("register token_filters/stop_word"); -mroonga_command("register token_filters/stop_word") +SELECT mroonga_command("plugin_register token_filters/stop_word"); +mroonga_command("plugin_register token_filters/stop_word") true SET NAMES utf8; CREATE TABLE memos ( diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_token_filters_index_parameter.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_token_filters_index_parameter.result new file mode 100644 index 00000000000..f6d6be1b643 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_token_filters_index_parameter.result @@ -0,0 +1,25 @@ +SELECT mroonga_command("plugin_register token_filters/stop_word"); +mroonga_command("plugin_register token_filters/stop_word") +true +SET NAMES utf8; +CREATE TABLE memos ( +id INT NOT NULL PRIMARY KEY, +content VARCHAR(64) NOT NULL, +FULLTEXT INDEX (content) TOKEN_FILTERS='TokenFilterStopWord,TokenFilterStopWord' +) COMMENT='ENGINE "InnoDB"' DEFAULT CHARSET=utf8; +SHOW CREATE TABLE memos; +Table Create Table +memos CREATE TABLE `memos` ( + `id` int(11) NOT NULL, + `content` varchar(64) NOT NULL, + PRIMARY KEY (`id`), + FULLTEXT KEY `content` (`content`) `TOKEN_FILTERS`='TokenFilterStopWord,TokenFilterStopWord' +) ENGINE=Mroonga DEFAULT CHARSET=utf8 COMMENT='ENGINE "InnoDB"' +SELECT mroonga_command("dump --dump_plugins no"); +mroonga_command("dump --dump_plugins no") +table_create memos TABLE_HASH_KEY ShortText + +table_create memos-content TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerMySQLGeneralCI --token_filters TokenFilterStopWord,TokenFilterStopWord + +column_create memos-content index COLUMN_INDEX|WITH_POSITION memos +DROP TABLE memos; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_tokenizer_comment.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_tokenizer_comment.result new file mode 100644 index 00000000000..f6e15804f42 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_tokenizer_comment.result @@ -0,0 +1,29 @@ +drop table if exists diaries; +create table diaries ( +id int primary key auto_increment, +body text, +fulltext index body_index (body) +comment 'tokenizer "TokenBigramSplitSymbolAlphaDigit"' +) comment = 'engine "innodb"' default charset utf8; +show create table diaries; +Table Create Table +diaries CREATE TABLE `diaries` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `body` text, + PRIMARY KEY (`id`), + FULLTEXT KEY `body_index` (`body`) COMMENT 'tokenizer "TokenBigramSplitSymbolAlphaDigit"' +) ENGINE=Mroonga DEFAULT CHARSET=utf8 COMMENT='engine "innodb"' +insert into diaries (body) values ("will start Groonga!"); +insert into diaries (body) values ("starting Groonga..."); +insert into diaries (body) values ("started Groonga."); +select * from diaries; +id body +1 will start Groonga! +2 starting Groonga... +3 started Groonga. +select * from diaries where match(body) against("+start" in boolean mode) order by id; +id body +1 will start Groonga! +2 starting Groonga... +3 started Groonga. +drop table diaries; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_tokenizer_parameter.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_tokenizer_parameter.result new file mode 100644 index 00000000000..ddec8fdadbe --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/create_table_tokenizer_parameter.result @@ -0,0 +1,30 @@ +DROP TABLE IF EXISTS diaries; +CREATE TABLE diaries ( +id int PRIMARY KEY AUTO_INCREMENT, +body text, +FULLTEXT INDEX body_index (body) TOKENIZER='TokenBigramSplitSymbolAlphaDigit' +) COMMENT = 'ENGINE "InnoDB"' DEFAULT CHARSET utf8; +SHOW CREATE TABLE diaries; +Table Create Table +diaries CREATE TABLE `diaries` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `body` text, + PRIMARY KEY (`id`), + FULLTEXT KEY `body_index` (`body`) `TOKENIZER`='TokenBigramSplitSymbolAlphaDigit' +) ENGINE=Mroonga DEFAULT CHARSET=utf8 COMMENT='ENGINE "InnoDB"' +INSERT INTO diaries (body) VALUES ("will start Groonga!"); +INSERT INTO diaries (body) VALUES ("starting Groonga..."); +INSERT INTO diaries (body) VALUES ("started Groonga."); +SELECT * FROM diaries; +id body +1 will start Groonga! +2 starting Groonga... +3 started Groonga. +SELECT * FROM diaries +WHERE MATCH(body) AGAINST("+start" IN BOOLEAN MODE) +ORDER BY id; +id body +1 will start Groonga! +2 starting Groonga... +3 started Groonga. +DROP TABLE diaries; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_boolean_mode_pragma_default_operator_or_no_operator.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_boolean_mode_pragma_default_operator_or_no_operator.result index 14d30fac260..96d92e535d2 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_boolean_mode_pragma_default_operator_or_no_operator.result +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_boolean_mode_pragma_default_operator_or_no_operator.result @@ -11,9 +11,10 @@ INSERT INTO memos VALUES (NULL, "Today is fine."); INSERT INTO memos VALUES (NULL, "Tomorrow will be fine."); INSERT INTO memos VALUES (NULL, "Yesterday was fine."); SELECT * FROM memos -WHERE MATCH (content) AGAINST ("*DOR today good" IN BOOLEAN MODE); +WHERE MATCH (content) AGAINST ("*DOR today good" IN BOOLEAN MODE) +ORDER BY id; id content 1 Today is good day. -3 Today is fine. 2 Tomorrow will be good day. +3 Today is fine. DROP TABLE memos; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_boolean_mode_pragma_default_operator_or_with_minus.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_boolean_mode_pragma_default_operator_or_with_minus.result index d367ba1d21f..ee8d851011f 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_boolean_mode_pragma_default_operator_or_with_minus.result +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_boolean_mode_pragma_default_operator_or_with_minus.result @@ -11,7 +11,8 @@ INSERT INTO memos VALUES (NULL, "Today is fine."); INSERT INTO memos VALUES (NULL, "Tomorrow will be fine."); INSERT INTO memos VALUES (NULL, "Yesterday was fine."); SELECT * FROM memos -WHERE MATCH (content) AGAINST ("*DOR today -good tomorrow" IN BOOLEAN MODE); +WHERE MATCH (content) AGAINST ("*DOR today -good tomorrow" IN BOOLEAN MODE) +ORDER BY id; id content 2 Tomorrow will be good day. 3 Today is fine. diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_boolean_mode_pragma_default_operator_or_with_plus.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_boolean_mode_pragma_default_operator_or_with_plus.result index 6bf48ab6556..bb94043256d 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_boolean_mode_pragma_default_operator_or_with_plus.result +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_boolean_mode_pragma_default_operator_or_with_plus.result @@ -11,7 +11,8 @@ INSERT INTO memos VALUES (NULL, "Today is fine."); INSERT INTO memos VALUES (NULL, "Tomorrow will be fine."); INSERT INTO memos VALUES (NULL, "Yesterday was fine."); SELECT * FROM memos -WHERE MATCH (content) AGAINST ("*DOR today +good tomorrow" IN BOOLEAN MODE); +WHERE MATCH (content) AGAINST ("*DOR today +good tomorrow" IN BOOLEAN MODE) +ORDER BY id; id content 1 Today is good day. 2 Tomorrow will be good day. diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_insert_select.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_insert_select.result index 03300e3e9ef..7391ee4ba8d 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_insert_select.result +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_insert_select.result @@ -55,12 +55,12 @@ c1 c2 match(c2) against("ii") 3 aa ii ii ii oo 524289 select c1,c2,match(c2) against("ii") from t1 where match(c2) against("ii"); c1 c2 match(c2) against("ii") -1 aa ii uu ee oo 174763 3 aa ii ii ii oo 524289 5 ta ti ii ii to 349526 +1 aa ii uu ee oo 174763 select c1,c2,match(c2) against("ii") from t1 where match(c2) against("ii"); c1 c2 match(c2) against("ii") -1 aa ii uu ee oo 174763 3 aa ii ii ii oo 524289 5 ta ti ii ii to 349526 +1 aa ii uu ee oo 174763 drop table t1,t2; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_many_records.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_many_records.result index 3809006038c..03cf96b55f8 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_many_records.result +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_many_records.result @@ -4112,7 +4112,7 @@ insert into diaries values(4094, "2022-09-28"); insert into diaries values(4095, "2022-09-29"); commit; set autocommit=1; -select * from diaries where match(title) against("2022-09-0"); +select * from diaries where match(title) against("2022-09-0") order by id; id title 3824 2022-01-01 3825 2022-01-02 diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_matched_and_not_matched_have_where_matched_order.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_matched_and_not_matched_have_where_matched_order.result new file mode 100644 index 00000000000..def5db40cb9 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_matched_and_not_matched_have_where_matched_order.result @@ -0,0 +1,26 @@ +DROP TABLE IF EXISTS texts; +SET NAMES UTF8; +CREATE TABLE texts ( +id INT PRIMARY KEY, +matched TEXT, +not_matched TEXT, +FULLTEXT KEY (matched), +FULLTEXT KEY (not_matched) +) DEFAULT CHARSET=UTF8 COMMENT='engine "InnoDB"'; +INSERT INTO texts VALUES (1, 'Hello1', 'World1'); +INSERT INTO texts VALUES (2, 'Hello2', 'World2'); +INSERT INTO texts VALUES (3, 'Hello3', 'World3'); +SELECT id, +matched, +not_matched, +MATCH(matched) AGAINST('+Hello' IN BOOLEAN MODE), +MATCH(not_matched) AGAINST('+Hello' IN BOOLEAN MODE) +FROM texts +WHERE MATCH(matched) AGAINST('+Hello' IN BOOLEAN MODE) +ORDER BY MATCH(not_matched) AGAINST('+Hello' IN BOOLEAN MODE), +id; +id matched not_matched MATCH(matched) AGAINST('+Hello' IN BOOLEAN MODE) MATCH(not_matched) AGAINST('+Hello' IN BOOLEAN MODE) +1 Hello1 World1 1 0 +2 Hello2 World2 1 0 +3 Hello3 World3 1 0 +DROP TABLE texts; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_matched_and_not_matched_have_where_no_order.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_matched_and_not_matched_have_where_no_order.result new file mode 100644 index 00000000000..81ce556e745 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_matched_and_not_matched_have_where_no_order.result @@ -0,0 +1,24 @@ +DROP TABLE IF EXISTS texts; +SET NAMES UTF8; +CREATE TABLE texts ( +id INT PRIMARY KEY, +matched TEXT, +not_matched TEXT, +FULLTEXT KEY (matched), +FULLTEXT KEY (not_matched) +) DEFAULT CHARSET=UTF8 COMMENT='engine "InnoDB"'; +INSERT INTO texts VALUES (1, 'Hello1', 'World1'); +INSERT INTO texts VALUES (2, 'Hello2', 'World2'); +INSERT INTO texts VALUES (3, 'Hello3', 'World3'); +SELECT id, +matched, +not_matched, +MATCH(matched) AGAINST('+Hello' IN BOOLEAN MODE), +MATCH(not_matched) AGAINST('+Hello' IN BOOLEAN MODE) +FROM texts +WHERE MATCH(matched) AGAINST('+Hello' IN BOOLEAN MODE); +id matched not_matched MATCH(matched) AGAINST('+Hello' IN BOOLEAN MODE) MATCH(not_matched) AGAINST('+Hello' IN BOOLEAN MODE) +1 Hello1 World1 1 0 +3 Hello3 World3 1 0 +2 Hello2 World2 1 0 +DROP TABLE texts; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_matched_and_not_matched_no_where_both_order.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_matched_and_not_matched_no_where_both_order.result new file mode 100644 index 00000000000..f619e467040 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_matched_and_not_matched_no_where_both_order.result @@ -0,0 +1,26 @@ +DROP TABLE IF EXISTS texts; +SET NAMES UTF8; +CREATE TABLE texts ( +id INT PRIMARY KEY, +matched TEXT, +not_matched TEXT, +FULLTEXT KEY (matched), +FULLTEXT KEY (not_matched) +) DEFAULT CHARSET=UTF8 COMMENT='engine "InnoDB"'; +INSERT INTO texts VALUES (1, 'Hello1', 'World1'); +INSERT INTO texts VALUES (2, 'Hello2', 'World2'); +INSERT INTO texts VALUES (3, 'Hello3', 'World3'); +SELECT id, +matched, +not_matched, +MATCH(matched) AGAINST('+Hello' IN BOOLEAN MODE), +MATCH(not_matched) AGAINST('+Hello' IN BOOLEAN MODE) +FROM texts +ORDER BY MATCH(matched) AGAINST('+Hello' IN BOOLEAN MODE), +MATCH(not_matched) AGAINST('+Hello' IN BOOLEAN MODE), +id; +id matched not_matched MATCH(matched) AGAINST('+Hello' IN BOOLEAN MODE) MATCH(not_matched) AGAINST('+Hello' IN BOOLEAN MODE) +1 Hello1 World1 1 0 +2 Hello2 World2 1 0 +3 Hello3 World3 1 0 +DROP TABLE texts; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_myisam.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_myisam.result index de1b8d41906..860c8e548a8 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_myisam.result +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_myisam.result @@ -36,17 +36,17 @@ c1 c2 c3 3 30 sa si su se so 4 40 ta ti tu te to 5 50 aa ii uu ee oo -select * from t1 where match(c3) against("su"); +select * from t1 where match(c3) against("su") order by c1; c1 c2 c3 3 30 sa si su se so -select * from t1 where match(c3) against("ii"); +select * from t1 where match(c3) against("ii") order by c1; c1 c2 c3 1 10 aa ii uu ee oo 5 50 aa ii uu ee oo -select * from t1 where match(c3) against("+su" in boolean mode); +select * from t1 where match(c3) against("+su" in boolean mode) order by c1; c1 c2 c3 3 30 sa si su se so -select * from t1 where match(c3) against("+ii" in boolean mode); +select * from t1 where match(c3) against("+ii" in boolean mode) order by c1; c1 c2 c3 1 10 aa ii uu ee oo 5 50 aa ii uu ee oo @@ -61,10 +61,10 @@ c1 c2 c3 1 明日の富士山の天気について あああああああ 2 いいいいい 明日の富士山の天気は分かりません 3 dummy dummy -select * from t1 where match(c2) against("富士山"); +select * from t1 where match(c2) against("富士山") order by c1; c1 c2 c3 1 明日の富士山の天気について あああああああ -select * from t1 where match(c3) against("富士山"); +select * from t1 where match(c3) against("富士山") order by c1; c1 c2 c3 2 いいいいい 明日の富士山の天気は分かりません drop table t1; @@ -124,14 +124,14 @@ c1 c2 match(c2) against("ii") 3 aa ii ii ii oo 524289 select c1,c2,match(c2) against("ii") from t1 where match(c2) against("ii"); c1 c2 match(c2) against("ii") -1 aa ii uu ee oo 174763 3 aa ii ii ii oo 524289 5 ta ti ii ii to 349526 +1 aa ii uu ee oo 174763 select c1,c2,match(c2) against("ii") from t1 where match(c2) against("ii"); c1 c2 match(c2) against("ii") -1 aa ii uu ee oo 174763 3 aa ii ii ii oo 524289 5 ta ti ii ii to 349526 +1 aa ii uu ee oo 174763 drop table t1,t2; create table t1 (c1 int primary key, c2 int, c3 text, fulltext index ft(c3)) COMMENT = 'engine "myisam"'; insert into t1 values(1,10,"aa ii uu ee oo"); @@ -152,7 +152,7 @@ c1 c2 c3 6 20 ka ki ku ke ko 7 20 aa ii uu ee oo 8 20 ka ki ku ke ko -select *,match(c3) against("uu") from t1 where match(c3) against("uu"); +select *,match(c3) against("uu") from t1 where match(c3) against("uu") order by c1; c1 c2 c3 match(c3) against("uu") 1 10 aa ii uu ee oo 131073 3 10 aa ii uu ee oo 131073 diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_not_match_against.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_not_match_against.result index bbe23df3e0f..4646aad6a20 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_not_match_against.result +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_not_match_against.result @@ -18,21 +18,21 @@ c1 c2 c3 6 20 ka ki ku ke ko 7 20 aa ii uu ee oo 8 20 ka ki ku ke ko -select *,match(c3) against("uu") from t1 where match(c3) against("uu"); +select *,match(c3) against("uu") from t1 where match(c3) against("uu") order by c1; c1 c2 c3 match(c3) against("uu") 1 10 aa ii uu ee oo 131073 3 10 aa ii uu ee oo 131073 5 20 aa ii uu ee oo 131073 7 20 aa ii uu ee oo 131073 -select * from t1 where not match(c3) against("uu"); +select * from t1 where not match(c3) against("uu") order by c1; c1 c2 c3 2 10 ka ki ku ke ko 4 10 ka ki ku ke ko 6 20 ka ki ku ke ko 8 20 ka ki ku ke ko -select *,match(c3) against("dummy") from t1 where match(c3) against("dummy"); +select *,match(c3) against("dummy") from t1 where match(c3) against("dummy") order by c1; c1 c2 c3 match(c3) against("dummy") -select * from t1 where not match(c3) against("dummy"); +select * from t1 where not match(c3) against("dummy") order by c1; c1 c2 c3 1 10 aa ii uu ee oo 2 10 ka ki ku ke ko @@ -42,26 +42,26 @@ c1 c2 c3 6 20 ka ki ku ke ko 7 20 aa ii uu ee oo 8 20 ka ki ku ke ko -select * from t1 where c1 = 4 and not match(c3) against("uu"); +select * from t1 where c1 = 4 and not match(c3) against("uu") order by c1; c1 c2 c3 4 10 ka ki ku ke ko -select * from t1 where c1 <= 4 and not match(c3) against("uu"); +select * from t1 where c1 <= 4 and not match(c3) against("uu") order by c1; c1 c2 c3 2 10 ka ki ku ke ko 4 10 ka ki ku ke ko -select * from t1 where c1 > 4 and not match(c3) against("uu"); +select * from t1 where c1 > 4 and not match(c3) against("uu") order by c1; c1 c2 c3 6 20 ka ki ku ke ko 8 20 ka ki ku ke ko -select * from t1 where c2 = 10 and not match(c3) against("uu"); +select * from t1 where c2 = 10 and not match(c3) against("uu") order by c1; c1 c2 c3 2 10 ka ki ku ke ko 4 10 ka ki ku ke ko -select * from t1 where c2 >= 15 and not match(c3) against("uu"); +select * from t1 where c2 >= 15 and not match(c3) against("uu") order by c1; c1 c2 c3 6 20 ka ki ku ke ko 8 20 ka ki ku ke ko -select * from t1 where c2 < 15 and not match(c3) against("uu"); +select * from t1 where c2 < 15 and not match(c3) against("uu") order by c1; c1 c2 c3 2 10 ka ki ku ke ko 4 10 ka ki ku ke ko diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_order_TODO_SPLIT_ME.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_order_TODO_SPLIT_ME.result index 279ad8bf985..18d78d88c93 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_order_TODO_SPLIT_ME.result +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/fulltext_order_TODO_SPLIT_ME.result @@ -29,22 +29,6 @@ a b c SELECT a, b, c FROM ft WHERE MATCH(b) AGAINST('bbbbb' IN BOOLEAN MODE) ORDER BY MATCH(b) AGAINST('bbbbb' IN BOOLEAN MODE); a b c 2 bbbbb bcdef -SELECT a, b, c FROM ft WHERE MATCH(b) AGAINST('bbbbb' IN BOOLEAN MODE) ORDER BY MATCH(c) AGAINST('bbbbb' IN BOOLEAN MODE); -a b c -2 bbbbb bcdef SELECT a, b, c FROM ft WHERE MATCH(c) AGAINST('bbbbb' IN BOOLEAN MODE); a b c -SELECT a, b, c, MATCH(b) AGAINST('bbbbb' IN BOOLEAN MODE), MATCH(c) AGAINST('bbbbb' IN BOOLEAN MODE) FROM ft WHERE MATCH(b) AGAINST('bbbbb' IN BOOLEAN MODE) ORDER BY MATCH(c) AGAINST('bbbbb' IN BOOLEAN MODE); -a b c MATCH(b) AGAINST('bbbbb' IN BOOLEAN MODE) MATCH(c) AGAINST('bbbbb' IN BOOLEAN MODE) -2 bbbbb bcdef 1 0 -SELECT a, b, c, MATCH(b) AGAINST('bbbbb' IN BOOLEAN MODE), MATCH(c) AGAINST('bbbbb' IN BOOLEAN MODE) FROM ft WHERE MATCH(b) AGAINST('bbbbb' IN BOOLEAN MODE); -a b c MATCH(b) AGAINST('bbbbb' IN BOOLEAN MODE) MATCH(c) AGAINST('bbbbb' IN BOOLEAN MODE) -2 bbbbb bcdef 1 0 -SELECT a, b, c, MATCH(b) AGAINST('bbbbb' IN BOOLEAN MODE), MATCH(c) AGAINST('bbbbb' IN BOOLEAN MODE) FROM ft ORDER BY MATCH(c) AGAINST('bbbbb' IN BOOLEAN MODE), MATCH(b) AGAINST('bbbbb' IN BOOLEAN MODE), a; -a b c MATCH(b) AGAINST('bbbbb' IN BOOLEAN MODE) MATCH(c) AGAINST('bbbbb' IN BOOLEAN MODE) -1 aaaaa abcde 0 0 -3 ccccc cdefg 0 0 -4 ddddd defgh 0 0 -5 eeeee efghi 0 0 -2 bbbbb bcdef 1 0 DROP TABLE ft; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/r/truncate.result b/storage/mroonga/mysql-test/mroonga/wrapper/r/truncate.result index 35b273d348f..d41231ddd33 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/r/truncate.result +++ b/storage/mroonga/mysql-test/mroonga/wrapper/r/truncate.result @@ -31,15 +31,18 @@ id year month day title content 1 2011 11 9 Hello 今日からはじめました。 2 2011 11 10 天気 明日の富士山の天気について 3 2011 11 11 富士山 今日も天気がよくてきれいに見える。 -SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日 天気" IN BOOLEAN MODE); +SELECT * FROM diaries +WHERE MATCH(content) AGAINST("+今日" IN BOOLEAN MODE) +ORDER BY id; id year month day title content 1 2011 11 9 Hello 今日からはじめました。 3 2011 11 11 富士山 今日も天気がよくてきれいに見える。 -2 2011 11 10 天気 明日の富士山の天気について TRUNCATE TABLE diaries; SELECT * FROM diaries; id year month day title content -SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日 天気" IN BOOLEAN MODE); +SELECT * FROM diaries +WHERE MATCH(content) AGAINST("+今日" IN BOOLEAN MODE) +ORDER BY id; id year month day title content INSERT INTO diaries VALUES(1, 2011, 11, 11, "帰り道", "つかれたー"); INSERT INTO diaries VALUES(2, 2011, 12, 1, "久しぶり", "天気が悪いからずっと留守番。"); @@ -49,7 +52,9 @@ id year month day title content 1 2011 11 11 帰り道 つかれたー 2 2011 12 1 久しぶり 天気が悪いからずっと留守番。 3 2011 12 2 初雪 今年はじめての雪! -SELECT * FROM diaries WHERE MATCH(content) AGAINST("悪い" IN BOOLEAN MODE); +SELECT * FROM diaries +WHERE MATCH(content) AGAINST("+悪い" IN BOOLEAN MODE) +ORDER BY id; id year month day title content 2 2011 12 1 久しぶり 天気が悪いからずっと留守番。 DROP TABLE diaries; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/suite.pm b/storage/mroonga/mysql-test/mroonga/wrapper/suite.pm index b6e2d741674..528ccc5d693 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/suite.pm +++ b/storage/mroonga/mysql-test/mroonga/wrapper/suite.pm @@ -4,11 +4,6 @@ package My::Suite::Mroonga; return "No Mroonga engine" unless $ENV{HA_MROONGA_SO} or $::mysqld_variables{'mroonga'} eq "ON"; -# -# RECOMPILE_FOR_EMBEDDED also means that a plugin -# cannot be dynamically loaded into embedded -return "Not run for embedded server" if $::opt_embedded_server and - $ENV{HA_MROONGA_SO}; sub is_default { 1 } diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/count_star_with_index.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/count_star_with_index.test index 70c176b5116..899f00320c9 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/count_star_with_index.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/count_star_with_index.test @@ -15,7 +15,6 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --source include/have_innodb.inc ---source ../../include/mroonga/have_fulltext_index_comment.inc --source ../../include/mroonga/have_mroonga.inc --disable_query_log diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_flags_comment.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_flags_comment.test new file mode 100644 index 00000000000..0b2565f2fb5 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_flags_comment.test @@ -0,0 +1,40 @@ +# Copyright(C) 2015 Naoya Murakami +# Copyright(C) 2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source include/have_innodb.inc +--source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/load_mroonga_functions.inc + +--disable_query_log +DROP DATABASE test; +CREATE DATABASE test; +USE test; +--enable_query_log + +SET NAMES utf8; + +CREATE TABLE memos ( + content VARCHAR(64) NOT NULL PRIMARY KEY, + FULLTEXT INDEX (content) COMMENT 'flags "WITH_POSITION|WITH_WEIGHT"' +) COMMENT='engine "InnoDB"' DEFAULT CHARSET=utf8; + +SELECT mroonga_command("dump --dump_plugins no --dump_schema no"); + +DROP TABLE memos; + +--source ../../include/mroonga/unload_mroonga_functions.inc +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_flags_none.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_flags_none.test new file mode 100644 index 00000000000..656a349c1be --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_flags_none.test @@ -0,0 +1,40 @@ +# Copyright(C) 2015 Naoya Murakami +# Copyright(C) 2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source include/have_innodb.inc +--source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/load_mroonga_functions.inc + +--disable_query_log +DROP DATABASE test; +CREATE DATABASE test; +USE test; +--enable_query_log + +SET NAMES utf8; + +CREATE TABLE memos ( + content VARCHAR(64) NOT NULL PRIMARY KEY, + FULLTEXT INDEX (content) COMMENT 'flags "NONE"' +) COMMENT='engine "InnoDB"' DEFAULT CHARSET=utf8; + +SELECT mroonga_command("dump --dump_plugins no --dump_schema no"); + +DROP TABLE memos; + +--source ../../include/mroonga/unload_mroonga_functions.inc +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_flags_parameter.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_flags_parameter.test new file mode 100644 index 00000000000..6b1a4c8dec2 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_flags_parameter.test @@ -0,0 +1,42 @@ +# Copyright(C) 2015 Naoya Murakami +# Copyright(C) 2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/have_mariadb.inc +--source include/have_innodb.inc +--source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/load_mroonga_functions.inc + +--disable_query_log +DROP DATABASE test; +CREATE DATABASE test; +USE test; +--enable_query_log + +SET NAMES utf8; + +CREATE TABLE memos ( + content VARCHAR(64) NOT NULL PRIMARY KEY, + FULLTEXT INDEX (content) FLAGS='WITH_POSITION|WITH_WEIGHT' +) COMMENT='ENGINE "InnoDB"' DEFAULT CHARSET=utf8; +SHOW CREATE TABLE memos; + +SELECT mroonga_command("dump --dump_plugins no --dump_schema no"); + +DROP TABLE memos; + +--source ../../include/mroonga/unload_mroonga_functions.inc +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_normalizer_comment.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_normalizer_comment.test new file mode 100644 index 00000000000..3b84e5d1bce --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_normalizer_comment.test @@ -0,0 +1,40 @@ +# Copyright(C) 2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source include/have_innodb.inc +--source ../../include/mroonga/have_mroonga.inc + +--disable_warnings +DROP TABLE IF EXISTS memos; +--enable_warnings + +SET NAMES utf8; + +CREATE TABLE memos ( + id INT NOT NULL PRIMARY KEY, + content TEXT NOT NULL, + FULLTEXT INDEX (content) COMMENT 'normalizer "NormalizerAuto"' +) COMMENT='ENGINE "InnoDB"' DEFAULT CHARSET=utf8; +SHOW CREATE TABLE memos; + +INSERT INTO memos VALUES (1, "1日の消費㌍は約2000㌔㌍"); + +SELECT * FROM memos + WHERE MATCH (content) AGAINST ("+カロリー" IN BOOLEAN MODE); + +DROP TABLE memos; + +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_normalizer_parameter.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_normalizer_parameter.test new file mode 100644 index 00000000000..b8fe3eb6c7d --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_normalizer_parameter.test @@ -0,0 +1,41 @@ +# Copyright(C) 2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/have_mariadb.inc +--source include/have_innodb.inc +--source ../../include/mroonga/have_mroonga.inc + +--disable_warnings +DROP TABLE IF EXISTS memos; +--enable_warnings + +SET NAMES utf8; + +CREATE TABLE memos ( + id INT NOT NULL PRIMARY KEY, + content TEXT NOT NULL, + FULLTEXT INDEX (content) NORMALIZER='NormalizerAuto' +) COMMENT='ENGINE "InnoDB"' DEFAULT CHARSET=utf8; +SHOW CREATE TABLE memos; + +INSERT INTO memos VALUES (1, "1日の消費㌍は約2000㌔㌍"); + +SELECT * FROM memos + WHERE MATCH (content) AGAINST ("+カロリー" IN BOOLEAN MODE); + +DROP TABLE memos; + +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_parser_comment.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_parser_comment.test similarity index 77% rename from storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_parser_comment.test rename to storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_parser_comment.test index fe80aae0804..05fc2fdcb9d 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_parser_comment.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_parser_comment.test @@ -1,4 +1,4 @@ -# Copyright(C) 2011 Kouhei Sutou +# Copyright(C) 2011-2015 Kouhei Sutou # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -15,7 +15,6 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --source include/have_innodb.inc ---source ../../include/mroonga/have_fulltext_index_comment.inc --source ../../include/mroonga/have_mroonga.inc --disable_warnings @@ -29,11 +28,11 @@ create table diaries ( comment 'parser "TokenBigramSplitSymbolAlphaDigit"' ) comment = 'engine "innodb"' default charset utf8; show create table diaries; -insert into diaries (body) values ("will start groonga!"); -insert into diaries (body) values ("starting groonga..."); -insert into diaries (body) values ("started groonga."); +insert into diaries (body) values ("will start Groonga!"); +insert into diaries (body) values ("starting Groonga..."); +insert into diaries (body) values ("started Groonga."); select * from diaries; -select * from diaries where match(body) against("start"); +select * from diaries where match(body) against("+start" in boolean mode) order by id; drop table diaries; --source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_token_filters_index_comment_multiple_token_filters.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_token_filters_index_multiple_token_filters.test similarity index 91% rename from storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_token_filters_index_comment_multiple_token_filters.test rename to storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_token_filters_index_multiple_token_filters.test index 9ff8e4448d9..472f26cda6e 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_token_filters_index_comment_multiple_token_filters.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_token_filters_index_multiple_token_filters.test @@ -16,6 +16,7 @@ --source include/have_innodb.inc --source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/have_groonga_plugin_register.inc --source ../../include/mroonga/load_mroonga_functions.inc --disable_query_log @@ -24,7 +25,7 @@ CREATE DATABASE test; USE test; --enable_query_log -SELECT mroonga_command("register token_filters/stop_word"); +SELECT mroonga_command("plugin_register token_filters/stop_word"); SET NAMES utf8; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_token_filters_index_comment_one_token_filter.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_token_filters_index_one_token_filter.test similarity index 91% rename from storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_token_filters_index_comment_one_token_filter.test rename to storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_token_filters_index_one_token_filter.test index eee08309f76..0d3c00e2c98 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_token_filters_index_comment_one_token_filter.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_token_filters_index_one_token_filter.test @@ -16,6 +16,7 @@ --source include/have_innodb.inc --source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/have_groonga_plugin_register.inc --source ../../include/mroonga/load_mroonga_functions.inc --disable_query_log @@ -24,7 +25,7 @@ CREATE DATABASE test; USE test; --enable_query_log -SELECT mroonga_command("register token_filters/stop_word"); +SELECT mroonga_command("plugin_register token_filters/stop_word"); SET NAMES utf8; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_token_filters_index_parameter.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_token_filters_index_parameter.test new file mode 100644 index 00000000000..9decafaf1e7 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_token_filters_index_parameter.test @@ -0,0 +1,46 @@ +# Copyright(C) 2014 Naoya Murakami +# Copyright(C) 2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source ../../include/mroonga/have_mariadb.inc +--source include/have_innodb.inc +--source ../../include/mroonga/have_mroonga.inc +--source ../../include/mroonga/have_groonga_plugin_register.inc +--source ../../include/mroonga/load_mroonga_functions.inc + +--disable_query_log +DROP DATABASE test; +CREATE DATABASE test; +USE test; +--enable_query_log + +SELECT mroonga_command("plugin_register token_filters/stop_word"); + +SET NAMES utf8; + +CREATE TABLE memos ( + id INT NOT NULL PRIMARY KEY, + content VARCHAR(64) NOT NULL, + FULLTEXT INDEX (content) TOKEN_FILTERS='TokenFilterStopWord,TokenFilterStopWord' +) COMMENT='ENGINE "InnoDB"' DEFAULT CHARSET=utf8; +SHOW CREATE TABLE memos; + +SELECT mroonga_command("dump --dump_plugins no"); + +DROP TABLE memos; + +--source ../../include/mroonga/unload_mroonga_functions.inc +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_parser_comment.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_tokenizer_comment.test similarity index 69% rename from storage/mroonga/mysql-test/mroonga/storage/t/fulltext_parser_comment.test rename to storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_tokenizer_comment.test index 24cc173485a..5053de07781 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_parser_comment.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_tokenizer_comment.test @@ -1,4 +1,4 @@ -# Copyright(C) 2011 Kouhei Sutou +# Copyright(C) 2011-2015 Kouhei Sutou # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -14,7 +14,7 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---source ../../include/mroonga/have_fulltext_index_comment.inc +--source include/have_innodb.inc --source ../../include/mroonga/have_mroonga.inc --disable_warnings @@ -25,14 +25,14 @@ create table diaries ( id int primary key auto_increment, body text, fulltext index body_index (body) - comment 'parser "TokenBigramSplitSymbolAlphaDigit"' -) default charset utf8; + comment 'tokenizer "TokenBigramSplitSymbolAlphaDigit"' +) comment = 'engine "innodb"' default charset utf8; show create table diaries; -insert into diaries (body) values ("will start groonga!"); -insert into diaries (body) values ("starting groonga..."); -insert into diaries (body) values ("started groonga."); +insert into diaries (body) values ("will start Groonga!"); +insert into diaries (body) values ("starting Groonga..."); +insert into diaries (body) values ("started Groonga."); select * from diaries; -select * from diaries where match(body) against("start"); +select * from diaries where match(body) against("+start" in boolean mode) order by id; drop table diaries; --source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_normalizer_fulltext_index.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_tokenizer_parameter.test similarity index 60% rename from storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_normalizer_fulltext_index.test rename to storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_tokenizer_parameter.test index c4265ffd22e..7c688199314 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_normalizer_fulltext_index.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/create_table_tokenizer_parameter.test @@ -1,4 +1,4 @@ -# Copyright(C) 2013 Kouhei Sutou +# Copyright(C) 2015 Kouhei Sutou # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -14,30 +14,30 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +--source ../../include/mroonga/have_mariadb.inc --source include/have_innodb.inc --source ../../include/mroonga/have_mroonga.inc ---source ../../include/mroonga/load_mroonga_functions.inc --disable_warnings DROP TABLE IF EXISTS diaries; --enable_warnings -SET NAMES utf8; - CREATE TABLE diaries ( - day DATE PRIMARY KEY, - content VARCHAR(64) NOT NULL, - FULLTEXT INDEX (content) COMMENT 'normalizer "NormalizerAuto"' -) COMMENT='engine "InnoDB"' DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + id int PRIMARY KEY AUTO_INCREMENT, + body text, + FULLTEXT INDEX body_index (body) TOKENIZER='TokenBigramSplitSymbolAlphaDigit' +) COMMENT = 'ENGINE "InnoDB"' DEFAULT CHARSET utf8; +SHOW CREATE TABLE diaries; -INSERT INTO diaries VALUES ("2013-04-23", "ブラックコーヒーを飲んだ。"); +INSERT INTO diaries (body) VALUES ("will start Groonga!"); +INSERT INTO diaries (body) VALUES ("starting Groonga..."); +INSERT INTO diaries (body) VALUES ("started Groonga."); +SELECT * FROM diaries; SELECT * FROM diaries - WHERE MATCH (content) AGAINST ("+ふらつく" IN BOOLEAN MODE); -SELECT * FROM diaries - WHERE MATCH (content) AGAINST ("+ブラック" IN BOOLEAN MODE); + WHERE MATCH(body) AGAINST("+start" IN BOOLEAN MODE) + ORDER BY id; DROP TABLE diaries; ---source ../../include/mroonga/unload_mroonga_functions.inc --source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_boolean_mode_pragma_default_operator_or_no_operator.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_boolean_mode_pragma_default_operator_or_no_operator.test index 6a89d7556ab..c561ac84c98 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_boolean_mode_pragma_default_operator_or_no_operator.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_boolean_mode_pragma_default_operator_or_no_operator.test @@ -1,4 +1,4 @@ -# Copyright(C) 2011-2013 Kouhei Sutou +# Copyright(C) 2011-2015 Kouhei Sutou # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -35,7 +35,8 @@ INSERT INTO memos VALUES (NULL, "Tomorrow will be fine."); INSERT INTO memos VALUES (NULL, "Yesterday was fine."); SELECT * FROM memos - WHERE MATCH (content) AGAINST ("*DOR today good" IN BOOLEAN MODE); + WHERE MATCH (content) AGAINST ("*DOR today good" IN BOOLEAN MODE) + ORDER BY id; DROP TABLE memos; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_boolean_mode_pragma_default_operator_or_with_minus.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_boolean_mode_pragma_default_operator_or_with_minus.test index 790d2f1c9a9..cc3c6cef5b8 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_boolean_mode_pragma_default_operator_or_with_minus.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_boolean_mode_pragma_default_operator_or_with_minus.test @@ -1,4 +1,4 @@ -# Copyright(C) 2011-2013 Kouhei Sutou +# Copyright(C) 2011-2015 Kouhei Sutou # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -35,7 +35,8 @@ INSERT INTO memos VALUES (NULL, "Tomorrow will be fine."); INSERT INTO memos VALUES (NULL, "Yesterday was fine."); SELECT * FROM memos - WHERE MATCH (content) AGAINST ("*DOR today -good tomorrow" IN BOOLEAN MODE); + WHERE MATCH (content) AGAINST ("*DOR today -good tomorrow" IN BOOLEAN MODE) + ORDER BY id; DROP TABLE memos; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_boolean_mode_pragma_default_operator_or_with_plus.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_boolean_mode_pragma_default_operator_or_with_plus.test index a45c414580d..7002db06461 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_boolean_mode_pragma_default_operator_or_with_plus.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_boolean_mode_pragma_default_operator_or_with_plus.test @@ -1,4 +1,4 @@ -# Copyright(C) 2011-2013 Kouhei Sutou +# Copyright(C) 2011-2015 Kouhei Sutou # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -35,7 +35,8 @@ INSERT INTO memos VALUES (NULL, "Tomorrow will be fine."); INSERT INTO memos VALUES (NULL, "Yesterday was fine."); SELECT * FROM memos - WHERE MATCH (content) AGAINST ("*DOR today +good tomorrow" IN BOOLEAN MODE); + WHERE MATCH (content) AGAINST ("*DOR today +good tomorrow" IN BOOLEAN MODE) + ORDER BY id; DROP TABLE memos; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_insert_select.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_insert_select.test index 6037ab61da0..26c784391ab 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_insert_select.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_insert_select.test @@ -1,5 +1,5 @@ # Copyright(C) 2010 Tetsuro IKEDA -# Copyright(C) 2011 Kouhei Sutou +# Copyright(C) 2011-2015 Kouhei Sutou # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_many_records.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_many_records.test index c12441f3c5a..442b4f248d9 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_many_records.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_many_records.test @@ -1,4 +1,4 @@ -# Copyright(C) 2011 Kouhei Sutou +# Copyright(C) 2011-2015 Kouhei Sutou # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -4129,7 +4129,7 @@ insert into diaries values(4095, "2022-09-29"); commit; set autocommit=1; -select * from diaries where match(title) against("2022-09-0"); +select * from diaries where match(title) against("2022-09-0") order by id; drop table diaries; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_matched_and_not_matched_have_where_matched_order.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_matched_and_not_matched_have_where_matched_order.test new file mode 100644 index 00000000000..2ed609d9fe2 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_matched_and_not_matched_have_where_matched_order.test @@ -0,0 +1,50 @@ +# Copyright(C) 2012 Kentoku SHIBA +# Copyright(C) 2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source include/have_innodb.inc +--source ../../include/mroonga/have_mroonga.inc + +--disable_warnings +DROP TABLE IF EXISTS texts; +--enable_warnings + +SET NAMES UTF8; +CREATE TABLE texts ( + id INT PRIMARY KEY, + matched TEXT, + not_matched TEXT, + FULLTEXT KEY (matched), + FULLTEXT KEY (not_matched) +) DEFAULT CHARSET=UTF8 COMMENT='engine "InnoDB"'; + +INSERT INTO texts VALUES (1, 'Hello1', 'World1'); +INSERT INTO texts VALUES (2, 'Hello2', 'World2'); +INSERT INTO texts VALUES (3, 'Hello3', 'World3'); + +SELECT id, + matched, + not_matched, + MATCH(matched) AGAINST('+Hello' IN BOOLEAN MODE), + MATCH(not_matched) AGAINST('+Hello' IN BOOLEAN MODE) + FROM texts + WHERE MATCH(matched) AGAINST('+Hello' IN BOOLEAN MODE) + ORDER BY MATCH(not_matched) AGAINST('+Hello' IN BOOLEAN MODE), + id; + +DROP TABLE texts; + +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_matched_and_not_matched_have_where_no_order.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_matched_and_not_matched_have_where_no_order.test new file mode 100644 index 00000000000..968a763917d --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_matched_and_not_matched_have_where_no_order.test @@ -0,0 +1,48 @@ +# Copyright(C) 2012 Kentoku SHIBA +# Copyright(C) 2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source include/have_innodb.inc +--source ../../include/mroonga/have_mroonga.inc + +--disable_warnings +DROP TABLE IF EXISTS texts; +--enable_warnings + +SET NAMES UTF8; +CREATE TABLE texts ( + id INT PRIMARY KEY, + matched TEXT, + not_matched TEXT, + FULLTEXT KEY (matched), + FULLTEXT KEY (not_matched) +) DEFAULT CHARSET=UTF8 COMMENT='engine "InnoDB"'; + +INSERT INTO texts VALUES (1, 'Hello1', 'World1'); +INSERT INTO texts VALUES (2, 'Hello2', 'World2'); +INSERT INTO texts VALUES (3, 'Hello3', 'World3'); + +SELECT id, + matched, + not_matched, + MATCH(matched) AGAINST('+Hello' IN BOOLEAN MODE), + MATCH(not_matched) AGAINST('+Hello' IN BOOLEAN MODE) + FROM texts + WHERE MATCH(matched) AGAINST('+Hello' IN BOOLEAN MODE); + +DROP TABLE texts; + +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_matched_and_not_matched_no_where_both_order.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_matched_and_not_matched_no_where_both_order.test new file mode 100644 index 00000000000..a0ae0ef8a2e --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_matched_and_not_matched_no_where_both_order.test @@ -0,0 +1,50 @@ +# Copyright(C) 2012 Kentoku SHIBA +# Copyright(C) 2015 Kouhei Sutou +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +--source include/have_innodb.inc +--source ../../include/mroonga/have_mroonga.inc + +--disable_warnings +DROP TABLE IF EXISTS texts; +--enable_warnings + +SET NAMES UTF8; +CREATE TABLE texts ( + id INT PRIMARY KEY, + matched TEXT, + not_matched TEXT, + FULLTEXT KEY (matched), + FULLTEXT KEY (not_matched) +) DEFAULT CHARSET=UTF8 COMMENT='engine "InnoDB"'; + +INSERT INTO texts VALUES (1, 'Hello1', 'World1'); +INSERT INTO texts VALUES (2, 'Hello2', 'World2'); +INSERT INTO texts VALUES (3, 'Hello3', 'World3'); + +SELECT id, + matched, + not_matched, + MATCH(matched) AGAINST('+Hello' IN BOOLEAN MODE), + MATCH(not_matched) AGAINST('+Hello' IN BOOLEAN MODE) + FROM texts + ORDER BY MATCH(matched) AGAINST('+Hello' IN BOOLEAN MODE), + MATCH(not_matched) AGAINST('+Hello' IN BOOLEAN MODE), + id; + +DROP TABLE texts; + +--source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_myisam.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_myisam.test index eda8a5f15ef..4b872eb054c 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_myisam.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_myisam.test @@ -1,5 +1,5 @@ # Copyright(C) 2010 Tetsuro IKEDA -# Copyright(C) 2011 Kouhei Sutou +# Copyright(C) 2011-2015 Kouhei Sutou # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -38,10 +38,10 @@ insert into t1 values(3,30,"sa si su se so"); insert into t1 values(4,40,"ta ti tu te to"); insert into t1 values(5,50,"aa ii uu ee oo"); select * from t1; -select * from t1 where match(c3) against("su"); -select * from t1 where match(c3) against("ii"); -select * from t1 where match(c3) against("+su" in boolean mode); -select * from t1 where match(c3) against("+ii" in boolean mode); +select * from t1 where match(c3) against("su") order by c1; +select * from t1 where match(c3) against("ii") order by c1; +select * from t1 where match(c3) against("+su" in boolean mode) order by c1; +select * from t1 where match(c3) against("+ii" in boolean mode) order by c1; drop table t1; set names utf8; @@ -50,8 +50,8 @@ insert into t1 values(1, "明日の富士山の天気について","ああああ insert into t1 values(2, "いいいいい","明日の富士山の天気は分かりません"); insert into t1 values(3, "dummy", "dummy"); select * from t1; -select * from t1 where match(c2) against("富士山"); -select * from t1 where match(c3) against("富士山"); +select * from t1 where match(c2) against("富士山") order by c1; +select * from t1 where match(c3) against("富士山") order by c1; drop table t1; create table t1 (c1 int primary key, c2 varchar(100), fulltext index(c2)) default charset utf8 COMMENT = 'engine "myisam"'; @@ -87,7 +87,7 @@ insert into t1 values(6,20,"ka ki ku ke ko"); insert into t1 values(7,20,"aa ii uu ee oo"); insert into t1 values(8,20,"ka ki ku ke ko"); select * from t1; -select *,match(c3) against("uu") from t1 where match(c3) against("uu"); +select *,match(c3) against("uu") from t1 where match(c3) against("uu") order by c1; select * from t1 where not match(c3) against("uu"); select *,match(c3) against("dummy") from t1 where match(c3) against("dummy"); select * from t1 where not match(c3) against("dummy"); diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_not_match_against.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_not_match_against.test index 6ce01598136..43fc4b2771a 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_not_match_against.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_not_match_against.test @@ -1,5 +1,5 @@ # Copyright(C) 2010 Tetsuro IKEDA -# Copyright(C) 2011 Kouhei Sutou +# Copyright(C) 2011-2015 Kouhei Sutou # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -32,16 +32,16 @@ insert into t1 values(6,20,"ka ki ku ke ko"); insert into t1 values(7,20,"aa ii uu ee oo"); insert into t1 values(8,20,"ka ki ku ke ko"); select * from t1; -select *,match(c3) against("uu") from t1 where match(c3) against("uu"); -select * from t1 where not match(c3) against("uu"); -select *,match(c3) against("dummy") from t1 where match(c3) against("dummy"); -select * from t1 where not match(c3) against("dummy"); -select * from t1 where c1 = 4 and not match(c3) against("uu"); -select * from t1 where c1 <= 4 and not match(c3) against("uu"); -select * from t1 where c1 > 4 and not match(c3) against("uu"); -select * from t1 where c2 = 10 and not match(c3) against("uu"); -select * from t1 where c2 >= 15 and not match(c3) against("uu"); -select * from t1 where c2 < 15 and not match(c3) against("uu"); +select *,match(c3) against("uu") from t1 where match(c3) against("uu") order by c1; +select * from t1 where not match(c3) against("uu") order by c1; +select *,match(c3) against("dummy") from t1 where match(c3) against("dummy") order by c1; +select * from t1 where not match(c3) against("dummy") order by c1; +select * from t1 where c1 = 4 and not match(c3) against("uu") order by c1; +select * from t1 where c1 <= 4 and not match(c3) against("uu") order by c1; +select * from t1 where c1 > 4 and not match(c3) against("uu") order by c1; +select * from t1 where c2 = 10 and not match(c3) against("uu") order by c1; +select * from t1 where c2 >= 15 and not match(c3) against("uu") order by c1; +select * from t1 where c2 < 15 and not match(c3) against("uu") order by c1; drop table t1; --source ../../include/mroonga/have_mroonga_deinit.inc diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_order_TODO_SPLIT_ME.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_order_TODO_SPLIT_ME.test index 5361b151661..4835f3dcd99 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_order_TODO_SPLIT_ME.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/fulltext_order_TODO_SPLIT_ME.test @@ -40,11 +40,7 @@ INSERT INTO ft VALUES(5,'eeeee','efghi'); SELECT a, b, c FROM ft WHERE MATCH(b) AGAINST('bbbbb' IN BOOLEAN MODE); SELECT a, b, c FROM ft WHERE MATCH(b) AGAINST('bbbbb' IN BOOLEAN MODE) ORDER BY MATCH(b) AGAINST('bbbbb' IN BOOLEAN MODE); -SELECT a, b, c FROM ft WHERE MATCH(b) AGAINST('bbbbb' IN BOOLEAN MODE) ORDER BY MATCH(c) AGAINST('bbbbb' IN BOOLEAN MODE); SELECT a, b, c FROM ft WHERE MATCH(c) AGAINST('bbbbb' IN BOOLEAN MODE); -SELECT a, b, c, MATCH(b) AGAINST('bbbbb' IN BOOLEAN MODE), MATCH(c) AGAINST('bbbbb' IN BOOLEAN MODE) FROM ft WHERE MATCH(b) AGAINST('bbbbb' IN BOOLEAN MODE) ORDER BY MATCH(c) AGAINST('bbbbb' IN BOOLEAN MODE); -SELECT a, b, c, MATCH(b) AGAINST('bbbbb' IN BOOLEAN MODE), MATCH(c) AGAINST('bbbbb' IN BOOLEAN MODE) FROM ft WHERE MATCH(b) AGAINST('bbbbb' IN BOOLEAN MODE); -SELECT a, b, c, MATCH(b) AGAINST('bbbbb' IN BOOLEAN MODE), MATCH(c) AGAINST('bbbbb' IN BOOLEAN MODE) FROM ft ORDER BY MATCH(c) AGAINST('bbbbb' IN BOOLEAN MODE), MATCH(b) AGAINST('bbbbb' IN BOOLEAN MODE), a; DROP TABLE ft; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/truncate.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/truncate.test index 987fd284f74..8723a882ae9 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/truncate.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/truncate.test @@ -1,4 +1,4 @@ -# Copyright(C) 2011-2012 Kouhei Sutou +# Copyright(C) 2011-2015 Kouhei Sutou # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -39,17 +39,23 @@ INSERT INTO diaries VALUES(2, 2011, 11, 10, "天気", "明日の富士山の天 INSERT INTO diaries VALUES(3, 2011, 11, 11, "富士山", "今日も天気がよくてきれいに見える。"); SELECT * FROM diaries; -SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日 天気" IN BOOLEAN MODE); +SELECT * FROM diaries + WHERE MATCH(content) AGAINST("+今日" IN BOOLEAN MODE) + ORDER BY id; TRUNCATE TABLE diaries; SELECT * FROM diaries; -SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日 天気" IN BOOLEAN MODE); +SELECT * FROM diaries + WHERE MATCH(content) AGAINST("+今日" IN BOOLEAN MODE) + ORDER BY id; INSERT INTO diaries VALUES(1, 2011, 11, 11, "帰り道", "つかれたー"); INSERT INTO diaries VALUES(2, 2011, 12, 1, "久しぶり", "天気が悪いからずっと留守番。"); INSERT INTO diaries VALUES(3, 2011, 12, 2, "初雪", "今年はじめての雪!"); SELECT * FROM diaries; -SELECT * FROM diaries WHERE MATCH(content) AGAINST("悪い" IN BOOLEAN MODE); +SELECT * FROM diaries + WHERE MATCH(content) AGAINST("+悪い" IN BOOLEAN MODE) + ORDER BY id; DROP TABLE diaries; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/variable_match_escalation_threshold_global.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/variable_match_escalation_threshold_global.test index 065b78d44a7..9704d2d3e53 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/variable_match_escalation_threshold_global.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/variable_match_escalation_threshold_global.test @@ -15,7 +15,6 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --source include/have_innodb.inc ---source ../../include/mroonga/have_fulltext_index_comment.inc --source ../../include/mroonga/have_mroonga.inc --disable_warnings diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/variable_match_escalation_threshold_session.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/variable_match_escalation_threshold_session.test index b47dcef3967..c6967790b01 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/variable_match_escalation_threshold_session.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/variable_match_escalation_threshold_session.test @@ -15,7 +15,6 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --source include/have_innodb.inc ---source ../../include/mroonga/have_fulltext_index_comment.inc --source ../../include/mroonga/have_mroonga.inc --disable_warnings diff --git a/storage/mroonga/packages/apt/build-deb.sh b/storage/mroonga/packages/apt/build-deb.sh index 7db24068a7c..510886cb24f 100755 --- a/storage/mroonga/packages/apt/build-deb.sh +++ b/storage/mroonga/packages/apt/build-deb.sh @@ -27,8 +27,8 @@ case "${distribution}" in debian) component=main run cat < /etc/apt/sources.list.d/groonga.list -deb http://packages.groonga.org/debian/ wheezy main -deb-src http://packages.groonga.org/debian/ wheezy main +deb http://packages.groonga.org/debian/ ${code_name} main +deb-src http://packages.groonga.org/debian/ ${code_name} main EOF if ! grep --quiet security /etc/apt/sources.list; then run cat < /etc/apt/sources.list.d/security.list @@ -75,4 +75,4 @@ run cd - package_initial=$(echo "${PACKAGE}" | sed -e 's/\(.\).*/\1/') pool_dir="/vagrant/repositories/${distribution}/pool/${code_name}/${component}/${package_initial}/${PACKAGE}" run mkdir -p "${pool_dir}/" -run cp *.tar.gz *.diff.gz *.dsc *.deb "${pool_dir}/" +run cp *.tar.* *.diff.gz *.dsc *.deb "${pool_dir}/" diff --git a/storage/mroonga/packages/debian/changelog b/storage/mroonga/packages/debian/changelog index d3025d96100..366edca7b4e 100644 --- a/storage/mroonga/packages/debian/changelog +++ b/storage/mroonga/packages/debian/changelog @@ -1,3 +1,15 @@ +mroonga (5.04-1) unstable; urgency=low + + * New upstream release. + + -- Masafumi Yokoyama Mon, 29 Jun 2015 00:00:00 +0900 + +mroonga (5.03-1) unstable; urgency=low + + * New upstream release. + + -- HAYASHI Kentaro Fri, 29 May 2015 00:00:00 +0900 + mroonga (5.02-1) unstable; urgency=low * New upstream release. diff --git a/storage/mroonga/packages/rpm/centos/mariadb-mroonga.spec.in b/storage/mroonga/packages/rpm/centos/mariadb-mroonga.spec.in index ca48e59aaec..04d1c41f2cc 100644 --- a/storage/mroonga/packages/rpm/centos/mariadb-mroonga.spec.in +++ b/storage/mroonga/packages/rpm/centos/mariadb-mroonga.spec.in @@ -154,6 +154,12 @@ fi %doc mysql-mroonga-doc/* %changelog +* Mon Jun 29 2015 Masafumi Yokoyama - 5.04-1 +- new upstream release. + +* Fri May 29 2015 HAYASHI Kentaro - 5.03-1 +- new upstream release. + * Wed Apr 29 2015 HAYASHI Kentaro - 5.02-1 - new upstream release. diff --git a/storage/mroonga/packages/rpm/centos/mysql55-mroonga.spec.in b/storage/mroonga/packages/rpm/centos/mysql55-mroonga.spec.in index 1fc641b9bca..e20e1b32162 100644 --- a/storage/mroonga/packages/rpm/centos/mysql55-mroonga.spec.in +++ b/storage/mroonga/packages/rpm/centos/mysql55-mroonga.spec.in @@ -163,6 +163,12 @@ fi %doc mysql-mroonga-doc/* %changelog +* Mon Jun 29 2015 Masafumi Yokoyama - 5.04-1 +- new upstream release. + +* Fri May 29 2015 HAYASHI Kentaro - 5.03-1 +- new upstream release. + * Wed Apr 29 2015 HAYASHI Kentaro - 5.02-1 - new upstream release. diff --git a/storage/mroonga/packages/rpm/centos/mysql56-community-mroonga.spec.in b/storage/mroonga/packages/rpm/centos/mysql56-community-mroonga.spec.in index 53759e0c778..f3233d17afe 100644 --- a/storage/mroonga/packages/rpm/centos/mysql56-community-mroonga.spec.in +++ b/storage/mroonga/packages/rpm/centos/mysql56-community-mroonga.spec.in @@ -1,14 +1,14 @@ %{!?centos_ver:%define centos_ver 6} %if %{centos_ver} == 7 -%define mysql_version_default 5.6.24 -%define mysql_release_default 3 +%define mysql_version_default 5.6.25 +%define mysql_release_default 2 %define mysql_dist_default el7 %define mysql_download_base_url_default http://repo.mysql.com/yum/mysql-5.6-community/el/7/SRPMS %define mysql_spec_file_default mysql.spec %else -%define mysql_version_default 5.6.24 -%define mysql_release_default 3 +%define mysql_version_default 5.6.25 +%define mysql_release_default 2 %define mysql_dist_default el6 %define mysql_download_base_url_default http://repo.mysql.com/yum/mysql-5.6-community/el/6/SRPMS %define mysql_spec_file_default mysql.spec @@ -77,7 +77,10 @@ if [ ! -d ${mysql_source} ]; then --define 'optflags -O0' \ ../../SPECS/%{mysql_spec_file} fi -%configure --disable-static --with-mysql-source=${mysql_source} \ +%configure \ + --disable-static \ + --with-mysql-source=${mysql_source} \ + --enable-fast-mutexes \ %{?mroonga_configure_options} make %{?_smp_mflags} @@ -91,6 +94,13 @@ mv $RPM_BUILD_ROOT%{_datadir}/doc/mroonga/ mysql-mroonga-doc/ rm -rf $RPM_BUILD_ROOT %post +if ! /sbin/service mysqld status > /dev/null; then + /sbin/service mysqld start + stop_after_installation=1 +else + stop_after_installation=0 +fi + mysql_command=`which mysql` password_option="" $mysql_command -u root -e "quit" @@ -129,7 +139,18 @@ eval $command || \ (echo "run the following command to register Mroonga:"; \ echo " $command") +if [ "$stop_after_installation" = "1" ]; then + /sbin/service mysqld stop +fi + %preun +if ! /sbin/service mysqld status > /dev/null; then + /sbin/service mysqld start + stop_after_uninstallation=1 +else + stop_after_uninstallation=0 +fi + uninstall_sql=%{_datadir}/mroonga/uninstall.sql mysql_command=`which mysql` if $mysql_command -u root -e "quit"; then @@ -145,6 +166,10 @@ if [ "$1" = 0 ]; then echo " $command") fi +if [ "$stop_after_uninstallation" = "1" ]; then + /sbin/service mysqld stop +fi + %files %defattr(-,root,root,-) %{_libdir}/mysql/plugin/ @@ -158,6 +183,15 @@ fi %doc mysql-mroonga-doc/* %changelog +* Mon Jun 29 2015 Masafumi Yokoyama - 5.04-1 +- new upstream release. + +* Thu Jun 02 2015 Masafumi Yokoyama - 5.03-2 +- build against MySQL 5.6.25. + +* Fri May 29 2015 HAYASHI Kentaro - 5.03-1 +- new upstream release. + * Wed Apr 29 2015 HAYASHI Kentaro - 5.02-1 - new upstream release. diff --git a/storage/mroonga/packages/rpm/centos/percona-server-56-mroonga.spec.in b/storage/mroonga/packages/rpm/centos/percona-server-56-mroonga.spec.in index f0306cace24..cf1947e2676 100644 --- a/storage/mroonga/packages/rpm/centos/percona-server-56-mroonga.spec.in +++ b/storage/mroonga/packages/rpm/centos/percona-server-56-mroonga.spec.in @@ -1,7 +1,7 @@ %{!?centos_ver:%define centos_ver 6} -%define mysql_version_default 5.6.23 -%define mysql_release_default rel72.1 +%define mysql_version_default 5.6.24 +%define mysql_release_default rel72.2 %define mysql_dist_default %{?dist} %define mysql_download_base_url_default http://repo.percona.com/centos/%{centos_ver}/SRPMS %define mysql_spec_file_default percona-server.spec @@ -85,6 +85,13 @@ mv $RPM_BUILD_ROOT%{_datadir}/doc/mroonga/ mysql-mroonga-doc/ rm -rf $RPM_BUILD_ROOT %post +if ! /sbin/service mysql status > /dev/null; then + /sbin/service mysql start + stop_after_installation=1 +else + stop_after_installation=0 +fi + mysql_command=`which mysql` password_option="" $mysql_command -u root -e "quit" @@ -123,7 +130,18 @@ eval $command || \ (echo "run the following command to register Mroonga:"; \ echo " $command") +if [ "$stop_after_installation" = "1" ]; then + /sbin/service mysql stop +fi + %preun +if ! /sbin/service mysql status > /dev/null; then + /sbin/service mysql start + stop_after_uninstallation=1 +else + stop_after_uninstallation=0 +fi + uninstall_sql=%{_datadir}/mroonga/uninstall.sql mysql_command=`which mysql` if $mysql_command -u root -e "quit"; then @@ -139,6 +157,10 @@ if [ "$1" = 0 ]; then echo " $command") fi +if [ "$stop_after_uninstallation" = "1" ]; then + /sbin/service mysql stop +fi + %files %defattr(-,root,root,-) %{_libdir}/mysql/plugin/ diff --git a/storage/mroonga/packages/source/Makefile.am b/storage/mroonga/packages/source/Makefile.am index 0f242c4e038..143f5d0387e 100644 --- a/storage/mroonga/packages/source/Makefile.am +++ b/storage/mroonga/packages/source/Makefile.am @@ -1,17 +1,17 @@ MROONGA_BASE = $(PACKAGE)-$(VERSION) MROONGA_TAR_GZ = $(MROONGA_BASE).tar.gz -GROONGA_VERSION = 5.0.3 +GROONGA_VERSION = 5.0.5 GROONGA_BASE = groonga-$(GROONGA_VERSION) GROONGA_TAR_GZ = $(GROONGA_BASE).tar.gz -GROONGA_NORMALIZER_MYSQL_VERSION = 1.0.9 +GROONGA_NORMALIZER_MYSQL_VERSION = 1.1.0 GROONGA_NORMALIZER_MYSQL_BASE = \ groonga-normalizer-mysql-$(GROONGA_NORMALIZER_MYSQL_VERSION) GROONGA_NORMALIZER_MYSQL_TAR_GZ = \ $(GROONGA_NORMALIZER_MYSQL_BASE).tar.gz -MARIADB_VERSION = 10.0.17 +MARIADB_VERSION = 10.0.20 MARIADB_BASE = mariadb-$(MARIADB_VERSION) MARIADB_TAR_GZ = $(MARIADB_BASE).tar.gz diff --git a/storage/mroonga/packages/ubuntu/upload.rb b/storage/mroonga/packages/ubuntu/upload.rb index 79331a06c8d..8743520b5ac 100755 --- a/storage/mroonga/packages/ubuntu/upload.rb +++ b/storage/mroonga/packages/ubuntu/upload.rb @@ -127,8 +127,8 @@ allow_unsigned_uploads = 0 case code_name when "vivid" run_command("sed", - "-i", "-e", "s,5\.5,5\.6,g", - "debian/rules") + "-i", "-e", "s,5\\.5,5.6,g", + "debian/rules") end run_command("sed", "-i", "-e", "s,MYSQL_VERSION,#{@mysql_version[code_name]},", diff --git a/storage/mroonga/packages/yum/sign-rpm.sh b/storage/mroonga/packages/yum/sign-rpm.sh index b3a45afe7f5..27ec5711010 100755 --- a/storage/mroonga/packages/yum/sign-rpm.sh +++ b/storage/mroonga/packages/yum/sign-rpm.sh @@ -24,7 +24,7 @@ run() unsigned_rpms() { while read rpm; do - rpm --checksig "$rpm" | grep -v 'gpg OK' | cut -d":" -f1 + rpm --checksig "$rpm" | grep -v 'gpg OK' | grep -v 'MISSING KEYS' | cut -d":" -f1 done } diff --git a/storage/mroonga/plugin_version b/storage/mroonga/plugin_version index 341d0b550fd..48c32b26a12 100644 --- a/storage/mroonga/plugin_version +++ b/storage/mroonga/plugin_version @@ -1 +1 @@ -5.2 \ No newline at end of file +5.4 \ No newline at end of file diff --git a/storage/mroonga/tools/travis/before_script.sh b/storage/mroonga/tools/travis/before_script.sh index 7d4d7dcec5f..1b3ba158675 100755 --- a/storage/mroonga/tools/travis/before_script.sh +++ b/storage/mroonga/tools/travis/before_script.sh @@ -20,9 +20,26 @@ set -e if [ "${MROONGA_BUNDLED}" = "yes" ]; then - cmake_args=(-DCMAKE_BUILD_TYPE=Debug) + cmake_args=(-DCMAKE_BUILD_TYPE=Debug -DWITH_UNIT_TESTS=FALSE) + cmake_args=("${cmake_args[@]}" -DWITH_EMBEDDED_SERVER=TRUE) + cmake_args=("${cmake_args[@]}" -DWITHOUT_ARCHIVE=TRUE) + cmake_args=("${cmake_args[@]}" -DWITHOUT_BLACKHOLE=TRUE) + cmake_args=("${cmake_args[@]}" -DWITHOUT_CASSANDRA=TRUE) + cmake_args=("${cmake_args[@]}" -DWITHOUT_CONNECT=TRUE) + cmake_args=("${cmake_args[@]}" -DWITHOUT_CSV=TRUE) + cmake_args=("${cmake_args[@]}" -DWITHOUT_EXAMPLE=TRUE) + cmake_args=("${cmake_args[@]}" -DWITHOUT_FEDERATED=TRUE) + cmake_args=("${cmake_args[@]}" -DWITHOUT_FEDERATEDX=TRUE) + cmake_args=("${cmake_args[@]}" -DWITHOUT_HEAP=TRUE) + cmake_args=("${cmake_args[@]}" -DWITHOUT_MYISAMMRG=TRUE) + cmake_args=("${cmake_args[@]}" -DWITHOUT_OQGRAPH=TRUE) + cmake_args=("${cmake_args[@]}" -DWITHOUT_SEQUENCE=TRUE) + cmake_args=("${cmake_args[@]}" -DWITHOUT_SPHINX=TRUE) + cmake_args=("${cmake_args[@]}" -DWITHOUT_SPIDER=TRUE) + cmake_args=("${cmake_args[@]}" -DWITHOUT_TEST_SQL_DISCOVERY=TRUE) + cmake_args=("${cmake_args[@]}" -DWITHOUT_TOKUDB=TRUE) if [ "${MROONGA_TEST_EMBEDDED}" = "yes" ]; then - cmake_args=("${cmake_args[@]}" "-DWITH_EMBEDDED_SERVER=TRUE") + cmake_args=("${cmake_args[@]}" -DWITH_EMBEDDED_SERVER=TRUE) fi cmake . "${cmake_args[@]}" else @@ -31,6 +48,10 @@ else if [ -d /opt/mysql/ ]; then PATH=$(echo /opt/mysql/server-*/bin/):$PATH fi - ./configure \ - --with-mysql-source=$PWD/vendor/mysql + configure_args=("--with-mysql-source=$PWD/vendor/mysql") + if [ "${MYSQL_VERSION}" = "mysql-5.6.25" ]; then + configure_args=("${configure_args[@]}" --enable-fast-mutexes) + fi + ./configure "${configure_args[@]}" + cat "$(mysql_config --include | sed -e 's/-I//g')/my_config.h" fi diff --git a/storage/mroonga/tools/travis/script.sh b/storage/mroonga/tools/travis/script.sh index 6ea5c86068b..d8dd188f1f2 100755 --- a/storage/mroonga/tools/travis/script.sh +++ b/storage/mroonga/tools/travis/script.sh @@ -32,7 +32,11 @@ else fi n_processors="$(grep '^processor' /proc/cpuinfo | wc -l)" -max_n_processors=8 +if [ "${MROONGA_BUNDLED}" = "yes" ]; then + max_n_processors=2 +else + max_n_processors=4 +fi if (( $n_processors > $max_n_processors )); then n_processors=$max_n_processors fi @@ -98,6 +102,14 @@ run_sql_test() fi if [ "${MROONGA_BUNDLED}" = "yes" ]; then + # Plugins aren't supported. + cd ${mroonga_dir}/mysql-test/mroonga/storage + rm -rf alter_table/add_index/token_filters/ + rm -rf alter_table/t/change_token_filter.test + rm -rf create/table/token_filters/ + rm -rf fulltext/token_filters/ + cd - + ${mroonga_dir}/test/run-sql-test.sh \ "${test_args[@]}" \ --parallel="${n_processors}" diff --git a/storage/mroonga/vendor/groonga/CMakeLists.txt b/storage/mroonga/vendor/groonga/CMakeLists.txt index f1ca174ed50..ebe7f6b7fe5 100644 --- a/storage/mroonga/vendor/groonga/CMakeLists.txt +++ b/storage/mroonga/vendor/groonga/CMakeLists.txt @@ -168,7 +168,7 @@ macro(check_build_flag flag) check_cxxflag(${flag}) endmacro() -if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANGCXX) +if(CMAKE_COMPILER_IS_GNUCXX) check_build_flag("-Wall") check_build_flag("-Wextra") check_build_flag("-Wno-unused-but-set-variable") @@ -185,7 +185,7 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANGCXX) check_cflag("-Wdeclaration-after-statement") check_cflag("-Wbad-function-cast") check_build_flag("-Wcast-align") - check_build_flag("-Wredundant-decls") + # check_build_flag("-Wredundant-decls") check_build_flag("-Wwrite-strings") check_cxxflag("-fexceptions") check_cxxflag("-fimplicit-templates") @@ -201,7 +201,7 @@ endif() option(GRN_WITH_DEBUG "enable debug build." OFF) if(GRN_WITH_DEBUG) - if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANGCXX) + if(CMAKE_COMPILER_IS_GNUCXX) set(GRN_C_COMPILE_FLAGS "${GRN_C_COMPILE_FLAGS} -g3 -O0") set(GRN_CXX_COMPILE_FLAGS "${GRN_CXX_COMPILE_FLAGS} -g3 -O0") endif() @@ -210,6 +210,9 @@ endif() add_definitions( -DHAVE_CONFIG_H ) +if(GRN_EMBED) + add_definitions(-DGRN_EMBEDDED) +endif() if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANGCXX) set(_GNU_SOURCE TRUE) @@ -556,6 +559,9 @@ endif() add_definitions(-DONIG_EXTERN=extern) add_subdirectory(vendor) +if(GRN_EMBED) + add_subdirectory(plugins) +endif() add_subdirectory(lib) if(NOT GRN_EMBED) add_subdirectory(src) diff --git a/storage/mroonga/vendor/groonga/base_version b/storage/mroonga/vendor/groonga/base_version index 26611488b0a..25b08bbc78f 100644 --- a/storage/mroonga/vendor/groonga/base_version +++ b/storage/mroonga/vendor/groonga/base_version @@ -1 +1 @@ -5.0.3 \ No newline at end of file +5.0.5 \ No newline at end of file diff --git a/storage/mroonga/vendor/groonga/bindings/php/groonga.c b/storage/mroonga/vendor/groonga/bindings/php/groonga.c index b92cc1a2385..a04bb9cd42f 100644 --- a/storage/mroonga/vendor/groonga/bindings/php/groonga.c +++ b/storage/mroonga/vendor/groonga/bindings/php/groonga.c @@ -101,6 +101,9 @@ PHP_FUNCTION(grn_ctx_init) long flags = 0; grn_rc rc; + if (ctx == NULL) { + RETURN_FALSE; // unable to allocate memory for ctx + } if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &flags) == FAILURE) { return; diff --git a/storage/mroonga/vendor/groonga/build/ac_macros/check_headers.m4 b/storage/mroonga/vendor/groonga/build/ac_macros/check_headers.m4 index 2a7e0f03acc..9a30ca8fc9c 100644 --- a/storage/mroonga/vendor/groonga/build/ac_macros/check_headers.m4 +++ b/storage/mroonga/vendor/groonga/build/ac_macros/check_headers.m4 @@ -5,14 +5,10 @@ AC_CHECK_HEADERS(dlfcn.h) AC_CHECK_HEADERS(errno.h) AC_CHECK_HEADERS(execinfo.h) AC_CHECK_HEADERS(inttypes.h) -AC_CHECK_HEADERS(io.h) AC_CHECK_HEADERS(netdb.h) -AC_CHECK_HEADERS(netinet/in.h) -AC_CHECK_HEADERS(netinet/tcp.h) AC_CHECK_HEADERS(signal.h) AC_CHECK_HEADERS(stdarg.h) AC_CHECK_HEADERS(stdint.h) -AC_CHECK_HEADERS(stdlib.h) AC_CHECK_HEADERS(string.h) AC_CHECK_HEADERS(strings.h) AC_CHECK_HEADERS(sys/mman.h) @@ -21,7 +17,6 @@ AC_CHECK_HEADERS(sys/resource.h) AC_CHECK_HEADERS(sys/socket.h) AC_CHECK_HEADERS(sys/sysctl.h) AC_CHECK_HEADERS(sys/time.h) -AC_CHECK_HEADERS(sys/types.h) AC_CHECK_HEADERS(sys/wait.h) AC_CHECK_HEADERS(time.h) AC_CHECK_HEADERS(ucontext.h) diff --git a/storage/mroonga/vendor/groonga/config.h.cmake b/storage/mroonga/vendor/groonga/config.h.cmake index cd8e4f6cc2d..8e3bdaf216b 100644 --- a/storage/mroonga/vendor/groonga/config.h.cmake +++ b/storage/mroonga/vendor/groonga/config.h.cmake @@ -14,7 +14,7 @@ #define PACKAGE_URL "${PACKAGE_URL}" #define PACKAGE_VERSION "${VERSION}" -/* groonga related constants */ +/* Groonga related constants */ #define GRN_CONFIG_PATH "${GRN_CONFIG_PATH}" #define GRN_LOG_PATH "${GRN_LOG_PATH}" #define GRN_VERSION "${GRN_VERSION}" @@ -98,17 +98,13 @@ #cmakedefine HAVE_ERRNO_H #cmakedefine HAVE_EXECINFO_H #cmakedefine HAVE_INTTYPES_H -#cmakedefine HAVE_IO_H #cmakedefine HAVE_LINUX_FUTEX_H #cmakedefine HAVE_MEMORY_H #cmakedefine HAVE_NETDB_H -#cmakedefine HAVE_NETINET_IN_H -#cmakedefine HAVE_NETINET_TCP_H #cmakedefine HAVE_PTHREAD_H #cmakedefine HAVE_SIGNAL_H #cmakedefine HAVE_STDARG_H #cmakedefine HAVE_STDINT_H -#cmakedefine HAVE_STDLIB_H #cmakedefine HAVE_STRINGS_H #cmakedefine HAVE_STRING_H #cmakedefine HAVE_SYS_MMAN_H @@ -120,7 +116,6 @@ #cmakedefine HAVE_SYS_SYSCALL_H #cmakedefine HAVE_SYS_SYSCTL_H #cmakedefine HAVE_SYS_TIME_H -#cmakedefine HAVE_SYS_TYPES_H #cmakedefine HAVE_SYS_WAIT_H #cmakedefine HAVE_TIME_H #cmakedefine HAVE_UCONTEXT_H diff --git a/storage/mroonga/vendor/groonga/configure.ac b/storage/mroonga/vendor/groonga/configure.ac index 17f3abcc2ed..dad29c78f4c 100644 --- a/storage/mroonga/vendor/groonga/configure.ac +++ b/storage/mroonga/vendor/groonga/configure.ac @@ -169,7 +169,7 @@ if test "$GCC" = "yes"; then if test "$CLANG" = "no"; then CHECK_BUILD_FLAG([-Wcast-align]) fi - CHECK_BUILD_FLAG([-Wredundant-decls]) +# CHECK_BUILD_FLAG([-Wredundant-decls]) # CHECK_BUILD_FLAG([-Wunsafe-loop-optimizations]) # CHECK_BUILD_FLAG([-Wunreachable-code]) # CHECK_BUILD_FLAG([-Wswitch-enum]) @@ -1508,6 +1508,8 @@ AM_CONDITIONAL(WITH_SHARED_ONIGMO, test "$enable_shared_onigmo" = "yes") # TODO: Support using system Onigmo instead of bundled Onigmo. AC_DEFINE(GRN_WITH_ONIGMO, [1], [Use Onigmo.]) +GRN_WITH_ONIGMO="yes" +AC_SUBST(GRN_WITH_ONIGMO) AC_CONFIG_SUBDIRS([vendor/onigmo]) ONIGMO_CFLAGS="-I\$(top_srcdir)/vendor/onigmo-source" diff --git a/storage/mroonga/vendor/groonga/examples/dictionary/edict/edict2grn.rb b/storage/mroonga/vendor/groonga/examples/dictionary/edict/edict2grn.rb index 664b12c2148..b795e25a50b 100755 --- a/storage/mroonga/vendor/groonga/examples/dictionary/edict/edict2grn.rb +++ b/storage/mroonga/vendor/groonga/examples/dictionary/edict/edict2grn.rb @@ -1,47 +1,23 @@ #!/usr/bin/env ruby -# -*- coding: utf-8 -*- -$KCODE = 'u' +require "English" +require "nkf" +require "json" -require 'English' -require 'kconv' - -class String - def to_json - a = split(//).map {|char| - case char - when '"' then '\\"' - when '\\' then '\\\\' - when "\b" then '\b' - when "\f" then '\f' - when "\n" then '\n' - when "\r" then '' - when "\t" then '\t' - else char - end - } - "\"#{a.join('')}\"" - end -end - -class Array - def to_json - '[' + map {|element| - element.to_json - }.join(',') + ']' - end -end - -puts <") + $stderr.puts(" body: <#{raw_body}>") + next + end + puts(",") + print([key, body].to_json) end -puts ']' +puts +puts("]") diff --git a/storage/mroonga/vendor/groonga/groonga-httpd-conf.sh.in b/storage/mroonga/vendor/groonga/groonga-httpd-conf.sh.in index 380495bb391..73b8867eafa 100644 --- a/storage/mroonga/vendor/groonga/groonga-httpd-conf.sh.in +++ b/storage/mroonga/vendor/groonga/groonga-httpd-conf.sh.in @@ -25,4 +25,6 @@ export GROONGA_HTTPD_DEBUG="@grn_debug@" export GROONGA_HTTPD_WITH_PCRE="@GRN_WITH_PCRE@" export GROONGA_HTTPD_PCRE_CFLAGS="@PCRE_CFLAGS@" export GROONGA_HTTPD_PCRE_LIBS_ONLY_L="@PCRE_LIBS_ONLY_L@" +export GROONGA_HTTPD_WITH_ONIGMO="@GRN_WITH_ONIGMO@" +export GROONGA_HTTPD_ONIGMO_IN_TREE_LINK_PATH="@abs_top_builddir@/vendor/onigmo-source/.libs" export GROONGA_HTTPD_WITH_ZLIB="@GRN_WITH_ZLIB@" diff --git a/storage/mroonga/vendor/groonga/include/groonga/command.h b/storage/mroonga/vendor/groonga/include/groonga/command.h index 101956a04f9..ac5270e9798 100644 --- a/storage/mroonga/vendor/groonga/include/groonga/command.h +++ b/storage/mroonga/vendor/groonga/include/groonga/command.h @@ -43,6 +43,8 @@ GRN_PLUGIN_EXPORT grn_obj *grn_command_input_get(grn_ctx *ctx, GRN_PLUGIN_EXPORT grn_obj *grn_command_input_at(grn_ctx *ctx, grn_command_input *input, unsigned int offset); +GRN_PLUGIN_EXPORT grn_obj *grn_command_input_get_arguments(grn_ctx *ctx, + grn_command_input *input); typedef void grn_command_run_func(grn_ctx *ctx, grn_obj *command, diff --git a/storage/mroonga/vendor/groonga/include/groonga/groonga.h b/storage/mroonga/vendor/groonga/include/groonga/groonga.h index 6f2aae79c01..14b21bda05c 100644 --- a/storage/mroonga/vendor/groonga/include/groonga/groonga.h +++ b/storage/mroonga/vendor/groonga/include/groonga/groonga.h @@ -907,6 +907,8 @@ GRN_API grn_rc grn_obj_lock(grn_ctx *ctx, grn_obj *obj, grn_id id, int timeout); GRN_API grn_rc grn_obj_unlock(grn_ctx *ctx, grn_obj *obj, grn_id id); GRN_API grn_rc grn_obj_clear_lock(grn_ctx *ctx, grn_obj *obj); GRN_API unsigned int grn_obj_is_locked(grn_ctx *ctx, grn_obj *obj); +GRN_API grn_rc grn_obj_flush(grn_ctx *ctx, grn_obj *obj); +GRN_API grn_rc grn_obj_flush_recursive(grn_ctx *ctx, grn_obj *obj); GRN_API int grn_obj_defrag(grn_ctx *ctx, grn_obj *obj, int threshold); GRN_API grn_obj *grn_obj_db(grn_ctx *ctx, grn_obj *obj); diff --git a/storage/mroonga/vendor/groonga/include/groonga/plugin.h b/storage/mroonga/vendor/groonga/include/groonga/plugin.h index bbd8923e5d6..98ca6961407 100644 --- a/storage/mroonga/vendor/groonga/include/groonga/plugin.h +++ b/storage/mroonga/vendor/groonga/include/groonga/plugin.h @@ -55,6 +55,11 @@ GRN_PLUGIN_EXPORT grn_rc GRN_PLUGIN_INIT(grn_ctx *ctx); GRN_PLUGIN_EXPORT grn_rc GRN_PLUGIN_REGISTER(grn_ctx *ctx); GRN_PLUGIN_EXPORT grn_rc GRN_PLUGIN_FIN(grn_ctx *ctx); +#define GRN_PLUGIN_DECLARE_FUNCTIONS(tag) \ + extern grn_rc GRN_PLUGIN_IMPL_NAME_TAGGED(init, tag)(grn_ctx *ctx); \ + extern grn_rc GRN_PLUGIN_IMPL_NAME_TAGGED(register, tag)(grn_ctx *ctx); \ + extern grn_rc GRN_PLUGIN_IMPL_NAME_TAGGED(fin, tag)(grn_ctx *ctx) + /* Don't call these functions directly. Use GRN_PLUGIN_MALLOC(), GRN_PLUGIN_REALLOC() and GRN_PLUGIN_FREE() instead. diff --git a/storage/mroonga/vendor/groonga/lib/CMakeLists.txt b/storage/mroonga/vendor/groonga/lib/CMakeLists.txt index 8959f883ca3..45b2c923635 100644 --- a/storage/mroonga/vendor/groonga/lib/CMakeLists.txt +++ b/storage/mroonga/vendor/groonga/lib/CMakeLists.txt @@ -36,7 +36,7 @@ string(REGEX REPLACE "([^;]+)" "mrb/\\1" set_source_files_properties(${LIBGROONGA_SOURCES} ${LIBGRNMRB_SOURCES} PROPERTIES COMPILE_FLAGS "${GRN_C_COMPILE_FLAGS}") -set_source_files_properties(dat.cpp ${LIBGRNDAT_SOURCES} +set_source_files_properties(dat.cpp egn.cpp ${LIBGRNDAT_SOURCES} PROPERTIES COMPILE_FLAGS "${GRN_CXX_COMPILE_FLAGS}") @@ -67,9 +67,14 @@ set(GRN_ALL_LIBRARIES ${MRUBY_LIBS} ${ONIGMO_LIBS}) if(GRN_EMBED) + set(GRN_EMBEDDED_PLUGIN_LIBRARIES "") + if(GRN_WITH_MECAB) + list(APPEND GRN_EMBEDDED_PLUGIN_LIBRARIES mecab_tokenizer) + endif() target_link_libraries(libgroonga ${GRN_ALL_LIBRARIES} - ${STDCPP_LIBS}) + ${STDCPP_LIBS} + ${GRN_EMBEDDED_PLUGIN_LIBRARIES}) else() target_link_libraries(libgroonga ${GRN_ALL_LIBRARIES}) diff --git a/storage/mroonga/vendor/groonga/lib/com.c b/storage/mroonga/vendor/groonga/lib/com.c index eb1cacfd4c1..a7450ec31f0 100644 --- a/storage/mroonga/vendor/groonga/lib/com.c +++ b/storage/mroonga/vendor/groonga/lib/com.c @@ -22,20 +22,17 @@ #include "grn_ctx_impl.h" #ifdef WIN32 -# include +# include #else -# ifdef HAVE_SYS_SOCKET_H -# include -# endif /* HAVE_SYS_SOCKET_H */ -# ifdef HAVE_NETINET_IN_H -# include -# endif /* HAVE_NETINET_IN_H */ -# ifdef HAVE_NETINET_TCP_H -# include -# endif /* HAVE_NETINET_TCP_H */ -# ifdef HAVE_SIGNAL_H -# include -# endif /* HAVE_SIGNAL_H */ +# ifdef HAVE_SYS_SOCKET_H +# include +# endif /* HAVE_SYS_SOCKET_H */ +# include +# include +# ifdef HAVE_SIGNAL_H +# include +# endif /* HAVE_SIGNAL_H */ +# include #endif /* WIN32 */ #include "grn_ctx.h" @@ -736,13 +733,11 @@ grn_com_send(grn_ctx *ctx, grn_com *cs, #else /* WIN32 */ struct iovec msg_iov[2]; struct msghdr msg; + memset(&msg, 0, sizeof(struct msghdr)); msg.msg_name = NULL; msg.msg_namelen = 0; msg.msg_iov = msg_iov; msg.msg_iovlen = 2; - msg.msg_control = NULL; - msg.msg_controllen = 0; - msg.msg_flags = 0; msg_iov[0].iov_base = header; msg_iov[0].iov_len = sizeof(grn_com_header); msg_iov[1].iov_base = (char *)body; diff --git a/storage/mroonga/vendor/groonga/lib/command.c b/storage/mroonga/vendor/groonga/lib/command.c index e4be0d1ff92..282d15b6a0e 100644 --- a/storage/mroonga/vendor/groonga/lib/command.c +++ b/storage/mroonga/vendor/groonga/lib/command.c @@ -129,6 +129,14 @@ grn_command_input_at(grn_ctx *ctx, GRN_API_RETURN(argument); } +grn_obj * +grn_command_input_get_arguments(grn_ctx *ctx, + grn_command_input *input) +{ + GRN_API_ENTER; + GRN_API_RETURN((grn_obj *)(input->arguments)); +} + grn_rc grn_command_register(grn_ctx *ctx, const char *command_name, diff --git a/storage/mroonga/vendor/groonga/lib/ctx.c b/storage/mroonga/vendor/groonga/lib/ctx.c index 85878036dc2..92caba561eb 100644 --- a/storage/mroonga/vendor/groonga/lib/ctx.c +++ b/storage/mroonga/vendor/groonga/lib/ctx.c @@ -21,22 +21,24 @@ #include "grn_request_canceler.h" #include "grn_tokenizers.h" #include "grn_ctx_impl.h" +#include "grn_ii.h" #include "grn_pat.h" +#include "grn_proc.h" #include "grn_plugin.h" #include "grn_snip.h" #include "grn_output.h" #include "grn_normalizer.h" +#include "grn_mrb.h" #include "grn_ctx_impl_mrb.h" #include "grn_logger.h" #include #include #include -#ifdef HAVE_NETINET_IN_H -# include -#endif /* HAVE_NETINET_IN_H */ #ifdef WIN32 # include +#else /* WIN32 */ +# include #endif /* WIN32 */ #if defined(HAVE__LOCALTIME64_S) && defined(__GNUC__) @@ -74,6 +76,30 @@ int grn_lock_timeout = GRN_LOCK_TIMEOUT; int grn_uyield_count = 0; #endif +static grn_bool grn_ctx_per_db = GRN_FALSE; + +static void +grn_init_from_env(void) +{ + { + char grn_ctx_per_db_env[GRN_ENV_BUFFER_SIZE]; + grn_getenv("GRN_CTX_PER_DB", + grn_ctx_per_db_env, + GRN_ENV_BUFFER_SIZE); + if (grn_ctx_per_db_env[0] && strcmp(grn_ctx_per_db_env, "yes") == 0) { + grn_ctx_per_db = GRN_TRUE; + } + } + + grn_mrb_init_from_env(); + grn_ctx_impl_mrb_init_from_env(); + grn_io_init_from_env(); + grn_ii_init_from_env(); + grn_db_init_from_env(); + grn_proc_init_from_env(); + grn_plugin_init_from_env(); +} + void grn_sleep(uint32_t seconds) { @@ -621,14 +647,8 @@ grn_ctx_init_internal(grn_ctx *ctx, int flags) // if (ctx->stat != GRN_CTX_FIN) { return GRN_INVALID_ARGUMENT; } ERRCLR(ctx); ctx->flags = flags; - { - char grn_ctx_per_db_env[GRN_ENV_BUFFER_SIZE]; - grn_getenv("GRN_CTX_PER_DB", - grn_ctx_per_db_env, - GRN_ENV_BUFFER_SIZE); - if (grn_ctx_per_db_env[0] && strcmp(grn_ctx_per_db_env, "yes") == 0) { - ctx->flags |= GRN_CTX_PER_DB; - } + if (grn_ctx_per_db) { + ctx->flags |= GRN_CTX_PER_DB; } if (ERRP(ctx, GRN_ERROR)) { return ctx->rc; } ctx->stat = GRN_CTX_INITED; @@ -821,6 +841,7 @@ grn_init(void) { grn_rc rc; grn_ctx *ctx = &grn_gctx; + grn_init_from_env(); grn_logger_init(); grn_query_logger_init(); CRITICAL_SECTION_INIT(grn_glock); @@ -898,12 +919,8 @@ grn_init(void) return rc; } grn_ctx_impl_init(ctx); - if ((rc = grn_io_init())) { - GRN_LOG(ctx, GRN_LOG_ALERT, "io initialize failed (%d)", rc); - return rc; - } if ((rc = grn_plugins_init())) { - GRN_LOG(ctx, GRN_LOG_ALERT, "plugins initialize failed (%d)", rc); + GRN_LOG(ctx, GRN_LOG_ALERT, "grn_plugins_init failed (%d)", rc); return rc; } if ((rc = grn_normalizer_init())) { @@ -1018,7 +1035,6 @@ grn_fin(void) grn_tokenizers_fin(); grn_normalizer_fin(); grn_plugins_fin(); - grn_io_fin(); grn_ctx_fin(ctx); grn_com_fin(); GRN_LOG(ctx, GRN_LOG_NOTICE, "grn_fin (%d)", alloc_count); @@ -1535,7 +1551,6 @@ grn_ctx_send(grn_ctx *ctx, const char *str, unsigned int str_len, int flags) goto exit; } else { grn_obj *expr = NULL; - if (comment_command_p(str, str_len)) { goto output; }; if (ctx->impl->qe_next) { grn_obj *val; expr = ctx->impl->qe_next; @@ -1546,6 +1561,7 @@ grn_ctx_send(grn_ctx *ctx, const char *str, unsigned int str_len, int flags) } grn_expr_exec(ctx, expr, 0); } else { + if (comment_command_p(str, str_len)) { goto output; }; ctx->impl->mime_type = "application/json"; ctx->impl->output_type = GRN_CONTENT_JSON; grn_timeval_now(ctx, &ctx->impl->tv); @@ -2382,9 +2398,8 @@ grn_calloc_default(grn_ctx *ctx, size_t size, const char* file, int line, const grn_alloc_info_add(res, file, line, func); } else { if (!(res = calloc(size, 1))) { - MERR("calloc fail (%" GRN_FMT_LLU ")=%p (%s:%d) <%" GRN_FMT_LLU ">", - (unsigned long long int)size, res, file, line, - (unsigned long long int)alloc_count); + MERR("calloc fail (%" GRN_FMT_SIZE ")=%p (%s:%d) <%d>", + size, res, file, line, alloc_count); } else { GRN_ADD_ALLOC_COUNT(1); grn_alloc_info_add(res, file, line, func); diff --git a/storage/mroonga/vendor/groonga/lib/ctx_impl_mrb.c b/storage/mroonga/vendor/groonga/lib/ctx_impl_mrb.c index 4c1a2a3b4f9..39a1aa17b86 100644 --- a/storage/mroonga/vendor/groonga/lib/ctx_impl_mrb.c +++ b/storage/mroonga/vendor/groonga/lib/ctx_impl_mrb.c @@ -18,9 +18,9 @@ #include "grn_ctx_impl.h" -#ifdef GRN_WITH_MRUBY -# include +#include +#ifdef GRN_WITH_MRUBY # include "grn_ctx_impl_mrb.h" # include "grn_mrb.h" @@ -40,6 +40,10 @@ # include "mrb/mrb_hash_table.h" # include "mrb/mrb_patricia_trie.h" # include "mrb/mrb_double_array_trie.h" +# include "mrb/mrb_table_group_flags.h" +# include "mrb/mrb_table_group_result.h" +# include "mrb/mrb_table_sort_flags.h" +# include "mrb/mrb_table_sort_key.h" # include "mrb/mrb_column.h" # include "mrb/mrb_fixed_size_column.h" # include "mrb/mrb_variable_size_column.h" @@ -60,6 +64,23 @@ # include #endif /* GRN_WITH_MRUBY */ +static grn_bool grn_ctx_impl_mrb_mruby_enabled = GRN_TRUE; + +void +grn_ctx_impl_mrb_init_from_env(void) +{ + { + char grn_mruby_enabled_env[GRN_ENV_BUFFER_SIZE]; + grn_getenv("GRN_MRUBY_ENABLED", + grn_mruby_enabled_env, + GRN_ENV_BUFFER_SIZE); + if (grn_mruby_enabled_env[0] && + strcmp(grn_mruby_enabled_env, "no") == 0) { + grn_ctx_impl_mrb_mruby_enabled = GRN_FALSE; + } + } +} + #ifdef GRN_WITH_MRUBY static mrb_value mrb_kernel_load(mrb_state *mrb, mrb_value self) @@ -125,6 +146,10 @@ grn_ctx_impl_mrb_init_bindings(grn_ctx *ctx) grn_mrb_hash_table_init(ctx); grn_mrb_patricia_trie_init(ctx); grn_mrb_double_array_trie_init(ctx); + grn_mrb_table_group_flags_init(ctx); + grn_mrb_table_group_result_init(ctx); + grn_mrb_table_sort_flags_init(ctx); + grn_mrb_table_sort_key_init(ctx); grn_mrb_column_init(ctx); grn_mrb_fixed_size_column_init(ctx); grn_mrb_variable_size_column_init(ctx); @@ -147,11 +172,7 @@ grn_ctx_impl_mrb_init_bindings(grn_ctx *ctx) void grn_ctx_impl_mrb_init(grn_ctx *ctx) { - char grn_mruby_enabled[GRN_ENV_BUFFER_SIZE]; - grn_getenv("GRN_MRUBY_ENABLED", - grn_mruby_enabled, - GRN_ENV_BUFFER_SIZE); - if (grn_mruby_enabled[0] && strcmp(grn_mruby_enabled, "no") == 0) { + if (!grn_ctx_impl_mrb_mruby_enabled) { ctx->impl->mrb.state = NULL; ctx->impl->mrb.base_directory[0] = '\0'; ctx->impl->mrb.module = NULL; @@ -162,7 +183,6 @@ grn_ctx_impl_mrb_init(grn_ctx *ctx) ctx->impl->mrb.groonga.operator_class = NULL; } else { mrb_state *mrb; - mrb = mrb_open(); ctx->impl->mrb.state = mrb; ctx->impl->mrb.base_directory[0] = '\0'; diff --git a/storage/mroonga/vendor/groonga/lib/dat.cpp b/storage/mroonga/vendor/groonga/lib/dat.cpp index 60588d55710..51a84da2af9 100644 --- a/storage/mroonga/vendor/groonga/lib/dat.cpp +++ b/storage/mroonga/vendor/groonga/lib/dat.cpp @@ -1,5 +1,5 @@ /* -*- c-basic-offset: 2 -*- */ -/* Copyright(C) 2011-2014 Brazil +/* Copyright(C) 2011-2015 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -1112,4 +1112,34 @@ grn_dat_repair(grn_ctx *ctx, grn_dat *dat) return GRN_SUCCESS; } +grn_rc +grn_dat_flush(grn_ctx *ctx, grn_dat *dat) +{ + if (!dat->io) { + return GRN_SUCCESS; + } + + grn_rc rc = grn_io_flush(ctx, dat->io); + if (rc != GRN_SUCCESS) { + return rc; + } + + if (dat->trie) { + grn::dat::Trie * const trie = static_cast(dat->trie); + try { + trie->flush(); + } catch (const grn::dat::Exception &ex) { + const grn_rc error_code = grn_dat_translate_error_code(ex.code()); + if (error_code == GRN_INPUT_OUTPUT_ERROR) { + SERR("grn::dat::Trie::flush failed"); + } else { + ERR(error_code, "grn::dat::Trie::flush failed"); + } + return error_code; + } + } + + return GRN_SUCCESS; +} + } // extern "C" diff --git a/storage/mroonga/vendor/groonga/lib/dat/file-impl.cpp b/storage/mroonga/vendor/groonga/lib/dat/file-impl.cpp index 3643a806292..7a9879aa369 100644 --- a/storage/mroonga/vendor/groonga/lib/dat/file-impl.cpp +++ b/storage/mroonga/vendor/groonga/lib/dat/file-impl.cpp @@ -1,5 +1,5 @@ /* -*- c-basic-offset: 2 -*- */ -/* Copyright(C) 2011 Brazil +/* Copyright(C) 2011-2015 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -123,6 +123,15 @@ void FileImpl::swap(FileImpl *rhs) { std::swap(addr_, rhs->addr_); } +void FileImpl::flush() { + if (!addr_) { + return; + } + + BOOL succeeded = ::FlushViewOfFile(addr_, size_); + GRN_DAT_THROW_IF(IO_ERROR, !succeeded); +} + void FileImpl::create_(const char *path, UInt64 size) { if ((path != NULL) && (path[0] != '\0')) { file_ = ::CreateFileA(path, GRN_IO_FILE_CREATE_MODE, @@ -193,6 +202,15 @@ void FileImpl::swap(FileImpl *rhs) { std::swap(length_, rhs->length_); } +void FileImpl::flush() { + if (!addr_) { + return; + } + + int result = ::msync(addr_, length_, MS_SYNC); + GRN_DAT_THROW_IF(IO_ERROR, result != 0); +} + void FileImpl::create_(const char *path, UInt64 size) { GRN_DAT_THROW_IF(PARAM_ERROR, size > static_cast(std::numeric_limits< ::off_t>::max())); diff --git a/storage/mroonga/vendor/groonga/lib/dat/file-impl.hpp b/storage/mroonga/vendor/groonga/lib/dat/file-impl.hpp index f4e0543635a..245dbfc2ae7 100644 --- a/storage/mroonga/vendor/groonga/lib/dat/file-impl.hpp +++ b/storage/mroonga/vendor/groonga/lib/dat/file-impl.hpp @@ -1,5 +1,5 @@ /* -*- c-basic-offset: 2 -*- */ -/* Copyright(C) 2011-2012 Brazil +/* Copyright(C) 2011-2015 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -45,6 +45,8 @@ class FileImpl { void swap(FileImpl *rhs); + void flush(); + private: void *ptr_; UInt64 size_; diff --git a/storage/mroonga/vendor/groonga/lib/dat/file.cpp b/storage/mroonga/vendor/groonga/lib/dat/file.cpp index 57bfcb9ece6..82d6159ed09 100644 --- a/storage/mroonga/vendor/groonga/lib/dat/file.cpp +++ b/storage/mroonga/vendor/groonga/lib/dat/file.cpp @@ -1,5 +1,5 @@ /* -*- c-basic-offset: 2 -*- */ -/* Copyright(C) 2011 Brazil +/* Copyright(C) 2011-2015 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -63,5 +63,11 @@ void File::swap(File *rhs) { rhs->impl_ = temp; } +void File::flush() { + if (impl_) { + impl_->flush(); + } +} + } // namespace dat } // namespace grn diff --git a/storage/mroonga/vendor/groonga/lib/dat/file.hpp b/storage/mroonga/vendor/groonga/lib/dat/file.hpp index c2be8d86da3..e7dda0e025e 100644 --- a/storage/mroonga/vendor/groonga/lib/dat/file.hpp +++ b/storage/mroonga/vendor/groonga/lib/dat/file.hpp @@ -1,5 +1,5 @@ /* -*- c-basic-offset: 2 -*- */ -/* Copyright(C) 2011 Brazil +/* Copyright(C) 2011-2015 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -46,6 +46,8 @@ class GRN_DAT_API File { void swap(File *rhs); + void flush(); + private: FileImpl *impl_; diff --git a/storage/mroonga/vendor/groonga/lib/dat/trie.cpp b/storage/mroonga/vendor/groonga/lib/dat/trie.cpp index 82c8c273286..2f9e79bac56 100644 --- a/storage/mroonga/vendor/groonga/lib/dat/trie.cpp +++ b/storage/mroonga/vendor/groonga/lib/dat/trie.cpp @@ -1,5 +1,5 @@ /* -*- c-basic-offset: 2 -*- */ -/* Copyright(C) 2011 Brazil +/* Copyright(C) 2011-2015 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -168,6 +168,10 @@ void Trie::swap(Trie *trie) { key_buf_.swap(&trie->key_buf_); } +void Trie::flush() { + file_.flush(); +} + void Trie::create_file(const char *file_name, UInt64 file_size, UInt32 max_num_keys, diff --git a/storage/mroonga/vendor/groonga/lib/dat/trie.hpp b/storage/mroonga/vendor/groonga/lib/dat/trie.hpp index 6bd307bb70e..8a272bb7940 100644 --- a/storage/mroonga/vendor/groonga/lib/dat/trie.hpp +++ b/storage/mroonga/vendor/groonga/lib/dat/trie.hpp @@ -1,5 +1,5 @@ /* -*- c-basic-offset: 2 -*- */ -/* Copyright(C) 2011 Brazil +/* Copyright(C) 2011-2015 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -189,6 +189,8 @@ class GRN_DAT_API Trie { header_->set_status_flags(status_flags() & ~CHANGING_MASK); } + void flush(); + private: File file_; Header *header_; diff --git a/storage/mroonga/vendor/groonga/lib/db.c b/storage/mroonga/vendor/groonga/lib/db.c index 357df82e314..e213812d926 100644 --- a/storage/mroonga/vendor/groonga/lib/db.c +++ b/storage/mroonga/vendor/groonga/lib/db.c @@ -85,6 +85,33 @@ inline static void grn_obj_get_range_info(grn_ctx *ctx, grn_obj *obj, grn_id *range_id, grn_obj_flags *range_flags); + +static char grn_db_key[GRN_ENV_BUFFER_SIZE]; +static uint64_t grn_index_sparsity = 10; + +void +grn_db_init_from_env(void) +{ + grn_getenv("GRN_DB_KEY", + grn_db_key, + GRN_ENV_BUFFER_SIZE); + + { + char grn_index_sparsity_env[GRN_ENV_BUFFER_SIZE]; + grn_getenv("GRN_INDEX_SPARSITY", + grn_index_sparsity_env, + GRN_ENV_BUFFER_SIZE); + if (grn_index_sparsity_env[0]) { + uint64_t sparsity; + errno = 0; + sparsity = strtoull(grn_index_sparsity_env, NULL, 0); + if (errno == 0) { + grn_index_sparsity = sparsity; + } + } + } +} + inline static void gen_pathname(const char *path, char *buffer, int fno) { @@ -155,15 +182,11 @@ grn_db_create(grn_ctx *ctx, const char *path, grn_db_create_optarg *optarg) if ((s = GRN_MALLOC(sizeof(grn_db)))) { grn_bool use_default_db_key = GRN_TRUE; grn_bool use_pat_as_db_keys = GRN_FALSE; - char grn_db_key_env[GRN_ENV_BUFFER_SIZE]; - grn_getenv("GRN_DB_KEY", - grn_db_key_env, - GRN_ENV_BUFFER_SIZE); - if (grn_db_key_env[0]) { - if (!strcmp(grn_db_key_env, "pat")) { + if (grn_db_key[0]) { + if (!strcmp(grn_db_key, "pat")) { use_default_db_key = GRN_FALSE; use_pat_as_db_keys = GRN_TRUE; - } else if (!strcmp(grn_db_key_env, "dat")) { + } else if (!strcmp(grn_db_key, "dat")) { use_default_db_key = GRN_FALSE; } } @@ -245,6 +268,10 @@ grn_db_open(grn_ctx *ctx, const char *path) break; default : s->keys = NULL; + if (ctx->rc == GRN_SUCCESS) { + ERR(GRN_INVALID_ARGUMENT, + "[db][open] invalid keys table's type: %#x", type); + } break; } if (s->keys) { @@ -870,6 +897,7 @@ grn_table_create_with_max_n_subrecs(grn_ctx *ctx, const char *name, path = buffer; } else { ERR(GRN_INVALID_ARGUMENT, "path not assigned for persistent table"); + grn_obj_delete_by_id(ctx, db, id, GRN_TRUE); return NULL; } } else { @@ -878,10 +906,12 @@ grn_table_create_with_max_n_subrecs(grn_ctx *ctx, const char *name, } else { if (path) { ERR(GRN_INVALID_ARGUMENT, "path assigned for temporary table"); + grn_obj_delete_by_id(ctx, db, id, GRN_TRUE); return NULL; } if (GRN_DB_PERSISTENT_P(db) && name && name_size) { ERR(GRN_INVALID_ARGUMENT, "name assigned for temporary table"); + grn_obj_delete_by_id(ctx, db, id, GRN_TRUE); return NULL; } } @@ -2758,6 +2788,181 @@ grn_table_next(grn_ctx *ctx, grn_obj *table, grn_id id) GRN_API_RETURN(r); } +static grn_rc +grn_accessor_resolve_one_index_column(grn_ctx *ctx, grn_accessor *accessor, + grn_obj *current_res, grn_obj **next_res, + grn_search_optarg *optarg) +{ + grn_rc rc = GRN_SUCCESS; + grn_obj *column = NULL; + grn_id next_res_domain_id = GRN_ID_NIL; + + { + grn_obj *index; + grn_obj source_ids; + unsigned int i, n_ids; + + index = accessor->obj; + next_res_domain_id = index->header.domain; + + GRN_UINT32_INIT(&source_ids, GRN_OBJ_VECTOR); + grn_obj_get_info(ctx, index, GRN_INFO_SOURCE, &source_ids); + n_ids = GRN_BULK_VSIZE(&source_ids) / sizeof(grn_id); + for (i = 0; i < n_ids; i++) { + grn_id source_id; + grn_obj *source; + + source_id = GRN_UINT32_VALUE_AT(&source_ids, i); + source = grn_ctx_at(ctx, source_id); + if (DB_OBJ(source)->range == next_res_domain_id) { + column = source; + break; + } + grn_obj_unlink(ctx, source); + } + + if (!column) { + return GRN_INVALID_ARGUMENT; + } + } + + { + grn_rc rc; + grn_obj *next_res_domain = grn_ctx_at(ctx, next_res_domain_id); + *next_res = grn_table_create(ctx, NULL, 0, NULL, + GRN_TABLE_HASH_KEY|GRN_OBJ_WITH_SUBREC, + next_res_domain, NULL); + rc = ctx->rc; + grn_obj_unlink(ctx, next_res_domain); + if (!*next_res) { + return rc; + } + } + + { + grn_obj_flags column_value_flags = 0; + grn_obj column_value; + grn_ii_posting add_posting; + grn_id *tid; + grn_rset_recinfo *recinfo; + + if (column->header.type == GRN_COLUMN_VAR_SIZE) { + column_value_flags |= GRN_OBJ_VECTOR; + } + GRN_VALUE_FIX_SIZE_INIT(&column_value, + column_value_flags, + next_res_domain_id); + + add_posting.sid = 0; + add_posting.pos = 0; + add_posting.weight = 0; + + GRN_HASH_EACH(ctx, (grn_hash *)current_res, id, &tid, NULL, &recinfo, { + int i; + int n_elements; + + add_posting.weight = recinfo->score - 1; + + GRN_BULK_REWIND(&column_value); + grn_obj_get_value(ctx, column, *tid, &column_value); + + n_elements = GRN_BULK_VSIZE(&column_value) / sizeof(grn_id); + for (i = 0; i < n_elements; i++) { + add_posting.rid = GRN_RECORD_VALUE_AT(&column_value, i); + rc = grn_ii_posting_add(ctx, + &add_posting, + (grn_hash *)*next_res, + GRN_OP_OR); + if (rc != GRN_SUCCESS) { + break; + } + } + if (rc != GRN_SUCCESS) { + break; + } + }); + + GRN_OBJ_FIN(ctx, &column_value); + } + + if (rc != GRN_SUCCESS) { + grn_obj_unlink(ctx, *next_res); + } + + return rc; +} + +static grn_rc +grn_accessor_resolve_one_data_column(grn_ctx *ctx, grn_accessor *accessor, + grn_obj *current_res, grn_obj **next_res, + grn_search_optarg *optarg) +{ + grn_rc rc = GRN_SUCCESS; + grn_obj *index = NULL; + grn_operator index_op = GRN_OP_MATCH; + grn_id next_res_domain_id = GRN_ID_NIL; + + if (grn_column_index(ctx, accessor->obj, index_op, &index, 1, NULL) == 0) { + return GRN_INVALID_ARGUMENT; + } + next_res_domain_id = DB_OBJ(index)->range; + + { + grn_rc rc; + grn_obj *next_res_domain = grn_ctx_at(ctx, next_res_domain_id); + *next_res = grn_table_create(ctx, NULL, 0, NULL, + GRN_TABLE_HASH_KEY|GRN_OBJ_WITH_SUBREC, + next_res_domain, NULL); + rc = ctx->rc; + grn_obj_unlink(ctx, next_res_domain); + if (!*next_res) { + return rc; + } + } + + { + grn_id *tid; + grn_rset_recinfo *recinfo; + + GRN_HASH_EACH(ctx, (grn_hash *)current_res, id, &tid, NULL, &recinfo, { + grn_ii *ii = (grn_ii *)index; + grn_ii_cursor *ii_cursor; + grn_ii_posting *posting; + + ii_cursor = grn_ii_cursor_open(ctx, ii, *tid, + GRN_ID_NIL, GRN_ID_MAX, + ii->n_elements, + 0); + if (!ii_cursor) { + continue; + } + + while ((posting = grn_ii_cursor_next(ctx, ii_cursor))) { + grn_ii_posting add_posting = *posting; + add_posting.weight += recinfo->score - 1; + rc = grn_ii_posting_add(ctx, + &add_posting, + (grn_hash *)*next_res, + GRN_OP_OR); + if (rc != GRN_SUCCESS) { + break; + } + } + grn_ii_cursor_close(ctx, ii_cursor); + + if (rc != GRN_SUCCESS) { + break; + } + }); + } + + if (rc != GRN_SUCCESS) { + grn_obj_unlink(ctx, *next_res); + } + + return rc; +} + grn_rc grn_accessor_resolve(grn_ctx *ctx, grn_obj *accessor, int deep, grn_obj *base_res, grn_obj **res, @@ -2780,69 +2985,28 @@ grn_accessor_resolve(grn_ctx *ctx, grn_obj *accessor, int deep, } for (i = n_accessors; i > 0; i--) { - grn_obj *index; - grn_operator index_op = GRN_OP_MATCH; + grn_obj *next_res = NULL; a = (grn_accessor *)GRN_PTR_VALUE_AT(&accessor_stack, i - 1); - if (grn_column_index(ctx, a->obj, index_op, &index, 1, NULL) == 0) { - rc = GRN_INVALID_ARGUMENT; + if (a->obj->header.type == GRN_COLUMN_INDEX) { + rc = grn_accessor_resolve_one_index_column(ctx, a, + current_res, &next_res, + optarg); + } else { + rc = grn_accessor_resolve_one_data_column(ctx, a, + current_res, &next_res, + optarg); + } + + if (current_res != base_res) { + grn_obj_unlink(ctx, current_res); + } + + if (rc != GRN_SUCCESS) { break; } - { - grn_id *tid; - grn_obj *next_res; - grn_rset_recinfo *recinfo; - { - grn_obj *range = grn_ctx_at(ctx, DB_OBJ(index)->range); - next_res = grn_table_create(ctx, NULL, 0, NULL, - GRN_TABLE_HASH_KEY|GRN_OBJ_WITH_SUBREC, - range, NULL); - rc = ctx->rc; - grn_obj_unlink(ctx, range); - if (!next_res) { - if (current_res != base_res) { - grn_obj_unlink(ctx, current_res); - } - break; - } - } - GRN_HASH_EACH(ctx, (grn_hash *)current_res, id, &tid, NULL, &recinfo, { - grn_ii *ii = (grn_ii *)index; - grn_ii_cursor *ii_cursor; - grn_ii_posting *posting; - - ii_cursor = grn_ii_cursor_open(ctx, ii, *tid, - GRN_ID_NIL, GRN_ID_MAX, - ii->n_elements, - 0); - if (!ii_cursor) { - continue; - } - - while ((posting = grn_ii_cursor_next(ctx, ii_cursor))) { - grn_ii_posting add_posting = *posting; - add_posting.weight += recinfo->score - 1; - grn_ii_posting_add(ctx, - &add_posting, - (grn_hash *)next_res, - GRN_OP_OR); - } - grn_ii_cursor_close(ctx, ii_cursor); - - if (rc != GRN_SUCCESS) { - break; - } - }); - if (current_res != base_res) { - grn_obj_unlink(ctx, current_res); - } - if (rc != GRN_SUCCESS) { - grn_obj_unlink(ctx, next_res); - break; - } - current_res = next_res; - } + current_res = next_res; } if (rc == GRN_SUCCESS && current_res != base_res) { @@ -6846,7 +7010,7 @@ grn_obj_get_value(grn_ctx *ctx, grn_obj *obj, grn_id id, grn_obj *value) } switch (value->header.type) { case GRN_VOID : - GRN_TEXT_INIT(value, 0); + grn_obj_reinit(ctx, value, GRN_DB_TEXT, 0); break; case GRN_BULK : case GRN_VECTOR : @@ -7225,18 +7389,7 @@ build_index(grn_ctx *ctx, grn_obj *obj) } } if (use_grn_ii_build) { - uint64_t sparsity = 10; - char grn_index_sparsity_env[GRN_ENV_BUFFER_SIZE]; - grn_getenv("GRN_INDEX_SPARSITY", - grn_index_sparsity_env, - GRN_ENV_BUFFER_SIZE); - if (grn_index_sparsity_env[0]) { - uint64_t v; - errno = 0; - v = strtoull(grn_index_sparsity_env, NULL, 0); - if (!errno) { sparsity = v; } - } - grn_ii_build(ctx, ii, sparsity); + grn_ii_build(ctx, ii, grn_index_sparsity); } else { grn_table_cursor *tc; if ((tc = grn_table_cursor_open(ctx, target, NULL, 0, NULL, 0, @@ -9528,6 +9681,7 @@ grn_obj_clear_lock(grn_ctx *ctx, grn_obj *obj) case GRN_TABLE_DAT_KEY: case GRN_TABLE_NO_KEY: grn_obj_clear_lock(ctx, tbl); + break; } } else { if (ctx->rc != GRN_SUCCESS) { @@ -9580,6 +9734,132 @@ grn_obj_is_locked(grn_ctx *ctx, grn_obj *obj) GRN_API_RETURN(res); } +grn_rc +grn_obj_flush(grn_ctx *ctx, grn_obj *obj) +{ + grn_rc rc = GRN_SUCCESS; + GRN_API_ENTER; + switch (obj->header.type) { + case GRN_DB : + { + grn_db *db = (grn_db *)obj; + rc = grn_obj_flush(ctx, db->keys); + if (rc == GRN_SUCCESS) { + rc = grn_obj_flush(ctx, (grn_obj *)(db->specs)); + } + } + break; + case GRN_TABLE_DAT_KEY : + rc = grn_dat_flush(ctx, (grn_dat *)obj); + break; + case GRN_COLUMN_INDEX : + rc = grn_ii_flush(ctx, (grn_ii *)obj); + break; + default : + rc = grn_io_flush(ctx, grn_obj_io(obj)); + break; + } + GRN_API_RETURN(rc); +} + +grn_rc +grn_obj_flush_recursive(grn_ctx *ctx, grn_obj *obj) +{ + grn_rc rc = GRN_SUCCESS; + + GRN_API_ENTER; + switch (obj->header.type) { + case GRN_DB : + { + grn_table_cursor *cursor; + grn_id id; + + cursor = grn_table_cursor_open(ctx, obj, NULL, 0, NULL, 0, 0, -1, 0); + if (!cursor) { + GRN_API_RETURN(ctx->rc); + } + + while ((id = grn_table_cursor_next_inline(ctx, cursor)) != GRN_ID_NIL) { + grn_obj *table = grn_ctx_at(ctx, id); + rc = GRN_SUCCESS; + if (table) { + switch (table->header.type) { + case GRN_TABLE_HASH_KEY : + case GRN_TABLE_PAT_KEY: + case GRN_TABLE_DAT_KEY: + case GRN_TABLE_NO_KEY: + rc = grn_obj_flush_recursive(ctx, table); + break; + } + } else { + if (ctx->rc != GRN_SUCCESS) { + ERRCLR(ctx); + } + } + if (rc != GRN_SUCCESS) { + break; + } + } + grn_table_cursor_close(ctx, cursor); + } + if (rc == GRN_SUCCESS) { + rc = grn_obj_flush(ctx, obj); + } + break; + case GRN_TABLE_NO_KEY : + case GRN_TABLE_HASH_KEY : + case GRN_TABLE_PAT_KEY : + case GRN_TABLE_DAT_KEY : + { + grn_hash *columns; + columns = grn_hash_create(ctx, NULL, sizeof(grn_id), 0, + GRN_OBJ_TABLE_HASH_KEY|GRN_HASH_TINY); + if (!columns) { + GRN_API_RETURN(ctx->rc); + } + + if (grn_table_columns(ctx, obj, "", 0, (grn_obj *)columns) > 0) { + grn_id *key; + GRN_HASH_EACH(ctx, columns, id, &key, NULL, NULL, { + grn_obj *column = grn_ctx_at(ctx, *key); + if (column) { + rc = grn_obj_flush(ctx, column); + if (rc != GRN_SUCCESS) { + break; + } + } + }); + } + grn_hash_close(ctx, columns); + } + + if (rc == GRN_SUCCESS) { + rc = grn_obj_flush(ctx, obj); + } + break; + case GRN_COLUMN_FIX_SIZE : + case GRN_COLUMN_VAR_SIZE : + case GRN_COLUMN_INDEX : + rc = grn_obj_flush(ctx, obj); + break; + default : + { + grn_obj inspected; + GRN_TEXT_INIT(&inspected, 0); + grn_inspect(ctx, &inspected, obj); + ERR(GRN_INVALID_ARGUMENT, + "[flush] object must be DB, table or column: <%.*s>", + (int)GRN_TEXT_LEN(&inspected), + GRN_TEXT_VALUE(&inspected)); + rc = ctx->rc; + GRN_OBJ_FIN(ctx, &inspected); + } + break; + } + + GRN_API_RETURN(rc); +} + grn_obj * grn_obj_db(grn_ctx *ctx, grn_obj *obj) { @@ -11181,6 +11461,11 @@ grn_table_sort_key_from_str(grn_ctx *ctx, const char *str, unsigned int str_size const char *p = str; const char **tokbuf; grn_table_sort_key *keys = NULL, *k = NULL; + + if (str_size == 0) { + return NULL; + } + if ((keys = grn_table_sort_key_from_str_geo(ctx, str, str_size, table, nkeys))) { return keys; } diff --git a/storage/mroonga/vendor/groonga/lib/egn.cpp b/storage/mroonga/vendor/groonga/lib/egn.cpp new file mode 100644 index 00000000000..c7e7357fffb --- /dev/null +++ b/storage/mroonga/vendor/groonga/lib/egn.cpp @@ -0,0 +1,3245 @@ +/* -*- c-basic-offset: 2 -*- */ +/* + Copyright(C) 2015 Brazil + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License version 2.1 as published by the Free Software Foundation. + + 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 +*/ + +#ifdef GRN_WITH_EGN + +#include "grn_egn.hpp" + +#include +#include +#include +#include +#include + +#include // for debug! + +#include "grn_ctx_impl.h" +#include "grn_db.h" +#include "grn_output.h" +#include "grn_str.h" + +// TODO: Error handling. + +namespace { + +enum { GRN_EGN_MAX_BATCH_SIZE = 1024 }; + +bool grn_egn_is_table_cursor(grn_obj *obj) { + if (!obj) { + return false; + } + switch (obj->header.type) { + case GRN_CURSOR_TABLE_PAT_KEY: + case GRN_CURSOR_TABLE_DAT_KEY: + case GRN_CURSOR_TABLE_HASH_KEY: + case GRN_CURSOR_TABLE_NO_KEY: { + return true; + } + default: { + return false; + } + } +} + +bool grn_egn_is_table(grn_obj *obj) { + if (!obj) { + return false; + } + switch (obj->header.type) { + case GRN_TABLE_HASH_KEY: + case GRN_TABLE_PAT_KEY: + case GRN_TABLE_DAT_KEY: + case GRN_TABLE_NO_KEY: { + return true; + } + default: { + return false; + } + } +} + +} // namespace + +namespace grn { +namespace egn { + +// -- TableCursor -- + +// TableCursor is a wrapper for grn_table_cursor: +// - GRN_CURSOR_PAT_KEY +// - GRN_CURSOR_DAT_KEY +// - GRN_CURSOR_HASH_KEY +// - GRN_CURSOR_NO_KEY +class TableCursor : public Cursor { + public: + ~TableCursor() { + grn_table_cursor_close(ctx_, cursor_); + } + + static grn_rc open(grn_ctx *ctx, grn_obj *cursor, Score default_score, + Cursor **wrapper) { + if (!ctx || !grn_egn_is_table_cursor(cursor) || !wrapper) { + return GRN_INVALID_ARGUMENT; + } + TableCursor *new_wrapper = + new (std::nothrow) TableCursor(ctx, cursor, default_score); + if (!new_wrapper) { + return GRN_NO_MEMORY_AVAILABLE; + } + *wrapper = new_wrapper; + return GRN_SUCCESS; + } + + grn_rc read(Record *records, size_t size, size_t *count); + + private: + grn_ctx *ctx_; + grn_obj *cursor_; + Score default_score_; + + TableCursor(grn_ctx *ctx, grn_obj *cursor, Score default_score) + : Cursor(), ctx_(ctx), cursor_(cursor), default_score_(default_score) {} +}; + +grn_rc TableCursor::read(Record *records, size_t size, size_t *count) { + if ((!records && (size != 0)) || !count) { + return GRN_INVALID_ARGUMENT; + } + switch (cursor_->header.type) { + case GRN_CURSOR_TABLE_PAT_KEY: { + for (size_t i = 0; i < size; ++i) { + grn_id id = grn_pat_cursor_next( + ctx_, reinterpret_cast(cursor_)); + if (id == GRN_ID_NIL) { + *count = i; + return GRN_SUCCESS; + } + records[i].id = id; + records[i].score = default_score_; + } + break; + } + case GRN_CURSOR_TABLE_DAT_KEY: { + for (size_t i = 0; i < size; ++i) { + grn_id id = grn_dat_cursor_next( + ctx_, reinterpret_cast(cursor_)); + if (id == GRN_ID_NIL) { + *count = i; + return GRN_SUCCESS; + } + records[i].id = id; + records[i].score = default_score_; + } + break; + } + case GRN_CURSOR_TABLE_HASH_KEY: { + for (size_t i = 0; i < size; ++i) { + grn_id id = grn_hash_cursor_next( + ctx_, reinterpret_cast(cursor_)); + if (id == GRN_ID_NIL) { + *count = i; + return GRN_SUCCESS; + } + records[i].id = id; + records[i].score = default_score_; + } + break; + } + case GRN_CURSOR_TABLE_NO_KEY: { + for (size_t i = 0; i < size; ++i) { + grn_id id = grn_array_cursor_next( + ctx_, reinterpret_cast(cursor_)); + if (id == GRN_ID_NIL) { + *count = i; + return GRN_SUCCESS; + } + records[i].id = id; + records[i].score = default_score_; + } + break; + } + default: { + return GRN_UNKNOWN_ERROR; + } + } + *count = size; + return GRN_SUCCESS; +} + +// -- Cursor -- + +grn_rc Cursor::open_table_cursor( + grn_ctx *ctx, grn_obj *table, Cursor **cursor) { + if (!ctx || !grn_egn_is_table(table) || !cursor) { + return GRN_INVALID_ARGUMENT; + } + grn_table_cursor *table_cursor = grn_table_cursor_open( + ctx, table, NULL, 0, NULL, 0, 0, -1, + GRN_CURSOR_ASCENDING | GRN_CURSOR_BY_ID); + if (!table_cursor) { + return ctx->rc; + } + grn_rc rc = TableCursor::open(ctx, table_cursor, 0.0, cursor); + if (rc != GRN_SUCCESS) { + grn_table_cursor_close(ctx, table_cursor); + } + return rc; +} + +grn_rc Cursor::read(Record *records, size_t size, size_t *count) { + if ((!records && (size != 0)) || !count) { + return GRN_INVALID_ARGUMENT; + } + *count = 0; + return GRN_SUCCESS; +} + +// -- ExpressionNode -- + +class ExpressionNode { + public: + ExpressionNode() {} + virtual ~ExpressionNode() {} + + virtual ExpressionNodeType type() const = 0; + virtual DataType data_type() const = 0; + + virtual grn_rc filter(Record *input, size_t input_size, + Record *output, size_t *output_size) { + return GRN_OPERATION_NOT_SUPPORTED; + } + virtual grn_rc adjust(Record *records, size_t num_records) { + return GRN_OPERATION_NOT_SUPPORTED; + } +}; + +// -- TypedNode -- + +template +class TypedNode : public ExpressionNode { + public: + TypedNode() : ExpressionNode() {} + virtual ~TypedNode() {} + + DataType data_type() const { + return T::data_type(); + } + + virtual grn_rc evaluate( + const Record *records, size_t num_records, T *results) = 0; +}; + +// -- TypedNode -- + +template <> +class TypedNode : public ExpressionNode { + public: + TypedNode() : ExpressionNode(), values_for_filter_() {} + virtual ~TypedNode() {} + + DataType data_type() const { + return Bool::data_type(); + } + + virtual grn_rc filter(Record *input, size_t input_size, + Record *output, size_t *output_size); + + virtual grn_rc evaluate( + const Record *records, size_t num_records, Bool *results) = 0; + + private: + std::vector values_for_filter_; +}; + +grn_rc TypedNode::filter(Record *input, size_t input_size, + Record *output, size_t *output_size) { + if (values_for_filter_.size() < input_size) { + values_for_filter_.resize(input_size); + } + grn_rc rc = evaluate(input, input_size, &*values_for_filter_.begin()); + if (rc != GRN_SUCCESS) { + return rc; + } + size_t count = 0; + for (size_t i = 0; i < input_size; ++i) { + if (values_for_filter_[i].raw) { + output[count] = input[i]; + ++count; + } + } + *output_size = count; + return GRN_SUCCESS; +} + +// -- TypedNode -- + +template <> +class TypedNode : public ExpressionNode { + public: + TypedNode() : ExpressionNode(), values_for_adjust_() {} + virtual ~TypedNode() {} + + DataType data_type() const { + return Float::data_type(); + } + + virtual grn_rc adjust(Record *records, size_t num_records); + + virtual grn_rc evaluate( + const Record *records, size_t num_records, Float *results) = 0; + + private: + std::vector values_for_adjust_; +}; + +grn_rc TypedNode::adjust(Record *records, size_t num_records) { + if (values_for_adjust_.size() < num_records) { + values_for_adjust_.resize(num_records); + } + grn_rc rc = evaluate(records, num_records, &*values_for_adjust_.begin()); + if (rc != GRN_SUCCESS) { + return rc; + } + for (size_t i = 0; i < num_records; ++i) { + records[i].score = values_for_adjust_[i].raw; + } + return GRN_SUCCESS; +} + +// -- IDNode -- + +class IDNode : public TypedNode { + public: + ~IDNode() {} + + static grn_rc open(ExpressionNode **node) { + ExpressionNode *new_node = new (std::nothrow) IDNode(); + if (!new_node) { + return GRN_NO_MEMORY_AVAILABLE; + } + *node = new_node; + return GRN_SUCCESS; + } + + ExpressionNodeType type() const { + return GRN_EGN_ID_NODE; + } + + grn_rc evaluate( + const Record *records, size_t num_records, Int *results) { + for (size_t i = 0; i < num_records; ++i) { + results[i] = Int(records[i].id); + } + return GRN_SUCCESS; + } + + private: + IDNode() : TypedNode() {} +}; + +// -- ScoreNode -- + +class ScoreNode : public TypedNode { + public: + ~ScoreNode() {} + + static grn_rc open(ExpressionNode **node) { + ExpressionNode *new_node = new (std::nothrow) ScoreNode(); + if (!new_node) { + return GRN_NO_MEMORY_AVAILABLE; + } + *node = new_node; + return GRN_SUCCESS; + } + + ExpressionNodeType type() const { + return GRN_EGN_SCORE_NODE; + } + + grn_rc evaluate( + const Record *records, size_t num_records, Float *results) { + for (size_t i = 0; i < num_records; ++i) { + results[i] = Float(records[i].score); + } + return GRN_SUCCESS; + } + + private: + ScoreNode() : TypedNode() {} +}; + +// -- ConstantNode -- + +template +class ConstantNode : public TypedNode { + public: + ~ConstantNode() {} + + static grn_rc open(const T &value, ExpressionNode **node) { + ConstantNode *new_node = new (std::nothrow) ConstantNode(value); + if (!new_node) { + return GRN_NO_MEMORY_AVAILABLE; + } + *node = new_node; + return GRN_SUCCESS; + } + + ExpressionNodeType type() const { + return GRN_EGN_CONSTANT_NODE; + } + + grn_rc evaluate( + const Record *records, size_t num_records, T *results) { + for (size_t i = 0; i < num_records; ++i) { + results[i] = value_; + } + return GRN_SUCCESS; + } + + private: + T value_; + + explicit ConstantNode(const T &value) : TypedNode(), value_(value) {} +}; + +// -- ConstantNode -- + +template <> +class ConstantNode : public TypedNode { + public: + ~ConstantNode() {} + + static grn_rc open(Bool value, ExpressionNode **node) { + ConstantNode *new_node = new (std::nothrow) ConstantNode(value); + if (!new_node) { + return GRN_NO_MEMORY_AVAILABLE; + } + *node = new_node; + return GRN_SUCCESS; + } + + ExpressionNodeType type() const { + return GRN_EGN_CONSTANT_NODE; + } + + grn_rc filter(Record *input, size_t input_size, + Record *output, size_t *output_size); + + grn_rc evaluate( + const Record *records, size_t num_records, Bool *results) { + for (size_t i = 0; i < num_records; ++i) { + results[i] = value_; + } + return GRN_SUCCESS; + } + + private: + Bool value_; + + explicit ConstantNode(Bool value) : TypedNode(), value_(value) {} +}; + +grn_rc ConstantNode::filter( + Record *input, size_t input_size, + Record *output, size_t *output_size) { + if (value_.raw == GRN_TRUE) { + // The I/O areas are the same and there is no need to copy records. + if (input != output) { + for (size_t i = 0; i < input_size; ++i) { + output[i] = input[i]; + } + } + *output_size = input_size; + } else { + *output_size = 0; + } + return GRN_SUCCESS; +} + +// -- ConstantNode -- + +template <> +class ConstantNode : public TypedNode { + public: + ~ConstantNode() {} + + static grn_rc open(Float value, ExpressionNode **node) { + ConstantNode *new_node = new (std::nothrow) ConstantNode(value); + if (!new_node) { + return GRN_NO_MEMORY_AVAILABLE; + } + *node = new_node; + return GRN_SUCCESS; + } + + ExpressionNodeType type() const { + return GRN_EGN_CONSTANT_NODE; + } + + grn_rc adjust(Record *records, size_t num_records) { + for (size_t i = 0; i < num_records; ++i) { + records[i].score = value_.raw; + } + return GRN_SUCCESS; + } + + grn_rc evaluate( + const Record *records, size_t num_records, Float *results) { + for (size_t i = 0; i < num_records; ++i) { + results[i] = value_; + } + return GRN_SUCCESS; + } + + private: + Float value_; + + explicit ConstantNode(Float value) : TypedNode(), value_(value) {} +}; + +// -- ConstantNode -- + +template <> +class ConstantNode : public TypedNode { + public: + ~ConstantNode() {} + + static grn_rc open(const Text &value, ExpressionNode **node) { + ConstantNode *new_node = new (std::nothrow) ConstantNode(value); + if (!new_node) { + return GRN_NO_MEMORY_AVAILABLE; + } + try { + new_node->value_buf_.resize(value.raw.size); + } catch (const std::bad_alloc &) { + delete new_node; + return GRN_NO_MEMORY_AVAILABLE; + } + std::memcpy(&*new_node->value_buf_.begin(), value.raw.ptr, value.raw.size); + new_node->value_.raw.ptr = &*new_node->value_buf_.begin(); + *node = new_node; + return GRN_SUCCESS; + } + + ExpressionNodeType type() const { + return GRN_EGN_CONSTANT_NODE; + } + + grn_rc evaluate( + const Record *records, size_t num_records, Text *results) { + for (size_t i = 0; i < num_records; ++i) { + results[i] = value_; + } + return GRN_SUCCESS; + } + + private: + Text value_; + std::vector value_buf_; + + explicit ConstantNode(const Text &value) + : TypedNode(), value_(value), value_buf_() {} +}; + +// -- ColumnNode -- + +template +class ColumnNode : public TypedNode { + public: + ~ColumnNode() {} + + static grn_rc open(grn_ctx *ctx, grn_obj *column, ExpressionNode **node) { + ColumnNode *new_node = new (std::nothrow) ColumnNode(ctx, column); + if (!new_node) { + return GRN_NO_MEMORY_AVAILABLE; + } + *node = new_node; + return GRN_SUCCESS; + } + + ExpressionNodeType type() const { + return GRN_EGN_COLUMN_NODE; + } + + grn_rc evaluate( + const Record *records, size_t num_records, T *results) { + // TODO + return GRN_OPERATION_NOT_SUPPORTED; + } + + private: + grn_ctx *ctx_; + grn_obj *column_; + + ColumnNode(grn_ctx *ctx, grn_obj *column) + : TypedNode(), ctx_(ctx), column_(column) {} +}; + +// -- ColumnNode -- + +template <> +class ColumnNode : public TypedNode { + public: + ~ColumnNode() {} + + static grn_rc open(grn_ctx *ctx, grn_obj *column, ExpressionNode **node) { + ColumnNode *new_node = new (std::nothrow) ColumnNode(ctx, column); + if (!new_node) { + return GRN_NO_MEMORY_AVAILABLE; + } + *node = new_node; + return GRN_SUCCESS; + } + + ExpressionNodeType type() const { + return GRN_EGN_COLUMN_NODE; + } + + grn_rc filter( + Record *input, size_t input_size, + Record *output, size_t *output_size); + + grn_rc evaluate( + const Record *records, size_t num_records, Bool *results); + + private: + grn_ctx *ctx_; + grn_obj *column_; + + ColumnNode(grn_ctx *ctx, grn_obj *column) + : TypedNode(), ctx_(ctx), column_(column) {} +}; + +grn_rc ColumnNode::filter( + Record *input, size_t input_size, + Record *output, size_t *output_size) { + grn_obj value; + GRN_BOOL_INIT(&value, 0); + size_t count = 0; + for (size_t i = 0; i < input_size; ++i) { + GRN_BULK_REWIND(&value); + grn_obj_get_value(ctx_, column_, input[i].id, &value); + if (ctx_->rc != GRN_SUCCESS) { + return ctx_->rc; + } + if (GRN_BOOL_VALUE(&value) == GRN_TRUE) { + output[count] = input[i]; + ++count; + } + } + GRN_OBJ_FIN(ctx_, &value); + *output_size = count; + return GRN_SUCCESS; +} + +grn_rc ColumnNode::evaluate( + const Record *records, size_t num_records, Bool *results) { + grn_obj value; + GRN_BOOL_INIT(&value, 0); + for (size_t i = 0; i < num_records; i++) { + GRN_BULK_REWIND(&value); + grn_obj_get_value(ctx_, column_, records[i].id, &value); + if (ctx_->rc != GRN_SUCCESS) { + return ctx_->rc; + } + results[i] = Bool(GRN_BOOL_VALUE(&value) == GRN_TRUE); + } + GRN_OBJ_FIN(ctx_, &value); + return GRN_SUCCESS; +} + +// -- ColumnNode -- + +template <> +class ColumnNode : public TypedNode { + public: + ~ColumnNode() {} + + static grn_rc open(grn_ctx *ctx, grn_obj *column, ExpressionNode **node) { + ColumnNode *new_node = new (std::nothrow) ColumnNode(ctx, column); + if (!new_node) { + return GRN_NO_MEMORY_AVAILABLE; + } + *node = new_node; + return GRN_SUCCESS; + } + + ExpressionNodeType type() const { + return GRN_EGN_COLUMN_NODE; + } + + grn_rc evaluate( + const Record *records, size_t num_records, Int *results); + + private: + grn_ctx *ctx_; + grn_obj *column_; + + ColumnNode(grn_ctx *ctx, grn_obj *column) + : TypedNode(), ctx_(ctx), column_(column) {} +}; + +grn_rc ColumnNode::evaluate( + const Record *records, size_t num_records, Int *results) { + grn_id range = grn_obj_get_range(ctx_, column_); + grn_obj value; + switch (range) { + case GRN_DB_INT8: { + GRN_INT8_INIT(&value, 0); + for (size_t i = 0; i < num_records; i++) { + GRN_BULK_REWIND(&value); + grn_obj_get_value(ctx_, column_, records[i].id, &value); + results[i] = Int(GRN_INT8_VALUE(&value)); + } + break; + } + case GRN_DB_INT16: { + GRN_INT16_INIT(&value, 0); + for (size_t i = 0; i < num_records; i++) { + GRN_BULK_REWIND(&value); + grn_obj_get_value(ctx_, column_, records[i].id, &value); + results[i] = Int(GRN_INT16_VALUE(&value)); + } + break; + } + case GRN_DB_INT32: { + GRN_INT32_INIT(&value, 0); + for (size_t i = 0; i < num_records; i++) { + GRN_BULK_REWIND(&value); + grn_obj_get_value(ctx_, column_, records[i].id, &value); + results[i] = Int(GRN_INT32_VALUE(&value)); + } + break; + } + case GRN_DB_INT64: { + GRN_INT64_INIT(&value, 0); + for (size_t i = 0; i < num_records; i++) { + GRN_BULK_REWIND(&value); + grn_obj_get_value(ctx_, column_, records[i].id, &value); + results[i] = Int(GRN_INT64_VALUE(&value)); + } + break; + } + case GRN_DB_UINT8: { + GRN_UINT8_INIT(&value, 0); + for (size_t i = 0; i < num_records; i++) { + GRN_BULK_REWIND(&value); + grn_obj_get_value(ctx_, column_, records[i].id, &value); + results[i] = Int(GRN_UINT8_VALUE(&value)); + } + break; + } + case GRN_DB_UINT16: { + GRN_UINT16_INIT(&value, 0); + for (size_t i = 0; i < num_records; i++) { + GRN_BULK_REWIND(&value); + grn_obj_get_value(ctx_, column_, records[i].id, &value); + results[i] = Int(GRN_UINT16_VALUE(&value)); + } + break; + } + case GRN_DB_UINT32: { + GRN_UINT32_INIT(&value, 0); + for (size_t i = 0; i < num_records; i++) { + GRN_BULK_REWIND(&value); + grn_obj_get_value(ctx_, column_, records[i].id, &value); + results[i] = Int(GRN_UINT32_VALUE(&value)); + } + break; + } + case GRN_DB_UINT64: { + GRN_UINT64_INIT(&value, 0); + for (size_t i = 0; i < num_records; i++) { + GRN_BULK_REWIND(&value); + grn_obj_get_value(ctx_, column_, records[i].id, &value); + // FIXME: Type conversion from UInt64 to Int may lose the content. + results[i] = Int(GRN_UINT64_VALUE(&value)); + } + break; + } + } + GRN_OBJ_FIN(ctx_, &value); + return GRN_SUCCESS; +} + +// -- ColumnNode -- + +template <> +class ColumnNode : public TypedNode { + public: + ~ColumnNode() {} + + static grn_rc open(grn_ctx *ctx, grn_obj *column, ExpressionNode **node) { + ColumnNode *new_node = new (std::nothrow) ColumnNode(ctx, column); + if (!new_node) { + return GRN_NO_MEMORY_AVAILABLE; + } + *node = new_node; + return GRN_SUCCESS; + } + + ExpressionNodeType type() const { + return GRN_EGN_COLUMN_NODE; + } + + grn_rc adjust(Record *records, size_t num_records); + + grn_rc evaluate( + const Record *records, size_t num_records, Float *results); + + private: + grn_ctx *ctx_; + grn_obj *column_; + + ColumnNode(grn_ctx *ctx, grn_obj *column) + : TypedNode(), ctx_(ctx), column_(column) {} +}; + +grn_rc ColumnNode::adjust(Record *records, size_t num_records) { + grn_obj value; + GRN_FLOAT_INIT(&value, 0); + for (size_t i = 0; i < num_records; ++i) { + GRN_BULK_REWIND(&value); + grn_obj_get_value(ctx_, column_, records[i].id, &value); + records[i].score = GRN_FLOAT_VALUE(&value); + } + GRN_OBJ_FIN(ctx_, &value); + return GRN_SUCCESS; +} + +grn_rc ColumnNode::evaluate( + const Record *records, size_t num_records, Float *results) { + grn_obj value; + GRN_FLOAT_INIT(&value, 0); + for (size_t i = 0; i < num_records; i++) { + GRN_BULK_REWIND(&value); + grn_obj_get_value(ctx_, column_, records[i].id, &value); + results[i] = Float(GRN_FLOAT_VALUE(&value)); + } + GRN_OBJ_FIN(ctx_, &value); + return GRN_SUCCESS; +} + +// -- ColumnNode