--- orig/ChangeLog.tritonn 1970-01-01 09:00:00.000000000 +0900 +++ new/ChangeLog.tritonn 2007-10-29 10:15:24.000000000 +0900 @@ -0,0 +1,205 @@ +------------------------------------------------------------------------ +r34 | mir | 2007-10-26 16:03:40 +0900 (金, 26 10月 2007) | 8 lines + +added new macro MECAB_STATIC and some code in mysqld.cc. + +If this macro is enabled, mysqld checks if environment +variable MECABRC is defined, and if not, mysqld sets +MECABRC sets as basedir/etc/mecabrc. + +This code are added for using libmecab.a. + +------------------------------------------------------------------------ +r32 | mir | 2007-10-19 23:53:11 +0900 (金, 19 10月 2007) | 2 lines + +added testcases for new system variable "senna_index_type". + +------------------------------------------------------------------------ +r31 | mir | 2007-10-19 20:58:29 +0900 (金, 19 10月 2007) | 18 lines + +added system variable "senna_index_type". + +this new variables can be used to specify default index type of senna. +default value is NGRAM, so NGRAM is used if not specified. + +for speciflying MECAB, use my.cnf like following: +[mysqld] +senna-index-type=mecab + +or, use command-line option +shell> mysqld --senna-index-type=mecab + +or, use SET command in mysql +mysql> SET GLOBAL senna_index_type=mecab + +senna_index_type can be changed dynamically and will be reflected. + + +------------------------------------------------------------------------ +r30 | mir | 2007-10-19 15:32:27 +0900 (金, 19 10月 2007) | 18 lines + +Feature change for default index-type. + +NGRAM is default index type for tritonn. +If user don't specify index type in USING phrase, +NGRAM is used implicitly instead of MECAB. + +New SQL keyword "MECAB" is added. +If user want to use MECAB, user can specify explicitly +like following: + +CREATE FULLTEXT INDEX ft USING MECAB ON t1(c1); + +For users who want to use MECAB as defaul index type, +new system variable "senna-index-type" will be added also. +This system variable will be able to override default +index type as specified by user. + + +------------------------------------------------------------------------ +r29 | mir | 2007-10-19 14:07:04 +0900 (金, 19 10月 2007) | 2 lines + +additional bugfix for make error if --with-debug is configured. + +------------------------------------------------------------------------ +r28 | mir | 2007-10-10 13:38:22 +0900 (水, 10 10月 2007) | 2 lines + +bugfix for make error if --with-debug is configured. + +------------------------------------------------------------------------ +r27 | mir | 2007-10-10 12:40:55 +0900 (水, 10 10月 2007) | 2 lines + +refactering ft_init_boolean_search for performance improvement. + +------------------------------------------------------------------------ +r26 | mir | 2007-10-10 11:21:52 +0900 (水, 10 10月 2007) | 2 lines + +bugfix for delete_all_rows causing crash + +------------------------------------------------------------------------ +r25 | mir | 2007-10-09 16:52:12 +0900 (火, 09 10月 2007) | 2 lines + +bugfix for kwic sql function: got signal 11 if column data is null. + +------------------------------------------------------------------------ +r24 | mir | 2007-10-09 16:33:55 +0900 (火, 09 10月 2007) | 2 lines + +copy from mysql-5.0.45-tritonn-1.0.6 + +------------------------------------------------------------------------ +r23 | mir | 2007-09-28 22:27:45 +0900 (金, 28 9月 2007) | 2 lines + +added test for bugfix for kwic sql function + +------------------------------------------------------------------------ +r22 | mir | 2007-09-27 16:50:08 +0900 (木, 27 9月 2007) | 2 lines + +fixed kwic sql function bug regarding to max_results. + +------------------------------------------------------------------------ +r21 | mir | 2007-09-11 02:48:23 +0900 (火, 11 9月 2007) | 2 lines + +copy from mysql-5.0.45-tritonn-1.0.5 + +------------------------------------------------------------------------ +r19 | mir | 2007-09-07 01:15:48 +0900 (金, 07 9月 2007) | 4 lines + +changed test case name and test code for rename of snippet sql function +to new name "kwic". + + +------------------------------------------------------------------------ +r18 | mir | 2007-09-07 01:09:59 +0900 (金, 07 9月 2007) | 9 lines + +renamed "snippet" native sql function to "kwic" for avoiding +possible conflict of existance snippet UDF users, +because of signature difference between native snippet and +udf snippet. + +changed test case name and test code for rename of snippet sql function +to new name "kwic". + + +------------------------------------------------------------------------ +r17 | mir | 2007-09-06 13:38:08 +0900 (木, 06 9月 2007) | 2 lines + +added testcase for "split_XXX" flags (missing in last commit) + +------------------------------------------------------------------------ +r16 | mir | 2007-09-06 01:02:07 +0900 (木, 06 9月 2007) | 10 lines + +added new flags for index creation. +added testcase for this new feature + +example: + +ALTER TABLE t1 ADD FULLTEXT INDEX ft + USING SPLIT_ALPHA, SPLIT_DIGIT, SPLIT_SYMBOL (c1); + + + +------------------------------------------------------------------------ +r15 | mir | 2007-09-05 19:24:31 +0900 (水, 05 9月 2007) | 6 lines + +upgraded "show senna status" + - fixed "show senna status" bug. Now "show senna status" will return + ERR_NO_DB_ERROR if db is not selected. + - added "Sectionalize" column to "show senna status". + + +------------------------------------------------------------------------ +r14 | mir | 2007-09-04 20:35:32 +0900 (火, 04 9月 2007) | 13 lines + +refactoring for sen_enc_type. the function sen_enc_type was deleted and +structure, array, function are added instead of it. + +M mysql-5.0.45-tritonn-1.0.5/mysql-test/suite/senna/r/senna_cp932.result +M mysql-5.0.45-tritonn-1.0.5/mysql-test/suite/senna/r/senna_create.result +M mysql-5.0.45-tritonn-1.0.5/mysql-test/suite/senna/r/senna_eucjpms.result +M mysql-5.0.45-tritonn-1.0.5/mysql-test/suite/senna/r/senna_sjis.result +M mysql-5.0.45-tritonn-1.0.5/mysql-test/suite/senna/r/senna_ujis.result +M mysql-5.0.45-tritonn-1.0.5/sql/item_strfunc.cc +M mysql-5.0.45-tritonn-1.0.5/sql/ha_myisam.cc +M mysql-5.0.45-tritonn-1.0.5/sql/mysql_priv.h + + +------------------------------------------------------------------------ +r13 | mir | 2007-09-01 00:51:31 +0900 (土, 01 9月 2007) | 3 lines + +fixed logging for snippet native sql function + - sql/item_strfunc.cc + +------------------------------------------------------------------------ +r12 | mir | 2007-08-31 22:55:07 +0900 (金, 31 8月 2007) | 3 lines + +added full implementation for snippet native sql function. +added test codes for snippet native sql function. + +------------------------------------------------------------------------ +r11 | mir | 2007-08-30 13:15:06 +0900 (木, 30 8月 2007) | 4 lines + +added testcase for snippet native sql function +(only simple version, more test code will be added) + + +------------------------------------------------------------------------ +r10 | mir | 2007-08-30 11:53:45 +0900 (木, 30 8月 2007) | 5 lines + +added snippet native sql function. +this function create snippet with arguments. +this is a 1st implementation of snippet function, +and so need to be polished. + +------------------------------------------------------------------------ +r9 | mir | 2007-08-27 14:48:34 +0900 (月, 27 8月 2007) | 3 lines + +svn copy mysql-5.0.45-tritonn-1.0.4 mysql-5.0.45-tritonn-1.0.5 + + +------------------------------------------------------------------------ +r6 | mir | 2007-08-25 00:23:40 +0900 (土, 25 8月 2007) | 3 lines + +tritonn-1.0.4 for mysql-5.0.45 + + +------------------------------------------------------------------------ --- orig/aclocal.m4 2007-07-04 22:09:12.000000000 +0900 +++ new/aclocal.m4 2007-10-29 10:14:31.000000000 +0900 @@ -1,7 +1,7 @@ -# generated automatically by aclocal 1.9.6 -*- Autoconf -*- +# generated automatically by aclocal 1.9.2 -*- Autoconf -*- -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005 Free Software Foundation, Inc. +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 +# Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -13,7 +13,7 @@ # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- -# serial 48 AC_PROG_LIBTOOL +# serial 47 AC_PROG_LIBTOOL # AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) @@ -123,7 +123,7 @@ esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. -Xsed='sed -e 1s/^X//' +Xsed='sed -e s/^X//' [sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] # Same as above, but do not quote variable references. @@ -143,7 +143,7 @@ rm="rm -f" default_ofile=libtool can_build_shared=yes -# All known linkers require a `.a' archive for static linking (except MSVC, +# All known linkers require a `.a' archive for static linking (except M$VC, # which needs '.lib'). libext=a ltmain="$ac_aux_dir/ltmain.sh" @@ -163,7 +163,6 @@ test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" @@ -183,17 +182,15 @@ old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" ;; *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi -_LT_CC_BASENAME([$compiler]) - # Only perform the check for file, if the check method requires it case $deplibs_check_method in file_magic*) @@ -234,56 +231,11 @@ AC_DEFUN([_LT_AC_SYS_COMPILER], # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_AC_SYS_COMPILER -# _LT_CC_BASENAME(CC) -# ------------------- -# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. -AC_DEFUN([_LT_CC_BASENAME], -[for cc_temp in $1""; do - case $cc_temp in - compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; - distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` -]) - - -# _LT_COMPILER_BOILERPLATE -# ------------------------ -# Check for compiler boilerplate output or warnings with -# the simple compiler test code. -AC_DEFUN([_LT_COMPILER_BOILERPLATE], -[ac_outfile=conftest.$ac_objext -printf "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$rm conftest* -])# _LT_COMPILER_BOILERPLATE - - -# _LT_LINKER_BOILERPLATE -# ---------------------- -# Check for linker boilerplate output or warnings with -# the simple link test code. -AC_DEFUN([_LT_LINKER_BOILERPLATE], -[ac_outfile=conftest.$ac_objext -printf "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$rm conftest* -])# _LT_LINKER_BOILERPLATE - - # _LT_AC_SYS_LIBPATH_AIX # ---------------------- # Links a minimal program and checks the executable @@ -356,15 +308,15 @@ fi # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH +if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi if test -z "$ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... - if (echo_test_string=`eval $cmd`) 2>/dev/null && - echo_test_string=`eval $cmd` && + if (echo_test_string="`eval $cmd`") 2>/dev/null && + echo_test_string="`eval $cmd`" && (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null then break @@ -533,7 +485,7 @@ x86_64-*linux*|ppc*-*linux*|powerpc*-*li # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.o` in + case "`/usr/bin/file conftest.o`" in *32-bit*) case $host in x86_64-*linux*) @@ -584,22 +536,6 @@ x86_64-*linux*|ppc*-*linux*|powerpc*-*li CFLAGS="$SAVE_CFLAGS" fi ;; -sparc*-*solaris*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) LD="${LD-ld} -m elf64_sparc" ;; - *) LD="${LD-ld} -64" ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], [*-*-cygwin* | *-*-mingw* | *-*-pw32*) AC_CHECK_TOOL(DLLTOOL, dlltool, false) @@ -631,7 +567,7 @@ AC_CACHE_CHECK([$1], [$2], # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) @@ -641,10 +577,8 @@ AC_CACHE_CHECK([$1], [$2], echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + # So say no if there are warnings + if test ! -s conftest.err; then $2=yes fi fi @@ -670,16 +604,11 @@ AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], LDFLAGS="$LDFLAGS $3" printf "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized + # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD - $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi else $2=yes fi @@ -738,55 +667,11 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [d lt_cv_sys_max_cmd_len=8192; ;; - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) + *) # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ + while (test "X"`$CONFIG_SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ = "XX$teststring") >/dev/null 2>&1 && new_result=`expr "X$teststring" : ".*" 2>&1` && lt_cv_sys_max_cmd_len=$new_result && @@ -812,7 +697,7 @@ fi # _LT_AC_CHECK_DLFCN -# ------------------ +# -------------------- AC_DEFUN([_LT_AC_CHECK_DLFCN], [AC_CHECK_HEADERS(dlfcn.h)dnl ])# _LT_AC_CHECK_DLFCN @@ -820,7 +705,7 @@ AC_DEFUN([_LT_AC_CHECK_DLFCN], # _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) -# --------------------------------------------------------------------- +# ------------------------------------------------------------------ AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "$cross_compiling" = yes; then : @@ -886,19 +771,17 @@ int main () else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } - else - puts (dlerror ()); exit (status); }] EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; - x$lt_dlunknown|x*) $3 ;; + x$lt_unknown|x*) $3 ;; esac else : # compilation failed @@ -910,7 +793,7 @@ rm -fr conftest* # AC_LIBTOOL_DLOPEN_SELF -# ---------------------- +# ------------------- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "x$enable_dlopen" != xyes; then @@ -981,7 +864,7 @@ else test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" @@ -994,7 +877,7 @@ else ]) if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + LDFLAGS="$LDFLAGS $link_static_flag" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_AC_TRY_DLOPEN_SELF( @@ -1042,7 +925,7 @@ AC_CACHE_CHECK([if $compiler supports -c # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) @@ -1054,13 +937,11 @@ AC_CACHE_CHECK([if $compiler supports -c then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings - $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + if test ! -s out/conftest.err; then _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi - chmod u+w . 2>&AS_MESSAGE_LOG_FD + chmod u+w . $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation @@ -1124,8 +1005,8 @@ AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LI [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_AC_TAGVAR(hardcode_action, $1)= if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ - test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ - test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + test -n "$_LT_AC_TAGVAR(runpath_var $1)" || \ + test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)"="Xyes" ; then # We can hardcode non-existant directories. if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && @@ -1292,7 +1173,7 @@ beos*) shlibpath_var=LIBRARY_PATH ;; -bsdi[[45]]*) +bsdi4*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -1320,8 +1201,7 @@ cygwin* | mingw* | pw32*) dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname' + $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' @@ -1351,7 +1231,7 @@ cygwin* | mingw* | pw32*) ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; @@ -1374,7 +1254,7 @@ darwin* | rhapsody*) soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` @@ -1409,17 +1289,8 @@ kfreebsd*-gnu) dynamic_linker='GNU ld.so' ;; -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[[123]]*) objformat=aout ;; - *) objformat=elf ;; - esac - fi +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) @@ -1437,19 +1308,14 @@ freebsd* | dragonfly*) freebsd2*) shlibpath_overrides_runpath=yes ;; - freebsd3.[[01]]* | freebsdelf3.[[01]]*) + freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; - freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ - freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; - freebsd*) # from 4.6 on - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; esac ;; @@ -1469,7 +1335,7 @@ hpux9* | hpux10* | hpux11*) version_type=sunos need_lib_prefix=no need_version=no - case $host_cpu in + case "$host_cpu" in ia64*) shrext_cmds='.so' hardcode_into_libs=yes @@ -1509,18 +1375,6 @@ hpux9* | hpux10* | hpux11*) postinstall_cmds='chmod 555 $lib' ;; -interix3*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; @@ -1597,7 +1451,7 @@ linux*) # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + lt_ld_extra=`$SED -e 's/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g' /etc/ld.so.conf | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" fi @@ -1659,13 +1513,8 @@ nto-qnx*) openbsd*) version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac + need_version=yes library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH @@ -1703,6 +1552,13 @@ osf3* | osf4* | osf5*) sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + solaris*) version_type=linux need_lib_prefix=no @@ -1728,7 +1584,7 @@ sunos4*) need_version=yes ;; -sysv4 | sysv4.3*) +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' @@ -1761,29 +1617,6 @@ sysv4*MP*) fi ;; -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - shlibpath_overrides_runpath=no - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - shlibpath_overrides_runpath=yes - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -1797,11 +1630,6 @@ uts4*) esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi ])# AC_LIBTOOL_SYS_DYNAMIC_LINKER @@ -1826,9 +1654,6 @@ if test -f "$ltmain" && test -n "$tagnam AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) fi fi - if test -z "$LTCFLAGS"; then - eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" - fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. @@ -1855,9 +1680,7 @@ if test -f "$ltmain" && test -n "$tagnam case $tagname in CXX) - if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then + if test -n "$CXX" && test "X$CXX" != "Xno"; then AC_LIBTOOL_LANG_CXX_CONFIG else tagname="" @@ -1919,7 +1742,7 @@ AC_DEFUN([AC_LIBTOOL_DLOPEN], # AC_LIBTOOL_WIN32_DLL # -------------------- -# declare package support for building win32 DLLs +# declare package support for building win32 dll's AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) ])# AC_LIBTOOL_WIN32_DLL @@ -1957,7 +1780,7 @@ AC_ARG_ENABLE([shared], # AC_DISABLE_SHARED # ----------------- -# set the default shared flag to --disable-shared +#- set the default shared flag to --disable-shared AC_DEFUN([AC_DISABLE_SHARED], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_SHARED(no) @@ -2093,7 +1916,7 @@ dnl not every word. This closes a longs if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then @@ -2203,7 +2026,7 @@ AC_CACHE_VAL(lt_cv_path_LD, if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. + # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; @@ -2349,7 +2163,7 @@ gnu*) hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file - case $host_cpu in + case "$host_cpu" in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so @@ -2365,11 +2179,6 @@ hpux10.20* | hpux11*) esac ;; -interix3*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' - ;; - irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; @@ -2382,6 +2191,15 @@ irix5* | irix6* | nonstopux*) # This must be Linux ELF. linux*) + case $host_cpu in + alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*|x86_64*) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` lt_cv_deplibs_check_method=pass_all ;; @@ -2404,10 +2222,12 @@ nto-qnx*) ;; openbsd*) + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' else - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' fi ;; @@ -2415,11 +2235,15 @@ osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + solaris*) lt_cv_deplibs_check_method=pass_all ;; -sysv4 | sysv4.3*) +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' @@ -2440,13 +2264,10 @@ sysv4 | sysv4.3*) siemens) lt_cv_deplibs_check_method=pass_all ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; esac ;; -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) +sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac @@ -2466,43 +2287,36 @@ AC_DEFUN([AC_PROG_NM], # Let the user override the test. lt_cv_path_NM="$NM" else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/${ac_tool_prefix}nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" break ;; *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags ;; esac - fi - done - IFS="$lt_save_ifs" + esac + fi done + IFS="$lt_save_ifs" test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi]) NM="$lt_cv_path_NM" @@ -2534,13 +2348,13 @@ esac # ----------------------------------- # sets LIBLTDL to the link flags for the libltdl convenience library and # LTDLINCL to the include flags for the libltdl header and adds -# --enable-ltdl-convenience to the configure arguments. Note that -# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, -# it is assumed to be `libltdl'. LIBLTDL will be prefixed with -# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/' -# (note the single quotes!). If your package is not flat and you're not -# using automake, define top_builddir and top_srcdir appropriately in -# the Makefiles. +# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will +# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl case $enable_ltdl_convenience in @@ -2559,13 +2373,13 @@ AC_DEFUN([AC_LIBLTDL_CONVENIENCE], # ----------------------------------- # sets LIBLTDL to the link flags for the libltdl installable library and # LTDLINCL to the include flags for the libltdl header and adds -# --enable-ltdl-install to the configure arguments. Note that -# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, -# and an installed libltdl is not found, it is assumed to be `libltdl'. -# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with -# '${top_srcdir}/' (note the single quotes!). If your package is not -# flat and you're not using automake, define top_builddir and top_srcdir -# appropriately in the Makefiles. +# --enable-ltdl-install to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided and an installed libltdl is not found, it is +# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' +# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single +# quotes!). If your package is not flat and you're not using automake, +# define top_builddir and top_srcdir appropriately in the Makefiles. # In the future, this macro may have to be called after AC_PROG_LIBTOOL. AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl @@ -2603,21 +2417,10 @@ AC_DEFUN([AC_LIBTOOL_CXX], # --------------- AC_DEFUN([_LT_AC_LANG_CXX], [AC_REQUIRE([AC_PROG_CXX]) -AC_REQUIRE([_LT_AC_PROG_CXXCPP]) +AC_REQUIRE([AC_PROG_CXXCPP]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) ])# _LT_AC_LANG_CXX -# _LT_AC_PROG_CXXCPP -# ------------------ -AC_DEFUN([_LT_AC_PROG_CXXCPP], -[ -AC_REQUIRE([AC_PROG_CXX]) -if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - AC_PROG_CXXCPP -fi -])# _LT_AC_PROG_CXXCPP # AC_LIBTOOL_F77 # -------------- @@ -2657,7 +2460,7 @@ _LT_AC_SHELL_INIT([tagnames=${tagnames+$ # AC_LIBTOOL_RC -# ------------- +# -------------- # enable support for Windows resource files AC_DEFUN([AC_LIBTOOL_RC], [AC_REQUIRE([LT_AC_PROG_RC]) @@ -2690,9 +2493,36 @@ lt_simple_link_test_code='int main(){ret _LT_AC_SYS_COMPILER -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE +# +# Check for any special shared library compilation flags. +# +_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= +if test "$GCC" = no; then + case $host_os in + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' + ;; + esac +fi +if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then + AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) + if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[ ]]" >/dev/null; then : + else + AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) + _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no + fi +fi + + +# +# Check to make sure the static flag actually works. +# +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), + $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) + AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) @@ -2702,9 +2532,9 @@ AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_SYS_LIB_STRIP -AC_LIBTOOL_DLOPEN_SELF +AC_LIBTOOL_DLOPEN_SELF($1) -# Report which library types will actually be built +# Report which librarie types wil actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) @@ -2713,7 +2543,7 @@ test "$can_build_shared" = "no" && enabl # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. -case $host_os in +case "$host_os" in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then @@ -2726,6 +2556,43 @@ aix4* | aix5*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi + ;; + darwin* | rhapsody*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi ;; esac AC_MSG_RESULT([$enable_shared]) @@ -2751,7 +2618,7 @@ AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [ AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], [AC_LANG_PUSH(C++) AC_REQUIRE([AC_PROG_CXX]) -AC_REQUIRE([_LT_AC_PROG_CXXCPP]) +AC_REQUIRE([AC_PROG_CXXCPP]) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(allow_undefined_flag, $1)= @@ -2763,7 +2630,6 @@ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= _LT_AC_TAGVAR(hardcode_minus_L, $1)=no -_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= @@ -2781,7 +2647,7 @@ _LT_AC_TAGVAR(postdeps, $1)= _LT_AC_TAGVAR(compiler_lib_search_path, $1)= # Source file extension for C++ test sources. -ac_ext=cpp +ac_ext=cc # Object file extension for compiled C++ test sources. objext=o @@ -2791,15 +2657,11 @@ _LT_AC_TAGVAR(objext, $1)=$objext lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests -lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }\n' +lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD @@ -2810,18 +2672,18 @@ lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else - $as_unset lt_cv_prog_gnu_ld + unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else - $as_unset lt_cv_path_LD + unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC -_LT_CC_BASENAME([$compiler]) +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` # We don't want -fno-exception wen compiling C++ code, so set the # no_builtin_flag separately @@ -2910,7 +2772,6 @@ case $host_os in ;; esac done - ;; esac exp_sym_flag='-bexport' @@ -2929,7 +2790,7 @@ case $host_os in _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GXX" = yes; then - case $host_os in aix4.[[012]]|aix4.[[012]].*) + case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` @@ -2948,12 +2809,8 @@ case $host_os in _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi - ;; esac shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi else # not using gcc if test "$host_cpu" = ia64; then @@ -2980,12 +2837,12 @@ case $host_os in _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX @@ -2994,26 +2851,16 @@ case $host_os in # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes # Exported symbols can be pulled into shared objects from archives - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared libraries. - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; - - beos*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - chorus*) case $cc_basename in *) @@ -3032,7 +2879,7 @@ case $host_os in _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then @@ -3041,81 +2888,70 @@ case $host_os in echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; - darwin* | rhapsody*) - case $host_os in - rhapsody* | darwin1.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - ;; - 10.*) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' - ;; - esac - fi - ;; - esac - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_automatic, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - if test "$GXX" = yes ; then - lt_int_apple_cc_single_mod=no - output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes - fi - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - fi - _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + darwin* | rhapsody*) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' else - case $cc_basename in - xlc*) - output_verbose_link_cmd='echo' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' - _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - ;; - *) - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' + ;; + esac fi - ;; + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; dgux*) case $cc_basename in - ec++*) + ec++) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; - ghcx*) + ghcx) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no @@ -3126,14 +2962,14 @@ case $host_os in ;; esac ;; - freebsd[[12]]*) + freebsd[12]*) # C++ shared libraries reported to be fairly broken before switch to ELF _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; - freebsd* | kfreebsd*-gnu | dragonfly*) + freebsd* | kfreebsd*-gnu) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_AC_TAGVAR(ld_shlibs, $1)=yes @@ -3150,11 +2986,11 @@ case $host_os in # location of the library. case $cc_basename in - CC*) + CC) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; - aCC*) + aCC) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when @@ -3164,7 +3000,7 @@ case $host_os in # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then @@ -3178,22 +3014,33 @@ case $host_os in ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - case $host_cpu in - hppa*64*|ia64*) + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ;; *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi - case $host_cpu in - hppa*64*|ia64*) + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. ;; *) _LT_AC_TAGVAR(hardcode_direct, $1)=yes @@ -3204,17 +3051,14 @@ case $host_os in esac case $cc_basename in - CC*) + CC) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; - aCC*) - case $host_cpu in - hppa*64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + aCC) + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' @@ -3233,12 +3077,9 @@ case $host_os in *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then - case $host_cpu in - hppa*64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + case "$host_cpu" in + ia64*|hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' @@ -3252,25 +3093,11 @@ case $host_os in ;; esac ;; - interix3*) - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; irix5* | irix6*) case $cc_basename in - CC*) + CC) # SGI C++ - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is @@ -3281,7 +3108,7 @@ case $host_os in *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' fi @@ -3294,7 +3121,7 @@ case $host_os in ;; linux*) case $cc_basename in - KCC*) + KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file @@ -3319,41 +3146,17 @@ case $host_os in # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; - icpc*) + icpc) # Intel C++ with_gnu_ld=yes - # version 8.0 and above of icpc choke on multiply defined symbols - # if we add $predep_objects and $postdep_objects, however 7.1 and - # earlier do not add the objects themselves. - case `$CC -V 2>&1` in - *"Version 7."*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 8.0 or newer - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; - pgCC*) - # Portland Group C++ compiler - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' - ;; - cxx*) + cxx) # Compaq C++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' @@ -3384,7 +3187,7 @@ case $host_os in ;; mvs*) case $cc_basename in - cxx*) + cxx) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; @@ -3405,25 +3208,9 @@ case $host_os in # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; - openbsd2*) - # C++ shared libraries are fairly broken - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - openbsd*) - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - fi - output_verbose_link_cmd='echo' - ;; osf3*) case $cc_basename in - KCC*) + KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file @@ -3439,14 +3226,14 @@ case $host_os in _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; - RCC*) + RCC) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; - cxx*) + cxx) _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: @@ -3464,7 +3251,7 @@ case $host_os in *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: @@ -3483,7 +3270,7 @@ case $host_os in ;; osf4* | osf5*) case $cc_basename in - KCC*) + KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file @@ -3498,17 +3285,17 @@ case $host_os in # the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; - RCC*) + RCC) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; - cxx*) + cxx) _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ $rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' @@ -3527,7 +3314,7 @@ case $host_os in *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: @@ -3548,14 +3335,27 @@ case $host_os in # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; + sco*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; sunos4*) case $cc_basename in - CC*) + CC) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; - lcc*) + lcc) # Lucid # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no @@ -3568,33 +3368,36 @@ case $host_os in ;; solaris*) case $cc_basename in - CC*) + CC) # Sun C++ 4.2, 5.x and Centerline C++ - _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The C++ compiler is used as linker so we must use $wl # flag to pass the commands to the underlying system - # linker. We must also pass each convience library through - # to the system linker between allextract/defaultextract. - # The C++ compiler will combine linker options so we - # cannot just pass the convience library names through - # without $wl. + # linker. # Supported since Solaris 2.6 (maybe 2.5.1?) - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - output_verbose_link_cmd='echo' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is @@ -3602,7 +3405,7 @@ case $host_os in # in the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; - gcx*) + gcx) # Green Hills C++ Compiler _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' @@ -3640,63 +3443,12 @@ case $host_os in ;; esac ;; - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - # So that behaviour is only enabled if SCOABSPATH is set to a - # non-empty value in the environment. Most likely only useful for - # creating official distributions of packages. - # This is a hack until libtool officially supports absolute path - # names for shared libraries. - _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac ;; tandem*) case $cc_basename in - NCC*) + NCC) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no @@ -3729,6 +3481,8 @@ AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) AC_LIBTOOL_CONFIG($1) @@ -3746,7 +3500,7 @@ lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld ])# AC_LIBTOOL_LANG_CXX_CONFIG # AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) -# ------------------------------------ +# ------------------------ # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary @@ -3800,7 +3554,7 @@ if AC_TRY_EVAL(ac_compile); then # The `*' in the case matches for architectures that use `case' in # $output_verbose_cmd can trigger glob expansion during the loop # eval without this substitution. - output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"` + output_verbose_link_cmd="`$echo \"X$output_verbose_link_cmd\" | $Xsed -e \"$no_glob_subst\"`" for p in `eval $output_verbose_link_cmd`; do case $p in @@ -3876,37 +3630,13 @@ fi $rm -f confest.$objext -# PORTME: override above test on systems where it is broken -ifelse([$1],[CXX], -[case $host_os in -interix3*) - # Interix 3.5 installs completely hosed .la files for C++, so rather than - # hack all around it, let's just trust "g++" to DTRT. - _LT_AC_TAGVAR(predep_objects,$1)= - _LT_AC_TAGVAR(postdep_objects,$1)= - _LT_AC_TAGVAR(postdeps,$1)= - ;; - -solaris*) - case $cc_basename in - CC*) - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - _LT_AC_TAGVAR(postdeps,$1)='-lCstd -lCrun' - ;; - esac - ;; -esac -]) - case " $_LT_AC_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac ])# AC_LIBTOOL_POSTDEP_PREDEP # AC_LIBTOOL_LANG_F77_CONFIG -# -------------------------- +# ------------------------ # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. @@ -3950,16 +3680,12 @@ lt_simple_link_test_code=" program # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${F77-"f77"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC -_LT_CC_BASENAME([$compiler]) +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) @@ -3969,7 +3695,7 @@ test "$can_build_shared" = "no" && enabl # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. -case $host_os in +case "$host_os" in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then @@ -3978,9 +3704,7 @@ aix3*) fi ;; aix4* | aix5*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi + test "$enable_shared" = yes && enable_static=no ;; esac AC_MSG_RESULT([$enable_shared]) @@ -3990,6 +3714,8 @@ AC_MSG_CHECKING([whether to build static test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + _LT_AC_TAGVAR(GCC, $1)="$G77" _LT_AC_TAGVAR(LD, $1)="$LD" @@ -3999,6 +3725,8 @@ AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP + AC_LIBTOOL_CONFIG($1) @@ -4027,27 +3755,20 @@ _LT_AC_TAGVAR(objext, $1)=$objext lt_simple_compile_test_code="class foo {}\n" # Code to be used in simple link tests -lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }\n' +lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${GCJ-"gcj"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC -_LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds - AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) @@ -4055,6 +3776,8 @@ AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) AC_LIBTOOL_CONFIG($1) @@ -4064,7 +3787,7 @@ CC="$lt_save_CC" # AC_LIBTOOL_LANG_RC_CONFIG -# ------------------------- +# -------------------------- # Ensure that the configuration vars for the Windows resource compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. @@ -4088,16 +3811,11 @@ lt_simple_link_test_code="$lt_simple_com # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${RC-"windres"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC -_LT_CC_BASENAME([$compiler]) _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes AC_LIBTOOL_CONFIG($1) @@ -4127,7 +3845,7 @@ if test -f "$ltmain"; then # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ @@ -4233,7 +3951,7 @@ ifelse([$1], [], # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a @@ -4244,11 +3962,11 @@ ifelse([$1], [], SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="$SED -e 1s/^X//" +Xsed="$SED -e s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH +if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi # The names of the tagged configurations supported by this script. available_tags= @@ -4279,12 +3997,6 @@ fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo @@ -4296,9 +4008,6 @@ AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC -# LTCC compiler flags. -LTCFLAGS=$lt_LTCFLAGS - # A language-specific compiler. CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) @@ -4364,7 +4073,7 @@ max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) -# Must we lock files when doing compilation? +# Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? @@ -4638,6 +4347,9 @@ symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + # Transform an extracted symbol line into a proper C declaration lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" @@ -4659,31 +4371,15 @@ hpux*) # Its linker distinguishes data f lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; -linux*) - if test "$host_cpu" = ia64; then - symcode='[[ABCDGIRSTW]]' - lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" - fi - ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; -solaris*) +solaris* | sysv5*) symcode='[[BDRT]]' ;; -sco3.2v5*) - symcode='[[DT]]' - ;; -sysv4.2uw2*) - symcode='[[DT]]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[[ABDT]]' - ;; sysv4) symcode='[[DFNSTU]]' ;; @@ -4706,11 +4402,8 @@ esac # Try without a prefix undercore, then with it. for ac_symprfx in "" "_"; do - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - # Write the raw and C identifiers. - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no @@ -4866,10 +4559,6 @@ AC_MSG_CHECKING([for $compiler option to # DJGPP does not support shared libraries at all _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ;; - interix3*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic @@ -4878,7 +4567,7 @@ AC_MSG_CHECKING([for $compiler option to hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. - case $host_cpu in + case "$host_cpu" in hppa*64*|ia64*) ;; *) @@ -4903,28 +4592,18 @@ AC_MSG_CHECKING([for $compiler option to ;; chorus*) case $cc_basename in - cxch68*) + cxch68) # Green Hills C++ Compiler # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; - darwin*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - case $cc_basename in - xlc*) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - ;; - esac - ;; dgux*) case $cc_basename in - ec++*) + ec++) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; - ghcx*) + ghcx) # Green Hills C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; @@ -4932,22 +4611,22 @@ AC_MSG_CHECKING([for $compiler option to ;; esac ;; - freebsd* | kfreebsd*-gnu | dragonfly*) + freebsd* | kfreebsd*-gnu) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in - CC*) + CC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" if test "$host_cpu" != ia64; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; - aCC*) + aCC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - case $host_cpu in + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; @@ -4960,13 +4639,9 @@ AC_MSG_CHECKING([for $compiler option to ;; esac ;; - interix*) - # This is c89, which is MS Visual C++ (no shared libs) - # Anyone wants to do a port? - ;; irix5* | irix6* | nonstopux*) case $cc_basename in - CC*) + CC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. @@ -4977,24 +4652,18 @@ AC_MSG_CHECKING([for $compiler option to ;; linux*) case $cc_basename in - KCC*) + KCC) # KAI C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; - icpc* | ecpc*) + icpc) # Intel C++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; - pgCC*) - # Portland Group C++ compiler. - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - cxx*) + cxx) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. @@ -5011,7 +4680,7 @@ AC_MSG_CHECKING([for $compiler option to ;; mvs*) case $cc_basename in - cxx*) + cxx) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) @@ -5022,14 +4691,14 @@ AC_MSG_CHECKING([for $compiler option to ;; osf3* | osf4* | osf5*) case $cc_basename in - KCC*) + KCC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; - RCC*) + RCC) # Rational C++ 2.4.1 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; - cxx*) + cxx) # Digital/Compaq C++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha @@ -5043,15 +4712,24 @@ AC_MSG_CHECKING([for $compiler option to ;; psos*) ;; + sco*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + *) + ;; + esac + ;; solaris*) case $cc_basename in - CC*) + CC) # Sun C++ 4.2, 5.x and Centerline C++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; - gcx*) + gcx) # Green Hills C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; @@ -5061,12 +4739,12 @@ AC_MSG_CHECKING([for $compiler option to ;; sunos4*) case $cc_basename in - CC*) + CC) # Sun C++ 4.x _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; - lcc*) + lcc) # Lucid _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; @@ -5076,7 +4754,7 @@ AC_MSG_CHECKING([for $compiler option to ;; tandem*) case $cc_basename in - NCC*) + NCC) # NonStop-UX NCC 3.20 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; @@ -5084,14 +4762,7 @@ AC_MSG_CHECKING([for $compiler option to ;; esac ;; - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - case $cc_basename in - CC*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - esac + unixware*) ;; vxworks*) ;; @@ -5138,11 +4809,6 @@ AC_MSG_CHECKING([for $compiler option to _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; - interix3*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. @@ -5159,7 +4825,7 @@ AC_MSG_CHECKING([for $compiler option to hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. - case $host_cpu in + case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; @@ -5185,16 +4851,6 @@ AC_MSG_CHECKING([for $compiler option to _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; - darwin*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - case $cc_basename in - xlc*) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - ;; - esac - ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being @@ -5206,7 +4862,7 @@ AC_MSG_CHECKING([for $compiler option to _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. - case $host_cpu in + case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; @@ -5230,19 +4886,12 @@ AC_MSG_CHECKING([for $compiler option to ;; linux*) - case $cc_basename in + case $CC in icc* | ecc*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; - pgcc* | pgf77* | pgf90* | pgf95*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; ccc*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. @@ -5257,15 +4906,15 @@ AC_MSG_CHECKING([for $compiler option to _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' + ;; + solaris*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - case $cc_basename in - f77* | f90* | f95*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; - *) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; - esac ;; sunos4*) @@ -5274,7 +4923,7 @@ AC_MSG_CHECKING([for $compiler option to _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; - sysv4 | sysv4.2uw2* | sysv4.3*) + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' @@ -5287,17 +4936,6 @@ AC_MSG_CHECKING([for $compiler option to fi ;; - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - unicos*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - uts4*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' @@ -5325,7 +4963,7 @@ if test -n "$_LT_AC_TAGVAR(lt_prog_compi [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi -case $host_os in +case "$host_os" in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= @@ -5334,16 +4972,6 @@ case $host_os in _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" ;; esac - -# -# Check to make sure the static flag actually works. -# -wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\" -AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], - _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), - $lt_tmp_static_flag, - [], - [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) ]) @@ -5368,7 +4996,7 @@ ifelse([$1],[CXX],[ _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw*) - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([[^ ]]*\) [[^ ]]*/\1 DATA/;/^I /d;/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' ;; *) _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' @@ -5411,8 +5039,7 @@ ifelse([$1],[CXX],[ # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= - # Just being paranoid about ensuring that cc_basename is set. - _LT_CC_BASENAME([$compiler]) + case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time @@ -5422,10 +5049,6 @@ ifelse([$1],[CXX],[ with_gnu_ld=no fi ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; openbsd*) with_gnu_ld=no ;; @@ -5436,27 +5059,6 @@ ifelse([$1],[CXX],[ # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= - fi - supports_anon_versioning=no - case `$LD -v 2>/dev/null` in - *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) @@ -5507,10 +5109,10 @@ EOF _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then @@ -5519,55 +5121,9 @@ EOF echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - interix3*) - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - linux*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - tmp_addflag= - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - esac - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test $supports_anon_versioning = yes; then - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - $echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else - _LT_AC_TAGVAR(ld_shlibs, $1)=no + ld_shlibs=no fi ;; @@ -5581,7 +5137,7 @@ EOF fi ;; - solaris*) + solaris* | sysv5*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <&2 @@ -5602,33 +5158,6 @@ EOF fi ;; - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) - _LT_AC_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - sunos4*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= @@ -5636,6 +5165,31 @@ _LT_EOF _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="$tmp_archive_cmds" + fi + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' @@ -5646,11 +5200,16 @@ _LT_EOF ;; esac - if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then - runpath_var= - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi fi else # PORTME fill in a description of your system's linker (not GNU ld) @@ -5662,7 +5221,7 @@ _LT_EOF # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + if test "$GCC" = yes && test -z "$link_static_flag"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported @@ -5696,7 +5255,6 @@ _LT_EOF break fi done - ;; esac exp_sym_flag='-bexport' @@ -5715,7 +5273,7 @@ _LT_EOF _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GCC" = yes; then - case $host_os in aix4.[[012]]|aix4.[[012]].*) + case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` @@ -5734,12 +5292,8 @@ _LT_EOF _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi - ;; esac shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi else # not using gcc if test "$host_cpu" = ia64; then @@ -5747,11 +5301,11 @@ _LT_EOF # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else - if test "$aix_use_runtimelinking" = yes; then + if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' - fi + fi fi fi @@ -5765,12 +5319,12 @@ _LT_EOF # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX @@ -5779,11 +5333,13 @@ _LT_EOF # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes # Exported symbols can be pulled into shared objects from archives - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared libraries. - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; @@ -5796,7 +5352,7 @@ _LT_EOF _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; - bsdi[[45]]*) + bsdi4*) _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; @@ -5817,57 +5373,57 @@ _LT_EOF _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' - _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' + fix_srcfile_path='`cygpath -w "$srcfile"`' _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; darwin* | rhapsody*) - case $host_os in - rhapsody* | darwin1.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - ;; - 10.*) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' - ;; - esac - fi - ;; - esac + if test "$GXX" = yes ; then _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - if test "$GCC" = yes ; then - output_verbose_link_cmd='echo' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else - case $cc_basename in - xlc*) - output_verbose_link_cmd='echo' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' - _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - ;; - *) - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac + _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; @@ -5901,7 +5457,7 @@ _LT_EOF ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | kfreebsd*-gnu | dragonfly*) + freebsd* | kfreebsd*-gnu) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes @@ -5924,62 +5480,47 @@ _LT_EOF _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; - hpux10*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - fi - ;; - - hpux11*) + hpux10* | hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) + case "$host_cpu" in + hppa*64*|ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; - ia64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else - case $host_cpu in - hppa*64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ;; *) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; esac fi if test "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - case $host_cpu in - hppa*64*|ia64*) + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' @@ -6027,7 +5568,6 @@ _LT_EOF _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else @@ -6073,7 +5613,7 @@ _LT_EOF _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ - $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' @@ -6081,15 +5621,21 @@ _LT_EOF _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; + sco3.2v5*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + solaris*) _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' if test "$GCC" = yes; then - wlarc='${wl}' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else - wlarc='' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' @@ -6098,18 +5644,8 @@ _LT_EOF _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - # The compiler driver will combine linker options so we - # cannot just pass the convience library names through - # without $wl, iff we do not link with $LD. - # Luckily, gcc supports the same syntax we need for Sun Studio. - # Supported since Solaris 2.6 (maybe 2.5.1?) - case $wlarc in - '') - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; - *) - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; - esac ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; @@ -6166,45 +5702,36 @@ _LT_EOF fi ;; - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7*) - _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + sysv4.2uw2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var='LD_RUN_PATH' + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' if test "$GCC" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' fi + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + sysv5*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - fi ;; uts4*) @@ -6222,6 +5749,11 @@ _LT_EOF AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + # # Do we need to explicitly link libc? # @@ -6249,7 +5781,6 @@ x|xyes) libobjs=conftest.$ac_objext deplibs= wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) - pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= @@ -6375,7 +5906,7 @@ lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do - test ! -f $lt_ac_sed && continue + test ! -f $lt_ac_sed && break cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in @@ -6400,16 +5931,28 @@ for lt_ac_sed in $lt_ac_sed_list /usr/xp fi done done -]) SED=$lt_cv_path_SED +]) AC_MSG_RESULT([$SED]) ]) -# Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. +# -*- Autoconf -*- +# Copyright (C) 2002, 2003 Free Software Foundation, Inc. +# Generated from amversion.in; do not edit by hand. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- @@ -6422,17 +5965,28 @@ AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api # Call AM_AUTOMAKE_VERSION so it can be traced. # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], - [AM_AUTOMAKE_VERSION([1.9.6])]) + [AM_AUTOMAKE_VERSION([1.9.2])]) -# Figure out how to run the assembler. -*- Autoconf -*- +# Figure out how to run the assembler. -*- Autoconf -*- -# Copyright (C) 2001, 2003, 2004, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. +# serial 3 -# serial 4 +# Copyright (C) 2001, 2003, 2004 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. # AM_PROG_AS # ---------- @@ -6445,13 +5999,24 @@ AC_ARG_VAR([CCAS], [assembler compi AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)]) ]) -# AM_AUX_DIR_EXPAND -*- Autoconf -*- +# AM_AUX_DIR_EXPAND -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. +# Copyright (C) 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to @@ -6498,16 +6063,26 @@ AC_PREREQ([2.50])dnl am_aux_dir=`cd $ac_aux_dir && pwd` ]) -# AM_CONDITIONAL -*- Autoconf -*- +# AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. +# Copyright (C) 1997, 2000, 2001, 2003, 2004 Free Software Foundation, Inc. -# serial 7 +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 6 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- @@ -6531,15 +6106,26 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) +# serial 7 -*- Autoconf -*- -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 # Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. -# serial 8 +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, @@ -6548,6 +6134,7 @@ fi])]) # CC etc. in the Makefile, will ask for an AC_PROG_CC use... + # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. @@ -6687,16 +6274,27 @@ AM_CONDITIONAL([AMDEP], [test "x$enable_ AC_SUBST([AMDEPBACKSLASH]) ]) -# Generate code to set up dependency tracking. -*- Autoconf -*- +# Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 +# Free Software Foundation, Inc. -#serial 3 +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +#serial 2 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ @@ -6755,31 +6353,54 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS] [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. +# Like AC_CONFIG_HEADER, but automatically create stamp file. -*- Autoconf -*- -# serial 8 +# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 7 # AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) -# Do all the work for Automake. -*- Autoconf -*- +# Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +# This macro actually does too much some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 # Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. -# serial 12 +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. -# This macro actually does too much. Some checks are only needed if -# your package does certain things. But this isn't really a big deal. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 11 # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) @@ -6881,27 +6502,51 @@ for _am_header in $config_headers :; do done echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. + +# Copyright (C) 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl install_sh=${install_sh-"$am_aux_dir/install-sh"} AC_SUBST(install_sh)]) -# Copyright (C) 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. +# -*- Autoconf -*- +# Copyright (C) 2003 Free Software Foundation, Inc. -# serial 2 +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 1 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. @@ -6916,15 +6561,26 @@ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) -# Check to see how 'make' treats includes. -*- Autoconf -*- +# Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. +# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. -# serial 3 +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 2 # AM_MAKE_INCLUDE() # ----------------- @@ -6968,16 +6624,27 @@ AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) -# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- +# -*- Autoconf -*- -# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. -# serial 4 +# Copyright (C) 1997, 1999, 2000, 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ @@ -7003,16 +6670,27 @@ else fi ]) -# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - # AM_PROG_MKDIR_P # --------------- # Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. -# + +# Copyright (C) 2003, 2004 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + # Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories # created by `make install' are always world readable, even if the # installer happens to have an overly restrictive umask (e.g. 077). @@ -7066,15 +6744,26 @@ else fi AC_SUBST([mkdir_p])]) -# Helper functions for option handling. -*- Autoconf -*- +# Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. +# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. -# serial 3 +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 2 # _AM_MANGLE_OPTION(NAME) # ----------------------- @@ -7099,16 +6788,28 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Check to make sure that the build environment is sane. -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 -# Free Software Foundation, Inc. # -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. +# Check to make sure that the build environment is sane. +# -# serial 4 +# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 # AM_SANITY_CHECK # --------------- @@ -7151,14 +6852,25 @@ Check your system clock]) fi AC_MSG_RESULT(yes)]) -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - # AM_PROG_INSTALL_STRIP -# --------------------- + +# Copyright (C) 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip @@ -7181,13 +6893,25 @@ AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. +# Copyright (C) 2004 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 1 -# serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- --- orig/configure.in 2007-07-04 22:06:08.000000000 +0900 +++ new/configure.in 2007-10-29 10:14:31.000000000 +0900 @@ -784,6 +784,111 @@ MYSQL_SYS_LARGEFILE # Types that must be checked AFTER large file support is checked AC_TYPE_SIZE_T +# For senna +MECAB_INCLUDES= +MECAB_LIBS= + +AC_ARG_WITH(mecab, +[ --with-mecab[=DIR] Specify install prefix of mecab], [ + if test "$withval" = "yes"; then + MECAB_PREFIX="" + else + MECAB_PREFIX="$withval" + fi + AC_DEFINE([ENABLE_MECAB], [1], [Define to 1 if MeCab is enabled]) + + if test -z "$MECAB_PREFIX"; then + if eval 'mecab-config --prefix 2>&1 >/dev/null'; then + MECAB_CONFIG='mecab-config' + MECAB_PREFIX='mecab-config --prefix' + MECAB_INCLUDES="`\"$MECAB_CONFIG\" --cflags`" + MECAB_LIBS="${LDFLAGS} `\"$MECAB_CONFIG\" --libs`" + fi + else + MECAB_CONFIG="$MECAB_PREFIX/bin/mecab-config" + + if test -x "$MECAB_CONFIG"; then + MECAB_INCLUDES="`\"$MECAB_CONFIG\" --cflags`" + MECAB_LIBS="`\"$MECAB_CONFIG\" --libs`" + else + MECAB_INCLUDES="-I$MECAB_PREFIX/include" + MECAB_LIBS="-L$MECAB_PREFIX/lib" + fi + fi +], [ + MECAB_PREFIX="" +]) + +_CPPFLAGS="${CPPFLAGS}" +_LIBS="${LIBS}" +CPPFLAGS="${CPPFLAGS} ${MECAB_INCLUDES}" +LIBS="${LIBS} ${MECAB_LIBS}" + +AC_CHECK_FUNC(mecab_new, [ + AC_DEFINE([HAVE_MECAB], [1], [Define to 1 if libmecab is available]) + HAVE_MECAB=1 +], [ + HAVE_MECAB= + MECAB_INCLUDES= + MECAB_LIBS= +]) + +CPPFLAGS="${_CPPFLAGS}" +LIBS="${_LIBS}" + +AC_SUBST(MECAB_INCLUDES) +AC_SUBST(MECAB_LIBS) + +SENNA_INCLUDES= +SENNA_LIBS= + +AC_ARG_WITH(senna, +[ --with-senna[=DIR] Enable Senna fulltext search support], [ + case "$withval" in + no) : ;; + yes|*) + if test "$withval" = "yes"; then + if eval 'senna-cfg --cflags 2>&1 >/dev/null'; then + SENNA_CFG="senna-cfg" + SENNA_PREFIX="senna-cfg --prefix" + SENNA_INCLUDES="`\"$SENNA_CFG\" --cflags` $MECAB_INCLUDES" + SENNA_LIBS="`\"$SENNA_CFG\" --libs` -lsenna $MECAB_LIBS" + else + SENNA_INCLUDES="$MECAB_INCLUDES" + SENNA_LIBS="-lsenna $MECAB_LIBS" + fi + else + SENNA_PREFIX="$withval" + SENNA_CFG="$SENNA_PREFIX/bin/senna-cfg" + if test -x "$SENNA_CFG"; then + SENNA_INCLUDES="`\"$SENNA_CFG\" --cflags` $MECAB_INCLUDES" + SENNA_LIBS="`\"$SENNA_CFG\" --libs` -lsenna $MECAB_LIBS" + else + SENNA_INCLUDES="-I$SENNA_PREFIX/include $MECAB_INCLUDES" + SENNA_LIBS="-L$SENNA_PREFIX/lib -lsenna $MECAB_LIBS" + fi + fi + + _CPPFLAGS="${CPPFLAGS}" + _LIBS="${LIBS}" + CPPFLAGS="${CPPFLAGS} ${SENNA_INCLUDES}" + LIBS="${LIBS} ${SENNA_LIBS}" + + AC_CHECK_FUNC(sen_init, [ + AC_DEFINE([ENABLE_SENNA], [1], [Define to 1 if Senna is enabled]) + ], [ + AC_MSG_ERROR([Could not find libsenna. Check your Senna installation.]) + ]) + + CPPFLAGS="${_CPPFLAGS}" + LIBS="${_LIBS}" + ;; + esac +]) + +AC_SUBST([SENNA_INCLUDES]) +AC_SUBST([SENNA_LIBS]) + #-------------------------------------------------------------------- # Check for system header files #-------------------------------------------------------------------- --- orig/include/my_base.h 2007-07-04 22:06:10.000000000 +0900 +++ new/include/my_base.h 2007-10-29 10:14:01.000000000 +0900 @@ -323,6 +323,34 @@ enum ha_base_keytype { update handler::auto_increment_value */ #define HA_STATUS_AUTO 64 +/* + get the information about senna fulltext key +*/ +#ifdef ENABLE_SENNA +#define HA_STATUS_SENNA (1 << 31) +#endif + +/* + The following defines are for senna.2ind patch. +*/ +#ifdef ENABLE_SENNA +#define SENNA_USE_2IND (1 << 0) +#define SENNA_MATCH (1 << 1) +#define SENNA_FILESORT (1 << 2) +#define SENNA_DO_READ_RECORD (1 << 3) +#define SENNA_IF_READ_RECORD (1 << 4) +#define SENNA_DISTINCT (1 << 5) +#define SENNA_FIRST_CALL (1 << 6) +#endif + +/* + create table or like or truncate +*/ +#ifdef ENABLE_SENNA +#define SENNA_CREATE_TABLE 0 +#define SENNA_CREATE_TABLE_LIKE (1 << 0) +#define SENNA_TRUNCATE_TABLE (1 << 1) +#endif /* Errorcodes given by functions */ --- orig/include/my_pthread.h 2007-07-04 22:06:05.000000000 +0900 +++ new/include/my_pthread.h 2007-10-29 10:14:01.000000000 +0900 @@ -759,6 +759,10 @@ struct st_my_thread_var gptr dbug; char name[THREAD_NAME_SIZE+1]; #endif +#ifdef ENABLE_SENNA /* nkjm SFID:10294 */ + int sen_flags; + uint sen_connection_id; +#endif /* nkjm SFID:10294 */ }; extern struct st_my_thread_var *_my_thread_var(void) __attribute__ ((const)); --- orig/include/myisam.h 2007-07-04 22:05:51.000000000 +0900 +++ new/include/myisam.h 2007-10-29 10:14:01.000000000 +0900 @@ -32,6 +32,12 @@ extern "C" { #endif #include "my_handler.h" +#ifdef ENABLE_SENNA +#include +#define SEN_DISABLE_SENNA 0x80000000 /* Don't use Senna fulltext search engine */ +extern sen_logger_info senna_logger; +#endif /* ENABLE_SENNA */ + /* There is a hard limit for the maximum number of keys as there are only 8 bits in the index file header for the number of keys in a table. @@ -198,6 +204,18 @@ typedef struct st_mi_keydef /* Key defi uint32 version; /* For concurrent read/write */ HA_KEYSEG *seg,*end; +#ifdef ENABLE_SENNA + int senna_flags; + int senna_initial_n_segments; + uint senna_keys_size; + uint senna_keys_file_size; + uint senna_lexicon_size; + uint senna_lexicon_file_size; + uint senna_inv_seg_size; + uint senna_inv_chunk_size; + sen_index *senna; + sen_encoding senna_encoding; +#endif /* ENABLE_SENNA */ int (*bin_search)(struct st_myisam_info *info,struct st_mi_keydef *keyinfo, uchar *page,uchar *key, uint key_len,uint comp_flag,uchar * *ret_pos, --- orig/libmysqld/Makefile.am 2007-07-04 22:06:49.000000000 +0900 +++ new/libmysqld/Makefile.am 2007-10-29 10:14:23.000000000 +0900 @@ -30,7 +30,8 @@ INCLUDES= @bdb_includes@ @innodb_inclu -I$(top_builddir)/sql -I$(top_srcdir)/sql \ -I$(top_srcdir)/sql/examples \ -I$(top_srcdir)/regex \ - $(openssl_includes) @ZLIB_INCLUDES@ + $(openssl_includes) @ZLIB_INCLUDES@ \ + @SENNA_INCLUDES@ @MECAB_INCLUDES@ noinst_LIBRARIES = libmysqld_int.a pkglib_LIBRARIES = libmysqld.a --- orig/libmysqld/examples/Makefile.am 2007-07-04 22:06:59.000000000 +0900 +++ new/libmysqld/examples/Makefile.am 2007-10-29 10:14:23.000000000 +0900 @@ -34,7 +34,8 @@ DEFS = -DEMBEDDED_LIBRARY INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(srcdir) \ -I$(top_srcdir) -I$(top_srcdir)/client -I$(top_srcdir)/regex \ $(openssl_includes) -LIBS = @LIBS@ @WRAPLIBS@ @CLIENT_LIBS@ $(yassl_libs) +LIBS = @LIBS@ @WRAPLIBS@ @CLIENT_LIBS@ $(yassl_libs) \ + @SENNA_LIBS@ @MECAB_LIBS@ LDADD = @CLIENT_EXTRA_LDFLAGS@ ../libmysqld.a @innodb_system_libs@ @LIBDL@ $(CXXLDFLAGS) \ @NDB_SCI_LIBS@ --- orig/libmysqld/filesort.cc 2007-07-04 22:06:16.000000000 +0900 +++ new/libmysqld/filesort.cc 2007-10-29 10:14:23.000000000 +0900 @@ -1307,6 +1307,9 @@ sortlength(THD *thd, SORT_FIELD *sortord } if (sortorder->field->maybe_null()) length++; // Place for NULL marker +#ifdef ENABLE_SENNA + my_thread_var->sen_flags |= SENNA_FILESORT; +#endif /* ENABLE_SENNA */ } else { --- orig/libmysqld/ha_myisam.cc 2007-07-04 22:06:09.000000000 +0900 +++ new/libmysqld/ha_myisam.cc 2007-10-29 10:14:23.000000000 +0900 @@ -120,6 +120,27 @@ static void mi_check_print_msg(MI_CHECK return; } +#ifdef ENABLE_SENNA +static sen_encoding senna_enc_type(const char *csname) +{ + if (!my_strcasecmp(system_charset_info, csname, "latin1")) + return sen_enc_latin1; + else if (!my_strcasecmp(system_charset_info, csname, "utf8")) + return sen_enc_utf8; + else if (!my_strcasecmp(system_charset_info, csname, "cp932")) + return sen_enc_sjis; + else if (!my_strcasecmp(system_charset_info, csname, "sjis")) + return sen_enc_sjis; + else if (!my_strcasecmp(system_charset_info, csname, "eucjpms")) + return sen_enc_euc_jp; + else if (!my_strcasecmp(system_charset_info, csname, "ujis")) + return sen_enc_euc_jp; + else if (!my_strcasecmp(system_charset_info, csname, "koi8r")) + return sen_enc_koi8r; + else + return sen_enc_default; +} +#endif /* Convert TABLE object to MyISAM key and column definition @@ -166,6 +187,19 @@ int table2myisam(TABLE *table_arg, MI_KE for (i= 0; i < share->keys; i++, pos++) { keydef[i].flag= (pos->flags & (HA_NOSAME | HA_FULLTEXT | HA_SPATIAL)); +#ifdef ENABLE_SENNA + if ((keydef[i].flag & HA_FULLTEXT)) { + if (table_arg->key_info) { + keydef[i].senna_flags=pos->senna_flags; + keydef[i].senna_initial_n_segments=pos->senna_initial_n_segments; + keydef[i].senna_encoding=pos->senna_encoding ? + senna_enc_type(pos->senna_encoding) : sen_enc_default; + } else { + keydef[i].senna_flags=SEN_DISABLE_SENNA; + keydef[i].senna_initial_n_segments=0; + } + } +#endif /* ENABLE_SENNA */ keydef[i].key_alg= pos->algorithm == HA_KEY_ALG_UNDEF ? (pos->flags & HA_SPATIAL ? HA_KEY_ALG_RTREE : HA_KEY_ALG_BTREE) : pos->algorithm; @@ -453,7 +487,6 @@ int check_definition(MI_KEYDEF *t1_keyin DBUG_RETURN(0); } - extern "C" { volatile int *killed_ptr(MI_CHECK *param) @@ -525,9 +558,12 @@ const char **ha_myisam::bas_ext() const const char *ha_myisam::index_type(uint key_number) { - return ((table->key_info[key_number].flags & HA_FULLTEXT) ? - "FULLTEXT" : - (table->key_info[key_number].flags & HA_SPATIAL) ? + if (table->key_info[key_number].flags & HA_FULLTEXT) + { + return "FULLTEXT"; + } + else + return ((table->key_info[key_number].flags & HA_SPATIAL) ? "SPATIAL" : (table->key_info[key_number].algorithm == HA_KEY_ALG_RTREE) ? "RTREE" : @@ -1663,6 +1699,38 @@ int ha_myisam::info(uint flag) delete_length= misam_info.delete_length; check_time= misam_info.check_time; mean_rec_length= misam_info.mean_reclength; +#ifdef ENABLE_SENNA + if (flag & HA_STATUS_SENNA) { + int i; + for (i = 0; i < table->s->keys; i++) { + KEY *key = &table->key_info[i]; + MI_KEYDEF *mi_keydef = &file->s->keyinfo[i]; + sen_index *senna = mi_keydef->senna; + if (senna) { + key->senna_flags = mi_keydef->senna_flags; + key->senna_initial_n_segments = mi_keydef->senna_initial_n_segments; + key->senna_keys_size = mi_keydef->senna_keys_size; + key->senna_keys_file_size = mi_keydef->senna_keys_file_size; + key->senna_lexicon_size = mi_keydef->senna_lexicon_size; + key->senna_lexicon_file_size = mi_keydef->senna_lexicon_file_size; + key->senna_inv_seg_size = mi_keydef->senna_inv_seg_size; + key->senna_inv_chunk_size = mi_keydef->senna_inv_chunk_size; + + if (mi_keydef->senna_encoding == sen_enc_utf8) { + key->senna_encoding = "utf8"; + } else if (mi_keydef->senna_encoding == sen_enc_sjis) { + key->senna_encoding = "sjis"; + } else if (mi_keydef->senna_encoding == sen_enc_euc_jp) { + key->senna_encoding = "euc_jp"; + } else if (mi_keydef->senna_encoding == sen_enc_latin1) { + key->senna_encoding = "latin1"; + } else if (mi_keydef->senna_encoding == sen_enc_koi8r) { + key->senna_encoding = "koi8r"; + } + } + } + } +#endif /* ENABLE_SENNA */ } if (flag & HA_STATUS_CONST) { @@ -1787,8 +1855,36 @@ int ha_myisam::create(const char *name, TABLE_SHARE *share= table->s; uint options= share->db_options_in_use; DBUG_ENTER("ha_myisam::create"); +#ifdef ENABLE_SENNA + if ((ha_create_info->query_type == SENNA_CREATE_TABLE)) + { + int i; + for (i=0; i < share->keys; i++) + { + if ((ha_create_info->key_info[i].flags & HA_FULLTEXT)) + { + table_arg->key_info[i].senna_flags = ha_create_info->key_info[i].senna_flags; + table_arg->key_info[i].senna_initial_n_segments = ha_create_info->key_info[i].senna_initial_n_segments; + table_arg->key_info[i].senna_encoding = ha_create_info->key_info[i].senna_encoding; + } + } + } + else if ((ha_create_info->query_type == SENNA_TRUNCATE_TABLE) && file) /* file check for restore table */ + { + table_arg->file->open(name,0,0); + table_arg->file->info(HA_STATUS_VARIABLE | HA_STATUS_SENNA); + } + else if ((ha_create_info->query_type == SENNA_CREATE_TABLE_LIKE)) + { + SEN_LOG(sen_log_warning, "ha_myisam::create: create table %s like ... may lost senna extention", name); + } +#endif /* ENABLE_SENNA */ if ((error= table2myisam(table_arg, &keydef, &recinfo, &records))) DBUG_RETURN(error); /* purecov: inspected */ +#ifdef ENABLE_SENNA + if ((ha_create_info->query_type == SENNA_TRUNCATE_TABLE) && file) + table_arg->file->close(); +#endif bzero((char*) &create_info, sizeof(create_info)); create_info.max_rows= share->max_rows; create_info.reloc_rows= share->min_rows; @@ -1921,4 +2017,3 @@ uint ha_myisam::checksum() const { return (uint)file->state->checksum; } - --- orig/libmysqld/item_cmpfunc.cc 2007-07-04 22:06:40.000000000 +0900 +++ new/libmysqld/item_cmpfunc.cc 2007-10-29 10:14:23.000000000 +0900 @@ -3162,6 +3162,22 @@ bool Item_func_in::nulls_in_row() return 0; } +#ifdef ENABLE_SENNA +bool +Item_cond::needs_record() +{ + List_iterator_fast li(list); + Item *item; + while ((item=li++)) + { + if (item->needs_record()) + { + return true; + } + } + return false; +} +#endif /* ENABLE_SENNA */ /* Perform context analysis of an IN item tree --- orig/libmysqld/item_func.cc 2007-07-04 22:06:50.000000000 +0900 +++ new/libmysqld/item_func.cc 2007-10-29 10:14:23.000000000 +0900 @@ -4969,7 +4969,11 @@ bool Item_func_match::fix_index() for (keynr=0 ; keynr < table->s->keys ; keynr++) { if ((table->key_info[keynr].flags & HA_FULLTEXT) && - (table->s->keys_in_use.is_set(keynr))) + ((table->keys_in_use_for_query.is_set(keynr)) +#ifdef ENABLE_SENNA + || my_thread_var->sen_flags +#endif /* ENABLE_SENNA */ + )) { ft_to_key[fts]=keynr; ft_cnt[fts]=0; --- orig/libmysqld/item_sum.cc 2007-07-04 22:06:49.000000000 +0900 +++ new/libmysqld/item_sum.cc 2007-10-29 10:14:23.000000000 +0900 @@ -2451,6 +2451,9 @@ bool Item_sum_count_distinct::setup(THD return TRUE; /* Create a table with an unique key over all parameters */ +#ifdef ENABLE_SENNA + my_thread_var->sen_flags |= SENNA_DISTINCT; +#endif /* ENABLE_SENNA */ for (uint i=0; i < arg_count ; i++) { Item *item=args[i]; --- orig/libmysqld/records.cc 2007-07-04 22:06:26.000000000 +0900 +++ new/libmysqld/records.cc 2007-10-29 10:14:23.000000000 +0900 @@ -156,6 +156,9 @@ void init_read_record(READ_RECORD *info, table->sort.found_records*info->ref_length; info->read_record= (table->sort.addon_field ? rr_unpack_from_buffer : rr_from_pointers); +#ifdef ENABLE_SENNA + my_thread_var->sen_flags |= SENNA_DO_READ_RECORD; +#endif /* ENABLE_SENNA */ } else { @@ -320,6 +323,15 @@ static int rr_from_tempfile(READ_RECORD { if (my_b_read(info->io_cache,info->ref_pos,info->ref_length)) return -1; /* End of file */ +#ifdef ENABLE_SENNA + if ((my_thread_var->sen_flags & SENNA_USE_2IND) && + (my_thread_var->sen_flags & + (SENNA_MATCH | SENNA_DO_READ_RECORD | SENNA_IF_READ_RECORD)) + == (SENNA_MATCH | SENNA_DO_READ_RECORD)) { + SEN_LOG(sen_log_debug, "rr_from_tempfile: 2ind return 0"); + return 0; + } +#endif /* ENABLE_SENNA */ if (!(tmp=info->file->rnd_pos(info->record,info->ref_pos))) break; /* The following is extremely unlikely to happen */ @@ -373,6 +385,15 @@ static int rr_from_pointers(READ_RECORD cache_pos= info->cache_pos; info->cache_pos+= info->ref_length; +#ifdef ENABLE_SENNA + if ((my_thread_var->sen_flags & SENNA_USE_2IND) && + (my_thread_var->sen_flags & + (SENNA_MATCH | SENNA_DO_READ_RECORD | SENNA_IF_READ_RECORD)) + == (SENNA_MATCH | SENNA_DO_READ_RECORD)) { + SEN_LOG(sen_log_debug, "rr_from_pointers: 2ind return 0"); + return 0; + } +#endif /* ENABLE_SENNA */ if (!(tmp=info->file->rnd_pos(info->record,cache_pos))) break; --- orig/libmysqld/set_var.cc 2007-07-04 22:06:26.000000000 +0900 +++ new/libmysqld/set_var.cc 2007-10-29 10:14:23.000000000 +0900 @@ -82,6 +82,18 @@ TYPELIB delay_key_write_typelib= delay_key_write_type_names, NULL }; +#ifdef ENABLE_SENNA +const char *senna_log_level_type_names[] = { "NONE", "EMERG", "ALERT", + "CRIT", "ERROR", "WARNING", + "NOTICE", "INFO", "DEBUG", + "DUMP", NullS }; +TYPELIB senna_log_level_typelib= +{ + array_elements(senna_log_level_type_names)-1, "", + senna_log_level_type_names, NULL +}; +#endif + static int sys_check_ftb_syntax(THD *thd, set_var *var); static bool sys_update_ftb_syntax(THD *thd, set_var * var); static void sys_default_ftb_syntax(THD *thd, enum_var_type type); @@ -457,6 +469,13 @@ sys_var_long_ptr sys_innodb_flush_log_a &srv_flush_log_at_trx_commit); #endif +#ifdef ENABLE_SENNA +sys_var_bool_ptr sys_senna_log("senna_log", &opt_senna_log); +sys_var_enum sys_senna_log_level("senna_log_level",&senna_log_level_options, + &senna_log_level_typelib, fix_senna_log_level); +sys_var_thd_bool sys_senna_2ind("senna_2ind", &SV::senna_2ind, fix_senna_2ind); +#endif + /* Condition pushdown to storage engine */ sys_var_thd_bool sys_engine_condition_pushdown("engine_condition_pushdown", @@ -737,6 +756,10 @@ sys_var *sys_variables[]= &sys_secure_auth, &sys_secure_file_priv, &sys_select_limit, +#ifdef ENABLE_SENNA + &sys_senna_2ind, + &sys_senna_log_level, +#endif &sys_server_id, #ifdef HAVE_REPLICATION &sys_slave_compressed_protocol, @@ -1054,6 +1077,11 @@ struct show_var_st init_vars[]= { {sys_rpl_recovery_rank.name,(char*) &sys_rpl_recovery_rank, SHOW_SYS}, {"secure_auth", (char*) &sys_secure_auth, SHOW_SYS}, {"secure_file_priv", (char*) &sys_secure_file_priv, SHOW_SYS}, +#ifdef ENABLE_SENNA + {"senna_2ind", (char*) &sys_senna_2ind, SHOW_SYS}, + {"senna_log", (char*) &opt_senna_log, SHOW_MY_BOOL}, + {"senna_log_level", (char*) &sys_senna_log_level, SHOW_SYS}, +#endif #ifdef HAVE_SMEM {"shared_memory", (char*) &opt_enable_shared_memory, SHOW_MY_BOOL}, {"shared_memory_base_name", (char*) &shared_memory_base_name, SHOW_CHAR_PTR}, @@ -1375,6 +1403,22 @@ extern void fix_delay_key_write(THD *thd } } +#ifdef ENABLE_SENNA +extern void fix_senna_log_level(THD *thd, enum_var_type type) +{ + DBUG_ENTER("fix_senna_log_level"); + senna_logger.max_level = (sen_log_level) senna_log_level_options; + DBUG_VOID_RETURN; +} + +extern void fix_senna_2ind(THD *thd, enum_var_type type) +{ + DBUG_ENTER("fix_senna_2ind"); + my_thread_var->sen_flags = (thd->variables.senna_2ind ? SENNA_USE_2IND : 0); + DBUG_VOID_RETURN; +} +#endif + static void fix_max_binlog_size(THD *thd, enum_var_type type) { DBUG_ENTER("fix_max_binlog_size"); --- orig/libmysqld/sp_head.cc 2007-07-04 22:06:05.000000000 +0900 +++ new/libmysqld/sp_head.cc 2007-10-29 10:14:23.000000000 +0900 @@ -189,6 +189,9 @@ sp_get_flags_for_command(LEX *lex) case SQLCOM_SHOW_OPEN_TABLES: case SQLCOM_SHOW_PRIVILEGES: case SQLCOM_SHOW_PROCESSLIST: +#ifdef ENABLE_SENNA + case SQLCOM_SHOW_SENNA_STATUS: +#endif case SQLCOM_SHOW_SLAVE_HOSTS: case SQLCOM_SHOW_SLAVE_STAT: case SQLCOM_SHOW_STATUS: --- orig/libmysqld/sql_db.cc 2007-07-04 22:06:25.000000000 +0900 +++ new/libmysqld/sql_db.cc 2007-10-29 10:14:23.000000000 +0900 @@ -874,6 +874,11 @@ static long mysql_rm_known_files(THD *th (file->name[1] == '.' && !file->name[2]))) continue; +#ifdef ENABLE_SENNA + /* senna files is skip */ + /* ".SEN",".SEN.i",".SEN.i.c",".SEN.l", ".SEN.i.c.001",.. and so on */ + if (strstr(file->name, ".SEN")) { continue; } +#endif /* ENABLE_SENNA */ /* Check if file is a raid directory */ if ((my_isdigit(system_charset_info, file->name[0]) || (file->name[0] >= 'a' && file->name[0] <= 'f')) && --- orig/libmysqld/sql_delete.cc 2007-07-04 22:06:58.000000000 +0900 +++ new/libmysqld/sql_delete.cc 2007-10-29 10:14:23.000000000 +0900 @@ -876,6 +876,9 @@ bool mysql_truncate(THD *thd, TABLE_LIST if (thd->slave_thread) --slave_open_temp_tables; *fn_ext(path)=0; // Remove the .frm extension +#ifdef ENABLE_SENNA + create_info.key_info=table->key_info; +#endif /* ENABLE_SENNA */ ha_create_table(path, &create_info,1); // We don't need to call invalidate() because this table is not in cache if ((error= (int) !(open_temporary_table(thd, path, table_list->db, @@ -908,6 +911,10 @@ bool mysql_truncate(THD *thd, TABLE_LIST DBUG_RETURN(TRUE); } +#ifdef ENABLE_SENNA + create_info.query_type = SENNA_TRUNCATE_TABLE; +#endif + *fn_ext(path)=0; // Remove the .frm extension error= ha_create_table(path,&create_info,1); query_cache_invalidate3(thd, table_list, 0); --- orig/libmysqld/sql_insert.cc 2007-07-04 22:05:32.000000000 +0900 +++ new/libmysqld/sql_insert.cc 2007-10-29 10:14:23.000000000 +0900 @@ -1788,6 +1788,9 @@ bool delayed_get_table(THD *thd, TABLE_L tmp->table_list= *table_list; // Needed to open table tmp->table_list.alias= tmp->table_list.table_name= tmp->thd.query; tmp->lock(); +#ifdef ENABLE_SENNA /* nkjm SFID:10294 */ + tmp->thd.thread_id= thd->thread_id; +#endif /* nkjm SFID:10294 */ pthread_mutex_lock(&tmp->mutex); if ((error=pthread_create(&tmp->thd.real_id,&connection_attrib, handle_delayed_insert,(void*) tmp))) @@ -2109,6 +2112,9 @@ pthread_handler_t handle_delayed_insert( { Delayed_insert *di=(Delayed_insert*) arg; THD *thd= &di->thd; +#ifdef ENABLE_SENNA + uint sen_thread_id = thd->thread_id; +#endif pthread_detach_this_thread(); /* Add thread to THD list so that's it's visible in 'show processlist' */ @@ -2134,6 +2140,12 @@ pthread_handler_t handle_delayed_insert( strmov(thd->net.last_error,ER(thd->net.last_errno=ER_OUT_OF_RESOURCES)); goto end; } +#ifdef ENABLE_SENNA /* nkjm SFID:10294 */ + struct st_my_thread_var *sen_tmp; + extern pthread_key_t THR_KEY_mysys; + sen_tmp= (struct st_my_thread_var *)pthread_getspecific(THR_KEY_mysys); + sen_tmp->sen_connection_id= sen_thread_id; +#endif /* nkjm SFID:10294 */ #endif DBUG_ENTER("handle_delayed_insert"); --- orig/libmysqld/sql_parse.cc 2007-07-04 22:06:41.000000000 +0900 +++ new/libmysqld/sql_parse.cc 2007-10-29 10:14:23.000000000 +0900 @@ -1106,6 +1106,12 @@ pthread_handler_t handle_one_connection( end_thread(thd,0); return 0; } +#ifdef ENABLE_SENNA /* nkjm SFID:10294 */ + struct st_my_thread_var *sen_tmp; + extern pthread_key_t THR_KEY_mysys; + sen_tmp= (struct st_my_thread_var *)pthread_getspecific(THR_KEY_mysys); + sen_tmp->sen_connection_id= thd->thread_id; +#endif /* nkjm SFID:10294 */ #endif /* @@ -1185,6 +1191,9 @@ pthread_handler_t handle_one_connection( thd_proc_info(thd, 0); thd->init_for_queries(); } +#ifdef ENABLE_SENNA + my_thread_var->sen_flags = (thd->variables.senna_2ind ? SENNA_USE_2IND : 0); +#endif /* Connect completed, set read/write timeouts back to tdefault */ my_net_set_read_timeout(net, thd->variables.net_read_timeout); @@ -2911,6 +2920,13 @@ mysql_execute_command(THD *thd) break; } #endif +#ifdef ENABLE_SENNA + case SQLCOM_SHOW_SENNA_STATUS: + { + res = senna_show_status(thd, lex); + break; + } +#endif #ifdef HAVE_REPLICATION case SQLCOM_LOAD_MASTER_TABLE: { --- orig/libmysqld/sql_select.cc 2007-07-04 22:05:44.000000000 +0900 +++ new/libmysqld/sql_select.cc 2007-10-29 10:14:23.000000000 +0900 @@ -1458,6 +1458,10 @@ JOIN::optimize() DBUG_RETURN(-1); /* purecov: inspected */ } +#ifdef ENABLE_SENNA + my_thread_var->sen_flags |= SENNA_FIRST_CALL; +#endif /* ENABLE_SENNA */ + error= 0; DBUG_RETURN(0); } @@ -2059,6 +2063,10 @@ JOIN::exec() curr_join->fields= curr_fields_list; curr_join->procedure= procedure; +#ifdef ENABLE_SENNA + my_thread_var->sen_flags &= ~SENNA_FIRST_CALL; +#endif /* ENABLE_SENNA */ + if (is_top_level_join() && thd->cursor && tables != const_tables) { /* @@ -2248,7 +2256,10 @@ mysql_select(THD *thd, Item ***rref_poin goto err; } } - +#ifdef ENABLE_SENNA + my_thread_var->sen_flags = select_lex->ftfunc_list->elements ? SENNA_MATCH : 0; + if (join->select_distinct) { my_thread_var->sen_flags |= SENNA_DISTINCT; } +#endif /* ENABLE_SENNA */ if ((err= join->optimize())) { goto err; // 1 @@ -3629,7 +3640,11 @@ update_ref_and_keys(THD *thd, DYNAMIC_AR for ( ; field != end ; field++) add_key_part(keyuse,field); - if (select_lex->ftfunc_list->elements) + if (select_lex->ftfunc_list->elements +#ifdef ENABLE_SENNA + && !join_tab->table->force_index +#endif /* ENABLE_SENNA */ + ) { add_ft_keys(keyuse,join_tab,cond,normal_tables); } @@ -6129,6 +6144,9 @@ make_join_readinfo(JOIN *join, ulonglong table->status=STATUS_NO_RECORD; tab->read_first_record= join_ft_read_first; tab->read_record.read_record= join_ft_read_next; +#ifdef ENABLE_SENNA + my_thread_var->sen_flags |= SENNA_DO_READ_RECORD; +#endif /* ENABLE_SENNA */ break; case JT_ALL: /* @@ -10399,6 +10417,20 @@ do_select(JOIN *join,List *fields, DBUG_RETURN(join->thd->net.report_error ? -1 : rc); } +#ifdef ENABLE_SENNA +static void +decide_read_or_skip(JOIN *join,JOIN_TAB *join_tab,bool needs_record) +{ + if (needs_record || (my_thread_var->sen_flags & (SENNA_DISTINCT | SENNA_FIRST_CALL)) || + (join_tab->next_select != end_send_group && + !join->unit->offset_limit_cnt && + join->send_records < join->unit->select_limit_cnt)) { + my_thread_var->sen_flags |= SENNA_IF_READ_RECORD; + } else { + my_thread_var->sen_flags &= ~SENNA_IF_READ_RECORD; + } +} +#endif /* ENABLE_SENNA */ enum_nested_loop_state sub_select_cache(JOIN *join,JOIN_TAB *join_tab,bool end_of_records) @@ -10544,6 +10576,9 @@ sub_select_cache(JOIN *join,JOIN_TAB *jo enum_nested_loop_state sub_select(JOIN *join,JOIN_TAB *join_tab,bool end_of_records) { +#ifdef ENABLE_SENNA + if (join_tab->next_select == end_update) { my_thread_var->sen_flags &= ~SENNA_DO_READ_RECORD; } +#endif /* ENABLE_SENNA */ join_tab->table->null_row=0; if (end_of_records) return (*join_tab->next_select)(join,join_tab+1,end_of_records); @@ -10552,6 +10587,10 @@ sub_select(JOIN *join,JOIN_TAB *join_tab enum_nested_loop_state rc; my_bool *report_error= &(join->thd->net.report_error); READ_RECORD *info= &join_tab->read_record; +#ifdef ENABLE_SENNA + COND *select_cond = join_tab->select_cond; + bool needs_record = select_cond ? select_cond->needs_record() : false; +#endif /* ENABLE_SENNA */ if (join->resume_nested_loop) { @@ -10581,12 +10620,18 @@ sub_select(JOIN *join,JOIN_TAB *join_tab } join->thd->row_count= 0; +#ifdef ENABLE_SENNA + decide_read_or_skip(join, join_tab, needs_record); +#endif /* ENABLE_SENNA */ error= (*join_tab->read_first_record)(join_tab); rc= evaluate_join_record(join, join_tab, error, report_error); } while (rc == NESTED_LOOP_OK) { +#ifdef ENABLE_SENNA + decide_read_or_skip(join, join_tab, needs_record); +#endif /* ENABLE_SENNA */ error= info->read_record(info); rc= evaluate_join_record(join, join_tab, error, report_error); } @@ -11245,7 +11290,19 @@ join_read_first(JOIN_TAB *tab) tab->read_record.record=table->record[0]; if (!table->file->inited) table->file->ha_index_init(tab->index); - if ((error=tab->table->file->index_first(tab->table->record[0]))) +#ifdef ENABLE_SENNA + if (my_thread_var->sen_flags & SENNA_MATCH) { my_thread_var->sen_flags |= SENNA_DO_READ_RECORD; } + if ((my_thread_var->sen_flags & SENNA_USE_2IND) && + (my_thread_var->sen_flags & + (SENNA_MATCH | SENNA_DO_READ_RECORD | SENNA_IF_READ_RECORD)) + == (SENNA_MATCH | SENNA_DO_READ_RECORD)) { + //error=tab->table->file->index_first(NULL); + statistic_increment(tab->table->in_use->status_var.senna_2ind_count, &LOCK_status); + return 0; + } else +#endif /* ENABLE_SENNA */ + error=tab->table->file->index_first(tab->table->record[0]); + if (error) { if (error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE) report_error(table, error); @@ -11259,7 +11316,18 @@ static int join_read_next(READ_RECORD *info) { int error; - if ((error=info->file->index_next(info->record))) +#ifdef ENABLE_SENNA + if ((my_thread_var->sen_flags & SENNA_USE_2IND) && + (my_thread_var->sen_flags & + (SENNA_MATCH | SENNA_DO_READ_RECORD | SENNA_IF_READ_RECORD)) + == (SENNA_MATCH | SENNA_DO_READ_RECORD)) { + //error=info->file->index_next(NULL); + statistic_increment(info->thd->status_var.senna_2ind_count, &LOCK_status); + return 0; + } else +#endif /* ENABLE_SENNA */ + error=info->file->index_next(info->record); + if (error) return report_error(info->table, error); return 0; } @@ -11284,7 +11352,19 @@ join_read_last(JOIN_TAB *tab) tab->read_record.record=table->record[0]; if (!table->file->inited) table->file->ha_index_init(tab->index); - if ((error= tab->table->file->index_last(tab->table->record[0]))) +#ifdef ENABLE_SENNA + if (my_thread_var->sen_flags & SENNA_MATCH) { my_thread_var->sen_flags |= SENNA_DO_READ_RECORD; } + if ((my_thread_var->sen_flags & SENNA_USE_2IND) && + (my_thread_var->sen_flags & + (SENNA_MATCH | SENNA_DO_READ_RECORD | SENNA_IF_READ_RECORD)) + == (SENNA_MATCH | SENNA_DO_READ_RECORD)) { + //error=tab->table->file->index_last(NULL); + statistic_increment(tab->table->in_use->status_var.senna_2ind_count, &LOCK_status); + return 0; + } else +#endif /* ENABLE_SENNA */ + error=tab->table->file->index_last(tab->table->record[0]); + if (error) return report_error(table, error); return 0; } @@ -11294,7 +11374,18 @@ static int join_read_prev(READ_RECORD *info) { int error; - if ((error= info->file->index_prev(info->record))) +#ifdef ENABLE_SENNA + if ((my_thread_var->sen_flags & SENNA_USE_2IND) && + (my_thread_var->sen_flags & + (SENNA_MATCH | SENNA_DO_READ_RECORD | SENNA_IF_READ_RECORD)) + == (SENNA_MATCH | SENNA_DO_READ_RECORD)) { + //error=info->file->index_prev(NULL); + statistic_increment(info->thd->status_var.senna_2ind_count, &LOCK_status); + return 0; + } else +#endif /* ENABLE_SENNA */ + error=info->file->index_prev(info->record); + if (error) return report_error(info->table, error); return 0; } @@ -11308,6 +11399,9 @@ join_ft_read_first(JOIN_TAB *tab) if (!table->file->inited) table->file->ha_index_init(tab->ref.key); +#ifdef ENABLE_SENNA + if (my_thread_var->sen_flags & SENNA_MATCH) { my_thread_var->sen_flags |= SENNA_DO_READ_RECORD; } +#endif /* ENABLE_SENNA */ #if NOT_USED_YET if (cp_buffer_from_ref(tab->join->thd, &tab->ref)) // as ft-key doesn't use store_key's return -1; // see also FT_SELECT::init() @@ -12569,6 +12663,12 @@ create_sort_index(THD *thd, JOIN *join, table= tab->table; select= tab->select; +#ifdef ENABLE_SENNA + if (tab->select_cond && tab->select_cond->needs_record()) { + my_thread_var->sen_flags |= SENNA_IF_READ_RECORD; + } +#endif /* ENABLE_SENNA */ + /* When there is SQL_BIG_RESULT do not sort using index for GROUP BY, and thus force sorting on disk. --- orig/libmysqld/sql_show.cc 2007-07-04 22:06:15.000000000 +0900 +++ new/libmysqld/sql_show.cc 2007-10-29 10:14:23.000000000 +0900 @@ -28,6 +28,12 @@ #include "ha_berkeley.h" // For berkeley_show_logs #endif +#ifdef ENABLE_SENNA +#ifdef HAVE_ISAM +#include "ha_myisam.h" // For isam +#endif +#endif /* ENABLE_SENNA */ + #ifndef NO_EMBEDDED_ACCESS_CHECKS static const char *grant_names[]={ "select","insert","update","delete","create","drop","reload","shutdown", @@ -1879,6 +1885,9 @@ void get_index_field_values(LEX *lex, IN case SQLCOM_SHOW_TABLES: case SQLCOM_SHOW_TABLE_STATUS: case SQLCOM_SHOW_TRIGGERS: +#ifdef ENABLE_SENNA + case SQLCOM_SHOW_SENNA_STATUS: +#endif index_field_values->db_value= lex->select_lex.db; index_field_values->table_value= wild; break; @@ -4432,3 +4441,105 @@ ST_SCHEMA_TABLE schema_tables[]= template class List_iterator_fast; template class List; #endif + +#ifdef ENABLE_SENNA +bool senna_show_status(THD *thd, LEX *lex) +{ + List files; + List field_list; + char path[FN_LEN]; + char *file_name; + Protocol* protocol = thd->protocol; + char *db = lex->select_lex.db ? lex->select_lex.db : thd->db; + const char *wild = lex->wild ? lex->wild->ptr() : "%"; + DBUG_ENTER("senna_show_status"); + + (void) my_snprintf(path, FN_LEN, "%s/%s", mysql_data_home, db); + (void) unpack_dirname(path, path); + + field_list.push_back(new Item_empty_string("Table", 20)); + field_list.push_back(new Item_empty_string("Key_name", 20)); + field_list.push_back(new Item_empty_string("Column_name", 20)); + field_list.push_back(new Item_empty_string("Encoding", 20)); + field_list.push_back(new Item_empty_string("Index_type", 20)); + field_list.push_back(new Item_empty_string("Normalize", 20)); + field_list.push_back(new Item_empty_string("Split_alpha", 20)); + field_list.push_back(new Item_empty_string("Split_digit", 20)); + field_list.push_back(new Item_empty_string("Split_symbol", 20)); + field_list.push_back(new Item_int("Initial_n_segments", 20)); + field_list.push_back(new Item_int("Senna_keys_size", 20)); + field_list.push_back(new Item_int("Senna_keys_file_size", 20)); + field_list.push_back(new Item_int("Senna_lexicon_size", 20)); + field_list.push_back(new Item_int("Senna_lexicon_file_size", 20)); + field_list.push_back(new Item_int("Senna_inv_seg_size", 20)); + field_list.push_back(new Item_int("Senna_inv_chunk_size", 20)); + if (protocol->send_fields(&field_list, + Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF)) + DBUG_RETURN(TRUE); + + if (find_files(thd, &files, db, path, wild, 0)) + DBUG_RETURN(-1); + List_iterator_fast it(files); + while (file_name = it++) + { + TABLE_LIST table_list; + bzero((char*) &table_list, sizeof(table_list)); + table_list.db = db; + table_list.table_name = file_name; + table_list.alias = file_name; + TABLE *table = open_ltable(thd, &table_list, TL_READ); + if (!strcmp(table->file->table_type(), "MyISAM")) + { + uint nkeys = table->s->keys; + int i = 0; + table->file->info(HA_STATUS_VARIABLE | HA_STATUS_SENNA); + for (; i < nkeys; i++) + { + const char* tkey; + KEY *key = &table->key_info[i]; + + if (key->algorithm == HA_KEY_ALG_FULLTEXT + &&!(key->senna_flags & SEN_DISABLE_SENNA)) + { + uint nkey_parts = key->key_parts; + int j = 0; + for (; j < nkey_parts; j++) + { + KEY_PART_INFO *key_part = &key->key_part[j]; + uint16 fieldnr = key_part->fieldnr; + Field *field = table->field[fieldnr-1]; + const char *field_name = field->field_name; + + protocol->prepare_for_resend(); + protocol->store(key->table->s->table_name, system_charset_info); + protocol->store(key->name, system_charset_info); + protocol->store(field_name, system_charset_info); + protocol->store(key->senna_encoding, system_charset_info); + if (key->senna_flags & SEN_INDEX_NGRAM) + protocol->store("NGRAM", system_charset_info); + else if (key->senna_flags & SEN_INDEX_DELIMITED) + protocol->store("DELIMITED", system_charset_info); + else + protocol->store("MECAB", system_charset_info); + protocol->store(key->senna_flags & SEN_INDEX_NORMALIZE ? "ON" : "OFF", system_charset_info); + protocol->store(key->senna_flags & SEN_INDEX_SPLIT_ALPHA ? "ON" : "OFF", system_charset_info); + protocol->store(key->senna_flags & SEN_INDEX_SPLIT_DIGIT ? "ON" : "OFF", system_charset_info); + protocol->store(key->senna_flags & SEN_INDEX_SPLIT_SYMBOL ? "ON" : "OFF", system_charset_info); + protocol->store((uint32) key->senna_initial_n_segments); + protocol->store((uint32) key->senna_keys_size); + protocol->store((uint32) key->senna_keys_file_size); + protocol->store((uint32) key->senna_lexicon_size); + protocol->store((uint32) key->senna_lexicon_file_size); + protocol->store((uint32) key->senna_inv_seg_size); + protocol->store((uint32) key->senna_inv_chunk_size); + if (protocol->write()) DBUG_RETURN(TRUE); + } + } + } + } + close_thread_tables(thd, 0); + } + send_eof(thd); + DBUG_RETURN(TRUE); +} +#endif --- orig/libmysqld/sql_table.cc 2007-07-04 22:06:22.000000000 +0900 +++ new/libmysqld/sql_table.cc 2007-10-29 10:14:23.000000000 +0900 @@ -1121,6 +1121,9 @@ static int mysql_prepare_table(THD *thd, if (!*key_info_buffer || ! key_part_info) DBUG_RETURN(-1); // Out of memory +#ifdef ENABLE_SENNA + create_info->key_info=*key_info_buffer; +#endif /* ENABLE_SENNA */ key_iterator.rewind(); key_number=0; for (; (key=key_iterator++) ; key_number++) @@ -1164,6 +1167,10 @@ static int mysql_prepare_table(THD *thd, if (key->generated) key_info->flags|= HA_GENERATED_KEY; +#ifdef ENABLE_SENNA + key_info->senna_flags=key->senna_flags; + key_info->senna_initial_n_segments=key->senna_initial_n_segments; +#endif /* ENABLE_SENNA */ key_info->key_parts=(uint8) key->columns.elements; key_info->key_part=key_part_info; key_info->usable_key_parts= key_number; @@ -1263,6 +1270,9 @@ static int mysql_prepare_table(THD *thd, DBUG_RETURN(-1); } ft_key_charset=sql_field->charset; +#ifdef ENABLE_SENNA + key_info->senna_encoding=ft_key_charset->csname; +#endif /* for fulltext keys keyseg length is 1 for blobs (it's ignored in ft code anyway, and 0 (set to column width later) for char's. it has @@ -2822,6 +2832,10 @@ bool mysql_create_like_table(THD* thd, T DBUG_EXECUTE_IF("sleep_create_like_before_copy", my_sleep(6000000);); +#ifdef ENABLE_SENNA + create_info->query_type = SENNA_CREATE_TABLE_LIKE; +#endif + /* Create a new table by copying from source table */ @@ -3147,6 +3161,10 @@ view_err: if (!(table=open_ltable(thd,table_list,TL_WRITE_ALLOW_READ))) DBUG_RETURN(TRUE); +#ifdef ENABLE_SENNA + table->file->info(HA_STATUS_VARIABLE | HA_STATUS_SENNA); +#endif + /* Check that we are not trying to rename to an existing table */ if (new_name) { @@ -3593,10 +3611,19 @@ view_err: else key_type= Key::MULTIPLE; +#ifdef ENABLE_SENNA + key= new Key(key_type, key_name, + key_info->algorithm, + test(key_info->flags & HA_GENERATED_KEY), + key_parts, + key_info->senna_flags, + key_info->senna_initial_n_segments); +#else /* ENABLE_SENNA */ key= new Key(key_type, key_name, key_info->algorithm, test(key_info->flags & HA_GENERATED_KEY), key_parts); +#endif /* ENABLE_SENNA */ new_info.key_list.push_back(key); } } --- orig/myisam/Makefile.am 2007-07-04 22:06:22.000000000 +0900 +++ new/myisam/Makefile.am 2007-10-29 10:14:15.000000000 +0900 @@ -16,11 +16,13 @@ EXTRA_DIST = mi_test_all.sh mi_test_all.res ft_stem.c CMakeLists.txt pkgdata_DATA = mi_test_all mi_test_all.res -INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include +INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include \ + @SENNA_INCLUDES@ @MECAB_INCLUDES@ LDADD = @CLIENT_EXTRA_LDFLAGS@ libmyisam.a \ $(top_builddir)/mysys/libmysys.a \ $(top_builddir)/dbug/libdbug.a \ - $(top_builddir)/strings/libmystrings.a @ZLIB_LIBS@ + $(top_builddir)/strings/libmystrings.a @ZLIB_LIBS@ \ + @SENNA_LIBS@ @MECAB_LIBS@ pkglib_LIBRARIES = libmyisam.a bin_PROGRAMS = myisamchk myisamlog myisampack myisam_ftdump myisamchk_DEPENDENCIES= $(LIBRARIES) --- orig/myisam/ft_boolean_search.c 2007-07-04 22:05:32.000000000 +0900 +++ new/myisam/ft_boolean_search.c 2007-10-29 10:14:15.000000000 +0900 @@ -20,6 +20,11 @@ #define FT_CORE #include "ftdefs.h" +#ifdef ENABLE_SENNA +#include +#define SENNA_MAX_N_EXPR 32 +#endif /* ENABLE_SENNA */ + /* search with boolean queries */ static double _wghts[11]= @@ -103,6 +108,9 @@ typedef struct st_ft_info uint keynr; uchar with_scan; enum { UNINITIALIZED, READY, INDEX_SEARCH, INDEX_DONE } state; +#ifdef ENABLE_SENNA + sen_records *sir; +#endif /* ENABLE_SENNA */ } FTB; static int FTB_WORD_cmp(my_off_t *v, FTB_WORD *a, FTB_WORD *b) @@ -402,6 +410,40 @@ FT_INFO * ft_init_boolean_search(MI_INFO DBUG_ASSERT(keynr==NO_SUCH_KEY || cs == info->s->keyinfo[keynr].seg->charset); ftb->with_scan=0; ftb->lastpos=HA_OFFSET_ERROR; +#ifdef ENABLE_SENNA + if ((ftb->keynr != NO_SUCH_KEY) && ftb->info->s->keyinfo[ftb->keynr].senna) + { + sen_index *i; + sen_query *q; + const char *rest; + unsigned int rest_len; + if (keynr==NO_SUCH_KEY || + !(i = info->s->keyinfo[keynr].senna)) { + SEN_LOG(sen_log_warning, "ft_init_boolean_serch: keynr==NO_SUCH_KEY"); + my_free((gptr)ftb,MYF(0)); + return 0; + } + SEN_LOG(sen_log_info, "ft_init_boolean_search => sen_query_open: str='%s', str_len=%d, max_exprs=%d", + query, query_len, SENNA_MAX_N_EXPR); + if (!(q = sen_query_open(query, query_len, sen_sel_or, SENNA_MAX_N_EXPR, + info->s->keyinfo[keynr].senna_encoding))) { + SEN_LOG(sen_log_error, "ft_init_boolean_serch: sen_query_open returned error"); + my_free((gptr)ftb,MYF(0)); + return 0; + } + SEN_LOG(sen_log_debug, "ft_init_boolean_search => sen_query_rest: q=%p, rest=%p", q, &rest); + if ((rest_len = sen_query_rest(q, &rest))) { + SEN_LOG(sen_log_warning, "ft_init_boolean_search: too long query. rest(%.*s) are ignored", rest_len, rest); + } + SEN_LOG(sen_log_debug, "ft_init_boolean_search => sen_records_open"); + ftb->sir = sen_records_open(sen_rec_document, sen_rec_none, 0); + SEN_LOG(sen_log_info, "ft_init_boolean_search => sen_query_exec: i=%p, q=%p, r=%p", i, q, ftb->sir); + sen_query_exec(i, q, ftb->sir, sen_sel_or); + SEN_LOG(sen_log_debug, "ft_init_boolean_search => sen_query_close: q=%p", q); + sen_query_close(q); + return ftb; + } +#endif /* ENABLE_SENNA */ bzero(& ftb->no_dupes, sizeof(TREE)); init_alloc_root(&ftb->mem_root, 1024, 1024); @@ -561,6 +603,32 @@ static void _ftb_climb_the_tree(FTB *ftb int ft_boolean_read_next(FT_INFO *ftb, char *record) { +#ifdef ENABLE_SENNA + if ((ftb->keynr != NO_SUCH_KEY) && ftb->info->s->keyinfo[ftb->keynr].senna) + { + my_off_t pos; + MI_INFO *info=ftb->info; + while (ftb->sir && sen_records_next(ftb->sir, &pos, sizeof(my_off_t), NULL)) { + info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); + info->lastpos=pos; + if (!(my_thread_var->sen_flags & (SENNA_USE_2IND | SENNA_IF_READ_RECORD | + SENNA_FILESORT))) { + SEN_LOG(sen_log_debug, "ft_boolean_read_next: 2ind return 0"); + return 0; + } + if (!(*info->read_record)(info,info->lastpos,record)) { + info->update|= HA_STATE_AKTIV; /* Record is read */ + return 0; + } + SEN_LOG(sen_log_error, "ft_boolean_read_next: my_errno=%d pos=%lld", my_errno, pos); + if (my_errno == 127) { continue; } + return my_errno; + } + return HA_ERR_END_OF_FILE; + } + else +#endif /* ENABLE_SENNA */ + { FTB_EXPR *ftbe; FTB_WORD *ftbw; MI_INFO *info=ftb->info; @@ -626,11 +694,26 @@ int ft_boolean_read_next(FT_INFO *ftb, c err: ftb->queue.first_cmp_arg=(void *)0; return my_errno; + } } float ft_boolean_find_relevance(FT_INFO *ftb, byte *record, uint length) { +#ifdef ENABLE_SENNA + if ((ftb->keynr != NO_SUCH_KEY) && ftb->info->s->keyinfo[ftb->keynr].senna) + { + my_off_t docid=ftb->info->lastpos; + if (!ftb->sir) { return 0.0; } + if (docid == HA_OFFSET_ERROR) + return -2.0; + SEN_LOG(sen_log_debug, "ft_boolean_find_relevance => sen_records_find: records=%p, key=%p", + ftb->sir, &docid); + return 1.0 * sen_records_find(ftb->sir, &docid); + } + else +#endif /* ENABLE_SENNA */ + { FT_WORD word; FTB_WORD *ftbw; FTB_EXPR *ftbe; @@ -709,11 +792,21 @@ float ft_boolean_find_relevance(FT_INFO { /* match failed ! */ return 0.0; } + } } void ft_boolean_close_search(FT_INFO *ftb) { +#ifdef ENABLE_SENNA + if ((ftb->keynr != NO_SUCH_KEY) && ftb->info->s->keyinfo[ftb->keynr].senna) + { + SEN_LOG(sen_log_debug, "ft_boolean_close_search => sen_records_close: records=%p", ftb->sir); + sen_records_close(ftb->sir); + my_free((gptr)ftb,MYF(0)); + return; + } +#endif /* ENABLE_SENNA */ if (is_tree_inited(& ftb->no_dupes)) { delete_tree(& ftb->no_dupes); @@ -725,12 +818,28 @@ void ft_boolean_close_search(FT_INFO *ft float ft_boolean_get_relevance(FT_INFO *ftb) { +#ifdef ENABLE_SENNA + if ((ftb->keynr != NO_SUCH_KEY) && ftb->info->s->keyinfo[ftb->keynr].senna) + { + if (!ftb->sir) { return 0.0; } + SEN_LOG(sen_log_debug, "ft_boolean_get_relevance => sen_records_curr_score: r=%p", ftb->sir); + return 1.0 * sen_records_curr_score(ftb->sir); + } +#endif /* ENABLE_SENNA */ return ftb->root->cur_weight; } void ft_boolean_reinit_search(FT_INFO *ftb) { +#ifdef ENABLE_SENNA + if ((ftb->keynr != NO_SUCH_KEY) && ftb->info->s->keyinfo[ftb->keynr].senna) + { + SEN_LOG(sen_log_debug, "ft_boolean_reinit_search => sen_records_rewind: records=%p", ftb->sir); + sen_records_rewind(ftb->sir); + return; + } +#endif /* ENABLE_SENNA */ _ftb_init_index_search(ftb); } --- orig/myisam/ft_nlq_search.c 2007-07-04 22:06:22.000000000 +0900 +++ new/myisam/ft_nlq_search.c 2007-10-29 10:14:15.000000000 +0900 @@ -32,6 +32,9 @@ struct st_ft_info MI_INFO *info; int ndocs; int curdoc; +#ifdef ENABLE_SENNA + sen_records *sir; +#endif /* ENABLE_SENNA */ FT_DOC doc[1]; }; @@ -209,8 +212,22 @@ FT_INFO *ft_init_nlq_search(MI_INFO *inf FT_DOC *dptr; FT_INFO *dlist=NULL; my_off_t saved_lastpos=info->lastpos; +#ifdef ENABLE_SENNA + sen_records *sir; +#endif /* ENABLE_SENNA */ DBUG_ENTER("ft_init_nlq_search"); - +#ifdef ENABLE_SENNA + if (info->s->keyinfo[keynr].senna) + { + SEN_LOG(sen_log_info, "ft_init_nlq_search => sen_index_sel index=%p, string='%s', string_len=%d", + info->s->keyinfo[keynr].senna, query, query_len); + sir = sen_index_sel(info->s->keyinfo[keynr].senna, query, query_len); + } + else + { + sir = NULL; + } +#endif /* ENABLE_SENNA */ /* black magic ON */ if ((int) (keynr = _mi_check_index(info,keynr)) < 0) DBUG_RETURN(NULL); @@ -277,6 +294,9 @@ FT_INFO *ft_init_nlq_search(MI_INFO *inf dlist->info=aio.info; dptr=dlist->doc; +#ifdef ENABLE_SENNA + dlist->sir = sir; +#endif /* ENABLE_SENNA */ tree_walk(&aio.dtree, (tree_walk_action) &walk_and_copy, &dptr, left_root_right); @@ -294,6 +314,32 @@ err: int ft_nlq_read_next(FT_INFO *handler, char *record) { MI_INFO *info= (MI_INFO *) handler->info; +#ifdef ENABLE_SENNA + if (handler->sir) + { + my_off_t pos; + info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); + SEN_LOG(sen_log_debug, "ft_nlq_read_next => sen_records_next in while loop"); + while (sen_records_next(handler->sir, &pos, sizeof(my_off_t), NULL)) + { + info->lastpos=pos; + if (!(my_thread_var->sen_flags & (SENNA_USE_2IND | SENNA_IF_READ_RECORD | + SENNA_FILESORT))) { + SEN_LOG(sen_log_debug, "ft_nlq_read_next => 2ind return 0"); + return 0; + } + if (!(*info->read_record)(info,info->lastpos,record)) + { + info->update|= HA_STATE_AKTIV; /* Record is read */ + return 0; + } + SEN_LOG(sen_log_error, "ft_nlq_read_next => my_errno=%d pos=%lld", my_errno, pos); + if (my_errno == 127) { continue; } + return my_errno; + } + return HA_ERR_END_OF_FILE; + } +#endif /* ENABLE_SENNA */ if (++handler->curdoc >= handler->ndocs) { @@ -324,6 +370,14 @@ float ft_nlq_find_relevance(FT_INFO *han if (docid == HA_POS_ERROR) return -5.0; +#ifdef ENABLE_SENNA + if (handler->sir) { + SEN_LOG(sen_log_debug, "ft_nlq_find_relevance => sen_records_find: records=%p, key=%p", + handler->sir, &docid); + return 1.0 * sen_records_find(handler->sir, &docid); + } +#endif /* ENABLE_SENNA */ + /* Assuming docs[] is sorted by dpos... */ for (a=0, b=handler->ndocs, c=(a+b)/2; b-a>1; c=(a+b)/2) @@ -343,18 +397,46 @@ float ft_nlq_find_relevance(FT_INFO *han void ft_nlq_close_search(FT_INFO *handler) { +#ifdef ENABLE_SENNA + if (handler->sir) + { + SEN_LOG(sen_log_debug, "ft_nlq_close_search => sen_records_close: records=%p", + handler->sir); + sen_records_close(handler->sir); + } +#endif /* ENABLE_SENNA */ my_free((gptr)handler,MYF(0)); } float ft_nlq_get_relevance(FT_INFO *handler) { +#ifdef ENABLE_SENNA + if (!handler->sir) { + if (handler->doc) { + return (float) handler->doc[handler->curdoc].weight; + } + return 0.0; + } + SEN_LOG(sen_log_debug, "ft_nlq_get_relevance => sen_records_curr_score: r=%p", + handler->sir); + return 1.0 * sen_records_curr_score(handler->sir); +#else /* ENABLE_SENNA */ return (float) handler->doc[handler->curdoc].weight; +#endif /* ENABLE_SENNA */ } void ft_nlq_reinit_search(FT_INFO *handler) { +#ifdef ENABLE_SENNA + if (handler->sir) + { + SEN_LOG(sen_log_debug, "ft_nlq_reinit_search => sen_records_rewind: r=%p", + handler->sir); + sen_records_rewind(handler->sir); + } +#endif /* ENABLE_SENNA */ handler->curdoc=-1; } --- orig/myisam/ft_update.c 2007-07-04 22:06:49.000000000 +0900 +++ new/myisam/ft_update.c 2007-10-29 10:14:15.000000000 +0900 @@ -114,6 +114,19 @@ uint _mi_ft_parse(TREE *parsed, MI_INFO FT_WORD * _mi_ft_parserecord(MI_INFO *info, uint keynr, const byte *record) { +#ifdef ENABLE_SENNA + if (info->s->keyinfo[keynr].senna) + { + FT_WORD *wlist; + if (!(wlist = (FT_WORD *) my_malloc(sizeof(FT_WORD), MYF(0)))) { + return NULL; + } + wlist->pos = 0; + return wlist; + } + else +#endif /* ENABLE_SENNA */ + { TREE ptree; DBUG_ENTER("_mi_ft_parserecord"); @@ -122,6 +135,7 @@ FT_WORD * _mi_ft_parserecord(MI_INFO *in DBUG_RETURN(NULL); DBUG_RETURN(ft_linearize(&ptree)); + } } static int _mi_ft_store(MI_INFO *info, uint keynr, byte *keybuf, @@ -186,6 +200,129 @@ int _mi_ft_cmp(MI_INFO *info, uint keynr DBUG_RETURN(GEE_THEY_ARE_ABSOLUTELY_IDENTICAL); } +#ifdef ENABLE_SENNA +#define SECTIONALIZE 0x00080000 +int ft_sen_index_add(MI_INFO *info, uint keynr, const byte *record, my_off_t pos) +{ + DBUG_ENTER("ft_sen_index_add"); + if (info->s->keyinfo[keynr].senna_flags & SECTIONALIZE) { + FT_SEG_ITERATOR ftsi; + unsigned int section; + sen_values *values; + _mi_ft_segiterator_init(info, keynr, record, &ftsi); + while (_mi_ft_segiterator(&ftsi)) { + if (ftsi.pos) { + if (ftsi.len > 1048576) { SEN_LOG(sen_log_debug, "ft_sen_index_add: ftsi.len=%d", ftsi.len); } + } + } + _mi_ft_segiterator_init(info, keynr, record, &ftsi); + while (_mi_ft_segiterator(&ftsi)) { + if (ftsi.pos) { + section = ftsi.num + 1; + SEN_LOG(sen_log_debug, "ft_sen_index_add => sen_values_open"); + values = sen_values_open(); + SEN_LOG(sen_log_debug, "ft_sen_index_add => sen_values_add: values=%p, str=%s, str_len=%d, weight=%d", + values, ftsi.pos, ftsi.len, 0); + sen_values_add(values, ftsi.pos, ftsi.len, 0); + SEN_LOG(sen_log_info, "ft_sen_index_add => sen_index_update: index=%p, key=%p (pos=%d), section=%d, oldvalue=%p, newvalue=%p", + info->s->keyinfo[keynr].senna, &pos, (uint) pos, section, NULL, values); + sen_index_update(info->s->keyinfo[keynr].senna, &pos, ftsi.num+1, NULL, values); + SEN_LOG(sen_log_debug, "ft_sen_index_add => sen_values_close: values=%p", values); + sen_values_close(values); + } + } + DBUG_RETURN(0); + } else { + FT_SEG_ITERATOR ftsi; + char *buf, *p; + uint len = 0; + _mi_ft_segiterator_init(info, keynr, record, &ftsi); + while (_mi_ft_segiterator(&ftsi)) { + if (ftsi.pos) { + if (ftsi.len > 1048576) { SEN_LOG(sen_log_debug, "ft_sen_index_add: ftsi.len=%d", ftsi.len); } + len += ftsi.len + 1; + } + } + if (!len) { return -1; } + if (!(p = buf = malloc(len))) { return -1; } + _mi_ft_segiterator_init(info, keynr, record, &ftsi); + while (_mi_ft_segiterator(&ftsi)) { + if (ftsi.pos) { + if (p != buf) { *p++ = ' '; } + memcpy(p, ftsi.pos, ftsi.len); + p += ftsi.len; + } + } + *p = '\0'; + SEN_LOG(sen_log_info, "ft_sen_index_add => sen_index_upd: index=%p, key=%p (pos=%d), oldvalue=%s," + "oldvalue_len=%d, newvalue=%s, newvalue_len=%d", + info->s->keyinfo[keynr].senna, &pos, (uint) pos, NULL, 0, buf, (p - buf)); + sen_index_upd(info->s->keyinfo[keynr].senna, &pos, NULL, 0, buf, (p - buf)); + free(buf); + DBUG_RETURN(0); + } +} + +int ft_sen_index_del(MI_INFO *info, uint keynr, const byte *record, my_off_t pos) +{ + if (info->s->keyinfo[keynr].senna_flags & SECTIONALIZE) { + FT_SEG_ITERATOR ftsi; + unsigned int section; + sen_values *values; + _mi_ft_segiterator_init(info, keynr, record, &ftsi); + while (_mi_ft_segiterator(&ftsi)) { + if (ftsi.pos) { + if (ftsi.len > 1048576) { SEN_LOG(sen_log_debug, "ft_sen_index_del: ftsi.len=%d", ftsi.len); } + } + } + _mi_ft_segiterator_init(info, keynr, record, &ftsi); + while (_mi_ft_segiterator(&ftsi)) { + if (ftsi.pos) { + section = ftsi.num + 1; + SEN_LOG(sen_log_debug, "ft_sen_index_del => sen_values_open"); + values = sen_values_open(); + SEN_LOG(sen_log_debug, "ft_sen_index_del => sen_values_add: values=%p, str=%s, str_len=%d, weight=%d", + values, ftsi.pos, ftsi.len, 0); + sen_values_add(values, ftsi.pos, ftsi.len, 0); + SEN_LOG(sen_log_info, "ft_sen_index_del => sen_index_update: index=%p, key=%p (pos=%d), section=%d, oldvalue=%p, newvalue=%p", + info->s->keyinfo[keynr].senna, &pos, (uint) pos, section, values, NULL); + sen_index_update(info->s->keyinfo[keynr].senna, &pos, section, values, NULL); + SEN_LOG(sen_log_debug, "ft_sen_index_del => sen_values_close: values=%p", values); + sen_values_close(values); + } + } + return 0; + } else { + FT_SEG_ITERATOR ftsi; + char *buf, *p; + uint len = 0; + _mi_ft_segiterator_init(info, keynr, record, &ftsi); + while (_mi_ft_segiterator(&ftsi)) { + if (ftsi.pos) { + if (ftsi.len > 1048576) { SEN_LOG(sen_log_debug, "ft_sen_index_del: ftsi.len=%d", ftsi.len); } + len += ftsi.len + 1; + } + } + if (!len) { return -1; } + if (!(p = buf = malloc(len))) { return -1; } + _mi_ft_segiterator_init(info, keynr, record, &ftsi); + while (_mi_ft_segiterator(&ftsi)) { + if (ftsi.pos) { + if (p != buf) { *p++ = ' '; } + memcpy(p, ftsi.pos, ftsi.len); + p += ftsi.len; + } + } + *p = '\0'; + SEN_LOG(sen_log_info, "ft_sen_index_add => sen_index_upd: index=%p, key=%p (pos=%d), oldvalue=%p," + "oldvalue_len=%d, newvalue=%p, newvalue_len=%d", + info->s->keyinfo[keynr].senna, &pos, (uint) pos, buf, (p - buf), NULL, 0); + sen_index_upd(info->s->keyinfo[keynr].senna, &pos, buf, (p - buf), NULL, 0); + free(buf); + return 0; + } +} +#endif /* ENABLE_SENNA */ /* update a document entry */ @@ -199,6 +336,13 @@ int _mi_ft_update(MI_INFO *info, uint ke int cmp, cmp2; DBUG_ENTER("_mi_ft_update"); +#ifdef ENABLE_SENNA + if (info->s->keyinfo[keynr].senna) + { + ft_sen_index_del(info, keynr, oldrec, pos); + ft_sen_index_add(info, keynr, newrec, pos); + } +#endif /* ENABLE_SENNA */ if (!(old_word=oldlist=_mi_ft_parserecord(info, keynr, oldrec))) goto err0; if (!(new_word=newlist=_mi_ft_parserecord(info, keynr, newrec))) @@ -249,6 +393,10 @@ int _mi_ft_add(MI_INFO *info, uint keynr FT_WORD *wlist; DBUG_ENTER("_mi_ft_add"); +#ifdef ENABLE_SENNA + if (info->s->keyinfo[keynr].senna) + ft_sen_index_add(info, keynr, record, pos); +#endif /* ENABLE_SENNA */ if ((wlist=_mi_ft_parserecord(info, keynr, record))) { error=_mi_ft_store(info,keynr,keybuf,wlist,pos); @@ -268,6 +416,10 @@ int _mi_ft_del(MI_INFO *info, uint keynr DBUG_ENTER("_mi_ft_del"); DBUG_PRINT("enter",("keynr: %d",keynr)); +#ifdef ENABLE_SENNA + if (info->s->keyinfo[keynr].senna) + ft_sen_index_del(info, keynr, record, pos); +#endif /* ENABLE_SENNA */ if ((wlist=_mi_ft_parserecord(info, keynr, record))) { error=_mi_ft_erase(info,keynr,keybuf,wlist,pos); @@ -351,3 +503,43 @@ uint _mi_ft_convert_to_ft2(MI_INFO *info SEARCH_SAME)); } +#ifdef ENABLE_SENNA +/* + this function is called by myisamchk only. +*/ +void ft_sen_index_truncate(MI_INFO *info) +{ + char buf[FN_REFLEN]; + MYISAM_SHARE *share= info->s; + uint i, keys= (uint) share->state.header.keys; + DBUG_ENTER("ft_sen_index_truncate"); + for (i=0 ; i < keys ; i++) + { + if (share->keyinfo[i].flag & HA_FULLTEXT) + { + if (share->keyinfo[i].senna) + { + sen_index_close(share->keyinfo[i].senna); + } + strcpy(buf, share->unique_file_name); + sprintf(buf + strlen(buf) - 3, "%03d", i); + if (share->keyinfo[i].senna_flags & SEN_DISABLE_SENNA) + { + share->keyinfo[i].senna = NULL; + } else { + if (!(share->keyinfo[i].senna_encoding >= 0 && share->keyinfo[i].senna_encoding <= 6)) + { + share->keyinfo[i].senna = NULL; + DBUG_VOID_RETURN; + } else { + share->keyinfo[i].senna = sen_index_create(buf, sizeof(my_off_t), + share->keyinfo[i].senna_flags, + share->keyinfo[i].senna_initial_n_segments, + share->keyinfo[i].senna_encoding); + } + } + } + } + DBUG_VOID_RETURN; +} +#endif /* ENABLE_SENNA */ --- orig/myisam/fulltext.h 2007-07-04 22:06:26.000000000 +0900 +++ new/myisam/fulltext.h 2007-10-29 10:14:15.000000000 +0900 @@ -35,3 +35,7 @@ int _mi_ft_del(MI_INFO *, uint, byte *, uint _mi_ft_convert_to_ft2(MI_INFO *, uint, uchar *); +#ifdef ENABLE_SENNA +int ft_sen_index_add(MI_INFO *info, uint keynr, const byte *record, my_off_t pos); +void ft_sen_index_truncate(MI_INFO *info); +#endif --- orig/myisam/mi_check.c 2007-07-04 22:06:41.000000000 +0900 +++ new/myisam/mi_check.c 2007-10-29 10:14:15.000000000 +0900 @@ -2107,7 +2107,6 @@ int mi_repair_by_sort(MI_CHECK *param, r SORT_INFO sort_info; ulonglong key_map=share->state.key_map; DBUG_ENTER("mi_repair_by_sort"); - start_records=info->state->records; got_error=1; new_file= -1; @@ -3020,6 +3019,11 @@ static int sort_ft_key_read(MI_SORT_PARA my_free((char*) wptr, MYF(MY_ALLOW_ZERO_PTR)); if ((error=sort_get_next_record(sort_param))) DBUG_RETURN(error); +#ifdef ENABLE_SENNA + if (info->s->keyinfo[sort_param->key].senna) { + ft_sen_index_add(info, sort_param->key, sort_param->record, sort_param->filepos); + } +#endif /* ENABLE_SENNA */ if (!(wptr=_mi_ft_parserecord(info,sort_param->key,sort_param->record))) DBUG_RETURN(1); if (wptr->pos) --- orig/myisam/mi_close.c 2007-07-04 22:06:27.000000000 +0900 +++ new/myisam/mi_close.c 2007-10-29 10:14:15.000000000 +0900 @@ -30,7 +30,6 @@ int mi_close(register MI_INFO *info) DBUG_PRINT("enter",("base: 0x%lx reopen: %u locks: %u", (long) info, (uint) share->reopen, (uint) share->tot_locks)); - pthread_mutex_lock(&THR_LOCK_myisam); if (info->lock_type == F_EXTRA_LCK) info->lock_type=F_UNLCK; /* HA_EXTRA_NO_USER_CHANGE */ @@ -98,6 +97,26 @@ int mi_close(register MI_INFO *info) keys = share->state.header.keys; for(i=0; ikey_root_lock[i])); + +#ifdef ENABLE_SENNA + if (share->keyinfo[i].flag & HA_FULLTEXT) + { + { + char buf[FN_REFLEN]; + strncpy(buf, share->unique_file_name, FN_REFLEN - 1); + buf[FN_REFLEN - 1] = '\0'; + sprintf(buf + strlen(buf) - 3, "%03d", i); + if (share->keyinfo[i].senna) { + SEN_LOG(sen_log_notice, "mi_close => sen_index_close: " + "delay_key_write=%d, unique_file_name=%s, data_file_name=%s, index_file_name=%s", + share->delay_key_write, share->unique_file_name, share->data_file_name, share->index_file_name); + sen_index_close(share->keyinfo[i].senna); + } + } + } +#endif /* ENABLE_SENNA */ + + } } #endif --- orig/myisam/mi_create.c 2007-07-04 22:05:47.000000000 +0900 +++ new/myisam/mi_create.c 2007-10-29 10:14:15.000000000 +0900 @@ -284,6 +284,59 @@ int mi_create(const char *name,uint keys } else if (keydef->flag & HA_FULLTEXT) { +#ifdef ENABLE_SENNA + sen_index *senna; + char buf[FN_REFLEN]; + strncpy(buf, name, FN_REFLEN - 1); + buf[FN_REFLEN - 1] = '\0'; + sprintf(buf + strlen(buf), ".%03d", i); + if (!(keydef->senna_flags & SEN_DISABLE_SENNA)) + { + /* make index files */ + SEN_LOG(sen_log_notice, + "mi_create => sen_index_create: path=%s, key_size=%d, flags=%x, ins=%d", buf, + sizeof(my_off_t), keydef->senna_flags, keydef->senna_initial_n_segments); + if (!(keydef->senna_encoding >= 0 && keydef->senna_encoding <= 6)) + { + my_errno= HA_WRONG_CREATE_OPTION; + goto err; + } + senna = sen_index_create(buf, sizeof(my_off_t), + keydef->senna_flags, + keydef->senna_initial_n_segments, + keydef->senna_encoding); + SEN_LOG(sen_log_notice, "mi_create => sen_index_close: index=%p", senna); + sen_index_close(senna); + } else { + SEN_LOG(sen_log_notice, "mi_create => sen_index_open: path=%s", buf); + senna = sen_index_open(buf); + if (senna) { + int senna_flags, senna_initial_n_segments; + sen_encoding senna_encoding; + SEN_LOG(sen_log_info, "mi_create => sen_index_info: index=%p", senna); + sen_index_info(senna, NULL, &senna_flags, &senna_initial_n_segments, + &senna_encoding, NULL, NULL, NULL, NULL, NULL, NULL); + SEN_LOG(sen_log_notice, "mi_create => sen_index_close: index=%p", senna); + sen_index_close(senna); + SEN_LOG(sen_log_notice, "mi_create => sen_index_remove: path=%s", buf); + sen_index_remove(buf); + SEN_LOG(sen_log_notice, + "mi_create => sen_index_create: path=%s, key_size=%d, flags=%x ins=%d)", buf, + sizeof(my_off_t), senna_flags, senna_initial_n_segments); + if (!(senna_encoding >= 0 && senna_encoding <= 6)) + { + my_errno= HA_WRONG_CREATE_OPTION; + goto err; + } + senna = sen_index_create(buf, sizeof(my_off_t), + senna_flags, + senna_initial_n_segments, + senna_encoding); + SEN_LOG(sen_log_notice, "mi_create => sen_index_close: index=%p", senna); + sen_index_close(senna); + } + } +#endif /* ENABLE_SENNA */ keydef->flag=HA_FULLTEXT | HA_PACK_KEY | HA_VAR_LENGTH_KEY; options|=HA_OPTION_PACK_KEYS; /* Using packed keys */ --- orig/myisam/mi_delete_all.c 2007-07-04 22:06:04.000000000 +0900 +++ new/myisam/mi_delete_all.c 2007-10-29 10:14:15.000000000 +0900 @@ -34,6 +34,34 @@ int mi_delete_all_rows(MI_INFO *info) if (_mi_mark_file_changed(info)) goto err; +#ifdef ENABLE_SENNA + for (i = 0; i < share->base.keys; i++) { + sen_index *senna = share->keyinfo[i].senna; + if (senna) + { + char buf[FN_REFLEN]; + if (!(share->keyinfo[i].senna_encoding >= 0 && share->keyinfo[i].senna_encoding <= 6)) + { + my_errno= HA_WRONG_CREATE_OPTION; + goto err; + } + SEN_LOG(sen_log_debug, "mi_delete_all_rows => sen_index_path: index=%p, buf=%s", senna, buf); + sen_index_path(senna, buf, FN_REFLEN); + SEN_LOG(sen_log_notice, "mi_delete_all_rows => sen_index_close: index=%p", senna); + sen_index_close(senna); + SEN_LOG(sen_log_notice, "mi_delete_all_rows => sen_index_remove: buf=%s", buf); + sen_index_remove(buf); + SEN_LOG(sen_log_notice, "mi_delete_all_rows => sen_index_create: path=%s, flags=%x, ins=%d", + buf, share->keyinfo[i].senna_flags, share->keyinfo[i].senna_initial_n_segments); + senna = sen_index_create(buf, sizeof(my_off_t), + share->keyinfo[i].senna_flags, + share->keyinfo[i].senna_initial_n_segments, + share->keyinfo[i].senna_encoding); + share->keyinfo[i].senna = senna; + } + } +#endif /* ENABLE_SENNA */ + info->state->records=info->state->del=state->split=0; state->dellink = HA_OFFSET_ERROR; state->sortkey= (ushort) ~0; --- orig/myisam/mi_delete_table.c 2007-07-04 22:05:33.000000000 +0900 +++ new/myisam/mi_delete_table.c 2007-10-29 10:14:15.000000000 +0900 @@ -57,6 +57,32 @@ int mi_delete_table(const char *name) #endif #endif /* USE_RAID */ +#ifdef ENABLE_SENNA + { + int i; + MI_INFO *mi_info; + MI_INFO cp_of_mi_info; + + if (!(mi_info = mi_open(name, O_RDONLY, 0))) + { + SEN_LOG(sen_log_warning, "mi_delete_table => cannot get MI_INFO"); + DBUG_RETURN(my_errno); + } + + cp_of_mi_info = *mi_info; + mi_close(mi_info); + + for (i = 0; i < cp_of_mi_info.s->state.header.keys; i++) + { + if (cp_of_mi_info.s->keyinfo[i].senna) + { + my_snprintf(from, FN_REFLEN, "%s.%03d", name, i); + SEN_LOG(sen_log_notice, "mi_delete_table => sen_index_remove: path=%s", from); + sen_index_remove(from); + } + } + } +#endif /* ENABLE_SENNA */ fn_format(from,name,"",MI_NAME_IEXT,4); if (my_delete_with_symlink(from, MYF(MY_WME))) DBUG_RETURN(my_errno); --- orig/myisam/mi_info.c 2007-07-04 22:06:22.000000000 +0900 +++ new/myisam/mi_info.c 2007-10-29 10:14:15.000000000 +0900 @@ -60,6 +60,26 @@ int mi_status(MI_INFO *info, register MI x->mean_reclength= x->records ? (ulong) ((x->data_file_length - x->delete_length) / x->records) : (ulong) share->min_pack_length; +#ifdef ENABLE_SENNA + if ((flag & HA_STATUS_SENNA) && share->keyinfo) + { + int i; + for (i = 0; i < share->base.keys; i++) + { + MI_KEYDEF *keydef = &share->keyinfo[i]; + sen_index *senna = keydef->senna; + if (senna) + { + SEN_LOG(sen_log_info, "mi_info => sen_index_info: index=%p", senna); + sen_index_info(senna, NULL, &keydef->senna_flags, + &keydef->senna_initial_n_segments, &keydef->senna_encoding, + &keydef->senna_keys_size, &keydef->senna_keys_file_size, + &keydef->senna_lexicon_size, &keydef->senna_lexicon_file_size, + &keydef->senna_inv_seg_size, &keydef->senna_inv_chunk_size); + } + } + } +#endif /* ENABLE_SENNA */ } if (flag & HA_STATUS_ERRKEY) { --- orig/myisam/mi_open.c 2007-07-04 22:06:08.000000000 +0900 +++ new/myisam/mi_open.c 2007-10-29 10:14:15.000000000 +0900 @@ -344,6 +344,11 @@ MI_INFO *mi_open(const char *name, int m else if (pos->type == HA_KEYTYPE_BINARY) pos->charset= &my_charset_bin; } +#ifdef ENABLE_SENNA + share->keyinfo[i].senna = NULL; + share->keyinfo[i].senna_flags = 0; + share->keyinfo[i].senna_initial_n_segments = 0; +#endif /* ENABLE_SENNA */ if (share->keyinfo[i].flag & HA_SPATIAL) { #ifdef HAVE_SPATIAL @@ -357,6 +362,29 @@ MI_INFO *mi_open(const char *name, int m } else if (share->keyinfo[i].flag & HA_FULLTEXT) { +#ifdef ENABLE_SENNA + if (!(share->keyinfo[i].senna_flags & SEN_DISABLE_SENNA)) + { + { + char buf[FN_REFLEN]; + strncpy(buf, share->unique_file_name, FN_REFLEN - 1); + buf[FN_REFLEN - 1] = '\0'; + sprintf(buf + strlen(buf) - 3, "%03d", i); + SEN_LOG(sen_log_notice, "mi_open => " + "sen_index_open: path=%s, delay_key_write=%d, unique_file_name=%s, data_file_name=%s, " + "index_file_name=%s, keyinfo[%d].seg=%d", + buf, share->delay_key_write, share->unique_file_name, share->data_file_name, + share->index_file_name, i, pos-FT_SEGS); + share->keyinfo[i].senna = sen_index_open(buf); + SEN_LOG(sen_log_info, "mi_open => sen_index_info: index=%p", share->keyinfo[i].senna); + sen_index_info(share->keyinfo[i].senna, NULL, + &share->keyinfo[i].senna_flags, + &share->keyinfo[i].senna_initial_n_segments, + &share->keyinfo[i].senna_encoding, + NULL, NULL, NULL, NULL, NULL, NULL); + } + } +#endif /* ENABLE_SENNA */ if (!fulltext_keys) { /* 4.0 compatibility code, to be removed in 5.0 */ share->keyinfo[i].seg=pos-FT_SEGS; --- orig/myisam/mi_rename.c 2007-07-04 22:06:48.000000000 +0900 +++ new/myisam/mi_rename.c 2007-10-29 10:14:15.000000000 +0900 @@ -45,6 +45,33 @@ int mi_rename(const char *old_name, cons #endif #endif /* USE_RAID */ +#ifdef ENABLE_SENNA /* nkjm modified 2007/06/04 SFID:10291 */ + { + int i, keys; + MI_INFO *mi_info; + MI_INFO cp_of_mi_info; + + if (!(mi_info = mi_open(old_name, O_RDONLY, 0))) + { + SEN_LOG(sen_log_warning, "mi_rename => cannot get MI_INFO"); + DBUG_RETURN(my_errno); + } + + cp_of_mi_info = *mi_info; + mi_close(mi_info); + keys = cp_of_mi_info.s->base.keys; + for (i = 0; i < keys; i++) + { + if (cp_of_mi_info.s->keyinfo[i].senna) + { + my_snprintf(from, FN_REFLEN, "%s.%03d", old_name, i); + my_snprintf(to, FN_REFLEN, "%s.%03d", new_name, i); + SEN_LOG(sen_log_notice, "mi_rename => sen_index_rename: from=%s, to=%s", from, to); + sen_index_rename(from, to); + } + } + } +#endif /* ENABLE_SENNA */ fn_format(from,old_name,"",MI_NAME_IEXT,4); fn_format(to,new_name,"",MI_NAME_IEXT,4); if (my_rename_with_symlink(from, to, MYF(MY_WME))) --- orig/myisam/myisam_ftdump.c 2007-07-04 22:06:09.000000000 +0900 +++ new/myisam/myisam_ftdump.c 2007-10-29 10:14:15.000000000 +0900 @@ -63,6 +63,9 @@ int main(int argc,char *argv[]) struct { MI_INFO *info; } aio0, *aio=&aio0; /* for GWS_IN_USE */ MY_INIT(argv[0]); +#ifdef ENABLE_SENNA + sen_init(); +#endif /* ENABLE_SENNA */ if ((error= handle_options(&argc, &argv, my_long_options, get_one_option))) exit(error); if (count || dump) --- orig/myisam/myisamchk.c 2007-07-04 22:06:33.000000000 +0900 +++ new/myisam/myisamchk.c 2007-10-29 10:14:15.000000000 +0900 @@ -101,6 +101,9 @@ int main(int argc, char **argv) get_options(&argc,(char***) &argv); myisam_quick_table_bits=decode_bits; error=0; +#ifdef ENABLE_SENNA + sen_init(); +#endif /* ENABLE_SENNA */ while (--argc >= 0) { int new_error=myisamchk(&check_param, *(argv++)); @@ -1010,6 +1013,9 @@ static int myisamchk(MI_CHECK *param, my } if (!error) { +#ifdef ENABLE_SENNA + ft_sen_index_truncate(info); +#endif /* ENABLE_SENNA */ if ((param->testflag & (T_REP_BY_SORT | T_REP_PARALLEL)) && (mi_is_any_key_active(share->state.key_map) || (rep_quick && !param->keys_in_use && !recreate)) && @@ -1066,6 +1072,9 @@ static int myisamchk(MI_CHECK *param, my { if (param->verbose) puts("Table had a compressed index; We must now recreate the index"); +#ifdef ENABLE_SENNA + ft_sen_index_truncate(info); +#endif /* ENABLE_SENNA */ error=mi_repair_by_sort(param,info,filename,1); } } --- orig/myisam/myisamlog.c 2007-07-04 22:06:09.000000000 +0900 +++ new/myisam/myisamlog.c 2007-10-29 10:14:15.000000000 +0900 @@ -84,6 +84,9 @@ int main(int argc, char **argv) int error,i,first; ulong total_count,total_error,total_recover; MY_INIT(argv[0]); +#ifdef ENABLE_SENNA + sen_init(); +#endif /* ENABLE_SENNA */ log_filename=myisam_log_filename; get_options(&argc,&argv); --- orig/myisam/myisampack.c 2007-07-04 22:06:00.000000000 +0900 +++ new/myisam/myisampack.c 2007-10-29 10:14:15.000000000 +0900 @@ -207,6 +207,9 @@ int main(int argc, char **argv) PACK_MRG_INFO merge; char **default_argv; MY_INIT(argv[0]); +#ifdef ENABLE_SENNA + sen_init(); +#endif /* ENABLE_SENNA */ load_defaults("my",load_default_groups,&argc,&argv); default_argv= argv; --- orig/myisammrg/Makefile.am 2007-07-04 22:06:05.000000000 +0900 +++ new/myisammrg/Makefile.am 2007-10-29 10:14:29.000000000 +0900 @@ -13,7 +13,8 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include +INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include \ + @SENNA_INCLUDES@ @MECAB_INCLUDES@ pkglib_LIBRARIES = libmyisammrg.a noinst_HEADERS = myrg_def.h libmyisammrg_a_SOURCES = myrg_open.c myrg_extra.c myrg_info.c myrg_locking.c \ --- orig/mysql-test/suite/mecab/r/mecab_utf8.result 1970-01-01 09:00:00.000000000 +0900 +++ new/mysql-test/suite/mecab/r/mecab_utf8.result 2007-10-29 10:13:50.000000000 +0900 @@ -0,0 +1,798 @@ +SET NAMES utf8; +SELECT "===== TESTS for MeCab started ====="; +===== TESTS for MeCab started ===== +===== TESTS for MeCab started ===== +SELECT "===== creating test data started ====="; +===== creating test data started ===== +===== creating test data started ===== +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 ( +c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 TEXT, +FULLTEXT INDEX ft USING MECAB (c2) +) ENGINE = MyISAM DEFAULT CHARSET utf8; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL auto_increment, + `c2` text, + PRIMARY KEY (`c1`), + FULLTEXT KEY `ft` (`c2`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c2 utf8 MECAB OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +INSERT INTO t1 (c2) VALUES ("世界で最もポピュラーなオープンソースデータベースMySQL"); +INSERT INTO t1 (c2) VALUES ("住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。"); +INSERT INTO t1 (c2) VALUES ("他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。"); +INSERT INTO t1 (c2) VALUES ("商用ライセンスは有料ですが、再配布なども自由に行えます。"); +INSERT INTO t1 (c2) VALUES ("信頼性と可用性は、MySQLの大きな特徴です。"); +INSERT INTO t1 (c2) VALUES ("企業のデータを適切に管理することは、DBAの最も大きな仕事です。"); +INSERT INTO t1 (c2) VALUES ("MySQLは優れたセキュリティ機能を提供しています。"); +INSERT INTO t1 (c2) VALUES ("ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。"); +INSERT INTO t1 (c2) VALUES ("MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。"); +INSERT INTO t1 (c2) VALUES ("MySQL Clusterはメモリベースの高速ストレージエンジンです。"); +INSERT INTO t1 (c2) VALUES ("GPLライセンスに基づいてソフトウェアの再配布を行うことができます"); +INSERT INTO t1 (c2) VALUES ("高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。"); +INSERT INTO t1 (c2) VALUES ("GPLソフトウェアは無料ですが、サービスは有料です。"); +INSERT INTO t1 (c2) VALUES ("システム管理工学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("理工学部で物理学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工*です。"); +INSERT INTO t1 (c2) VALUES ("東の湖にて水泳大会を行います。"); +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +INSERT INTO t1 (c2) VALUES ("御両親の印鑑を押してもらって明日持ってきてください、成績表"); +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 宛名書きは住商情報システム㈱でお願いいたします。 +20 ファイナルファンタジーⅶを1本下さい。 +21 NEC選定IBM拡張文字の淼について今日はお話いたします。 +22 日本語の文字の種類のひとつとして半角カタカナがある。 +23 御両親の印鑑を押してもらって明日持ってきてください、成績表 +SELECT "===== creating test data finished ====="; +===== creating test data finished ===== +===== creating test data finished ===== +SELECT "===== tests for FULLTEXT search started ====="; +===== tests for FULLTEXT search started ===== +===== tests for FULLTEXT search started ===== +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 宛名書きは住商情報システム㈱でお願いいたします。 +20 ファイナルファンタジーⅶを1本下さい。 +21 NEC選定IBM拡張文字の淼について今日はお話いたします。 +22 日本語の文字の種類のひとつとして半角カタカナがある。 +23 御両親の印鑑を押してもらって明日持ってきてください、成績表 +SELECT c1, MATCH(c2) AGAINST("再配布") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("再配布"); +c1 score c2 +4 1 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 1 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("機能") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("機能"); +c1 score c2 +7 1 MySQLは優れたセキュリティ機能を提供しています。 +12 2 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("最新"); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+有料" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 +有料" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -有料" IN BOOLEAN MODE); +c1 c2 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE); +c1 score c2 +2 5 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +4 10 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 5 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE); +c1 score c2 +4 4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 5 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE); +c1 score c2 +4 9 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 5 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("OR 商用 OR 教えて" IN BOOLEAN MODE); +c1 c2 +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -(OR 商用 OR 教えて)" IN BOOLEAN MODE); +c1 c2 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('"DBMS"' IN BOOLEAN MODE); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*D- +再配布 自由' IN BOOLEAN MODE); +c1 c2 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -特徴' IN BOOLEAN MODE); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -鳥取 -特徴' IN BOOLEAN MODE); +c1 c2 +5 信頼性と可用性は、MySQLの大きな特徴です。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N100"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N8"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N7"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N6"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N5"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N4"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N3"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N2"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N1"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N0"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +c1 c2 +19 宛名書きは住商情報システム㈱でお願いいたします。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +c1 c2 +20 ファイナルファンタジーⅶを1本下さい。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +c1 c2 +21 NEC選定IBM拡張文字の淼について今日はお話いたします。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +c1 c2 +22 日本語の文字の種類のひとつとして半角カタカナがある。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("成績表"); +c1 c2 +23 御両親の印鑑を押してもらって明日持ってきてください、成績表 +SELECT "===== tests for FULLTEXT search finished ====="; +===== tests for FULLTEXT search finished ===== +===== tests for FULLTEXT search finished ===== +SELECT "===== tests for INSERT started ====="; +===== tests for INSERT started ===== +===== tests for INSERT started ===== +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 宛名書きは住商情報システム㈱でお願いいたします。 +20 ファイナルファンタジーⅶを1本下さい。 +21 NEC選定IBM拡張文字の淼について今日はお話いたします。 +22 日本語の文字の種類のひとつとして半角カタカナがある。 +23 御両親の印鑑を押してもらって明日持ってきてください、成績表 +INSERT INTO t1 (c2) VALUES ("普段から緊急事態に備えておかなければならない。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +c1 c2 +24 普段から緊急事態に備えておかなければならない。 +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +c1 c2 +19 宛名書きは住商情報システム㈱でお願いいたします。 +25 宛名書きは住商情報システム㈱でお願いいたします。 +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +c1 c2 +20 ファイナルファンタジーⅶを1本下さい。 +26 ファイナルファンタジーⅶを1本下さい。 +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +c1 c2 +21 NEC選定IBM拡張文字の淼について今日はお話いたします。 +27 NEC選定IBM拡張文字の淼について今日はお話いたします。 +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +c1 c2 +22 日本語の文字の種類のひとつとして半角カタカナがある。 +28 日本語の文字の種類のひとつとして半角カタカナがある。 +INSERT INTO t1 (c2) VALUES ("職員室に忘れて置いてきてしまった出席表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("出席表"); +c1 c2 +29 職員室に忘れて置いてきてしまった出席表 +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 宛名書きは住商情報システム㈱でお願いいたします。 +20 ファイナルファンタジーⅶを1本下さい。 +21 NEC選定IBM拡張文字の淼について今日はお話いたします。 +22 日本語の文字の種類のひとつとして半角カタカナがある。 +23 御両親の印鑑を押してもらって明日持ってきてください、成績表 +24 普段から緊急事態に備えておかなければならない。 +25 宛名書きは住商情報システム㈱でお願いいたします。 +26 ファイナルファンタジーⅶを1本下さい。 +27 NEC選定IBM拡張文字の淼について今日はお話いたします。 +28 日本語の文字の種類のひとつとして半角カタカナがある。 +29 職員室に忘れて置いてきてしまった出席表 +SELECT "===== tests for INSERT finished ====="; +===== tests for INSERT finished ===== +===== tests for INSERT finished ===== +SELECT "===== tests for DELETE started ====="; +===== tests for DELETE started ===== +===== tests for DELETE started ===== +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 宛名書きは住商情報システム㈱でお願いいたします。 +20 ファイナルファンタジーⅶを1本下さい。 +21 NEC選定IBM拡張文字の淼について今日はお話いたします。 +22 日本語の文字の種類のひとつとして半角カタカナがある。 +23 御両親の印鑑を押してもらって明日持ってきてください、成績表 +24 普段から緊急事態に備えておかなければならない。 +25 宛名書きは住商情報システム㈱でお願いいたします。 +26 ファイナルファンタジーⅶを1本下さい。 +27 NEC選定IBM拡張文字の淼について今日はお話いたします。 +28 日本語の文字の種類のひとつとして半角カタカナがある。 +29 職員室に忘れて置いてきてしまった出席表 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("淼"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("表"); +c1 c2 +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +SELECT "===== tests for DELETE finished ====="; +===== tests for DELETE finished ===== +===== tests for DELETE finished ===== +SELECT "===== tests for errors started ====="; +===== tests for errors started ===== +===== tests for errors started ===== +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー"); +ERROR HY000: Can't find FULLTEXT index matching the column list +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー" IN BOOLEAN MODE); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー"); +ERROR 42S22: Unknown column 'c3' in 'where clause' +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー" IN BOOLEAN MODE); +ERROR 42S22: Unknown column 'c3' in 'where clause' +SELECT "===== tests for error finished ====="; +===== tests for error finished ===== +===== tests for error finished ===== +DROP TABLE t1; +SELECT "===== TESTS for MeCab finished ====="; +===== TESTS for MeCab finished ===== +===== TESTS for MeCab finished ===== +SELECT "===== TESTS for Ngram started ====="; +===== TESTS for Ngram started ===== +===== TESTS for Ngram started ===== +SELECT "===== creating test data started ====="; +===== creating test data started ===== +===== creating test data started ===== +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 ( +c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 TEXT, +FULLTEXT INDEX ft USING NGRAM(c2) +) ENGINE = MyISAM DEFAULT CHARSET utf8; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL auto_increment, + `c2` text, + PRIMARY KEY (`c1`), + FULLTEXT KEY `ft` (`c2`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c2 utf8 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +INSERT INTO t1 (c2) VALUES ("世界で最もポピュラーなオープンソースデータベースMySQL"); +INSERT INTO t1 (c2) VALUES ("住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。"); +INSERT INTO t1 (c2) VALUES ("他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。"); +INSERT INTO t1 (c2) VALUES ("商用ライセンスは有料ですが、再配布なども自由に行えます。"); +INSERT INTO t1 (c2) VALUES ("信頼性と可用性は、MySQLの大きな特徴です。"); +INSERT INTO t1 (c2) VALUES ("企業のデータを適切に管理することは、DBAの最も大きな仕事です。"); +INSERT INTO t1 (c2) VALUES ("MySQLは優れたセキュリティ機能を提供しています。"); +INSERT INTO t1 (c2) VALUES ("ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。"); +INSERT INTO t1 (c2) VALUES ("MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。"); +INSERT INTO t1 (c2) VALUES ("MySQL Clusterはメモリベースの高速ストレージエンジンです。"); +INSERT INTO t1 (c2) VALUES ("GPLライセンスに基づいてソフトウェアの再配布を行うことができます"); +INSERT INTO t1 (c2) VALUES ("高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。"); +INSERT INTO t1 (c2) VALUES ("GPLソフトウェアは無料ですが、サービスは有料です。"); +INSERT INTO t1 (c2) VALUES ("システム管理工学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("理工学部で物理学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工*です。"); +INSERT INTO t1 (c2) VALUES ("東の湖にて水泳大会を行います。"); +INSERT INTO t1 (c2) VALUES ("先生、その件について詳しく教えて下さい。"); +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +INSERT INTO t1 (c2) VALUES ("御両親の印鑑を押してもらって明日持ってきてください、成績表"); +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム㈱でお願いいたします。 +21 ファイナルファンタジーⅶを1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +SELECT "===== creating test data finished ====="; +===== creating test data finished ===== +===== creating test data finished ===== +SELECT "===== tests for FULLTEXT search started ====="; +===== tests for FULLTEXT search started ===== +===== tests for FULLTEXT search started ===== +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム㈱でお願いいたします。 +21 ファイナルファンタジーⅶを1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +SELECT c1, MATCH(c2) AGAINST("再配布") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("再配布"); +c1 score c2 +4 1 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 1 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("機能") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("機能"); +c1 score c2 +7 1 MySQLは優れたセキュリティ機能を提供しています。 +12 2 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("最新"); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+有料" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 +有料" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -有料" IN BOOLEAN MODE); +c1 c2 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE); +c1 score c2 +2 5 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +4 10 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 5 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE); +c1 score c2 +4 4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 5 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE); +c1 score c2 +4 9 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 5 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("OR 商用 OR 教えて" IN BOOLEAN MODE); +c1 c2 +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +19 先生、その件について詳しく教えて下さい。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -(OR 商用 OR 教えて)" IN BOOLEAN MODE); +c1 c2 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('"DBMS"' IN BOOLEAN MODE); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*D- +再配布 自由' IN BOOLEAN MODE); +c1 c2 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -特徴' IN BOOLEAN MODE); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -鳥取 -特徴' IN BOOLEAN MODE); +c1 c2 +5 信頼性と可用性は、MySQLの大きな特徴です。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N100"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N8"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N7"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N6"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N5"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N4"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N3"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N2"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N1"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N0"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +c1 c2 +20 宛名書きは住商情報システム㈱でお願いいたします。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +c1 c2 +21 ファイナルファンタジーⅶを1本下さい。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +c1 c2 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +c1 c2 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("成績表"); +c1 c2 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +SELECT "===== tests for FULLTEXT search finished ====="; +===== tests for FULLTEXT search finished ===== +===== tests for FULLTEXT search finished ===== +SELECT "===== tests for INSERT started ====="; +===== tests for INSERT started ===== +===== tests for INSERT started ===== +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム㈱でお願いいたします。 +21 ファイナルファンタジーⅶを1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +INSERT INTO t1 (c2) VALUES ("普段から緊急事態に備えておかなければならない。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +c1 c2 +25 普段から緊急事態に備えておかなければならない。 +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +c1 c2 +20 宛名書きは住商情報システム㈱でお願いいたします。 +26 宛名書きは住商情報システム㈱でお願いいたします。 +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +c1 c2 +21 ファイナルファンタジーⅶを1本下さい。 +27 ファイナルファンタジーⅶを1本下さい。 +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +c1 c2 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +28 NEC選定IBM拡張文字の淼について今日はお話いたします。 +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +c1 c2 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +29 日本語の文字の種類のひとつとして半角カタカナがある。 +INSERT INTO t1 (c2) VALUES ("職員室に忘れて置いてきてしまった出席表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("出席表"); +c1 c2 +30 職員室に忘れて置いてきてしまった出席表 +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム㈱でお願いいたします。 +21 ファイナルファンタジーⅶを1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +25 普段から緊急事態に備えておかなければならない。 +26 宛名書きは住商情報システム㈱でお願いいたします。 +27 ファイナルファンタジーⅶを1本下さい。 +28 NEC選定IBM拡張文字の淼について今日はお話いたします。 +29 日本語の文字の種類のひとつとして半角カタカナがある。 +30 職員室に忘れて置いてきてしまった出席表 +SELECT "===== tests for INSERT finished ====="; +===== tests for INSERT finished ===== +===== tests for INSERT finished ===== +SELECT "===== tests for DELETE started ====="; +===== tests for DELETE started ===== +===== tests for DELETE started ===== +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム㈱でお願いいたします。 +21 ファイナルファンタジーⅶを1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +25 普段から緊急事態に備えておかなければならない。 +26 宛名書きは住商情報システム㈱でお願いいたします。 +27 ファイナルファンタジーⅶを1本下さい。 +28 NEC選定IBM拡張文字の淼について今日はお話いたします。 +29 日本語の文字の種類のひとつとして半角カタカナがある。 +30 職員室に忘れて置いてきてしまった出席表 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("淼"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("表"); +c1 c2 +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +SELECT "===== tests for DELETE finished ====="; +===== tests for DELETE finished ===== +===== tests for DELETE finished ===== +SELECT "===== tests for errors started ====="; +===== tests for errors started ===== +===== tests for errors started ===== +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー"); +ERROR HY000: Can't find FULLTEXT index matching the column list +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー" IN BOOLEAN MODE); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー"); +ERROR 42S22: Unknown column 'c3' in 'where clause' +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー" IN BOOLEAN MODE); +ERROR 42S22: Unknown column 'c3' in 'where clause' +SELECT "===== tests for error finished ====="; +===== tests for error finished ===== +===== tests for error finished ===== +DROP TABLE t1; +SELECT "===== TESTS for Ngram finished ====="; +===== TESTS for Ngram finished ===== +===== TESTS for Ngram finished ===== --- orig/mysql-test/suite/mecab/t/mecab_utf8.test 1970-01-01 09:00:00.000000000 +0900 +++ new/mysql-test/suite/mecab/t/mecab_utf8.test 2007-10-29 10:13:50.000000000 +0900 @@ -0,0 +1,318 @@ +# utf8 test + +SET NAMES utf8; + +# TESTS for MeCab +SELECT "===== TESTS for MeCab started ====="; + +SELECT "===== creating test data started ====="; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +CREATE TABLE t1 ( + c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 TEXT, + FULLTEXT INDEX ft USING MECAB (c2) +) ENGINE = MyISAM DEFAULT CHARSET utf8; + +SHOW CREATE TABLE t1; +SHOW SENNA STATUS; + +INSERT INTO t1 (c2) VALUES ("世界で最もポピュラーなオープンソースデータベースMySQL"); +INSERT INTO t1 (c2) VALUES ("住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。"); +INSERT INTO t1 (c2) VALUES ("他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。"); +INSERT INTO t1 (c2) VALUES ("商用ライセンスは有料ですが、再配布なども自由に行えます。"); +INSERT INTO t1 (c2) VALUES ("信頼性と可用性は、MySQLの大きな特徴です。"); +INSERT INTO t1 (c2) VALUES ("企業のデータを適切に管理することは、DBAの最も大きな仕事です。"); +INSERT INTO t1 (c2) VALUES ("MySQLは優れたセキュリティ機能を提供しています。"); +INSERT INTO t1 (c2) VALUES ("ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。"); +INSERT INTO t1 (c2) VALUES ("MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。"); +INSERT INTO t1 (c2) VALUES ("MySQL Clusterはメモリベースの高速ストレージエンジンです。"); +INSERT INTO t1 (c2) VALUES ("GPLライセンスに基づいてソフトウェアの再配布を行うことができます"); +INSERT INTO t1 (c2) VALUES ("高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。"); +INSERT INTO t1 (c2) VALUES ("GPLソフトウェアは無料ですが、サービスは有料です。"); +INSERT INTO t1 (c2) VALUES ("システム管理工学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("理工学部で物理学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工*です。"); +INSERT INTO t1 (c2) VALUES ("東の湖にて水泳大会を行います。"); +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +INSERT INTO t1 (c2) VALUES ("御両親の印鑑を押してもらって明日持ってきてください、成績表"); + +SELECT * FROM t1; +SELECT "===== creating test data finished ====="; + +# tests for FULLTEXT search + +SELECT "===== tests for FULLTEXT search started ====="; +SELECT * FROM t1; + +SELECT c1, MATCH(c2) AGAINST("再配布") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("再配布"); +SELECT c1, MATCH(c2) AGAINST("機能") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("機能"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("最新"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+有料" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 +有料" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -有料" IN BOOLEAN MODE); +SELECT c1, MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE); +SELECT c1, MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE); +SELECT c1, MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("OR 商用 OR 教えて" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -(OR 商用 OR 教えて)" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('"DBMS"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*D- +再配布 自由' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -特徴' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -鳥取 -特徴' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N100"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N8"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N7"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N6"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N5"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N4"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N3"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N2"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N1"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N0"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("成績表"); + +SELECT "===== tests for FULLTEXT search finished ====="; + +# tests for INSERT + +SELECT "===== tests for INSERT started ====="; +SELECT * FROM t1; + +INSERT INTO t1 (c2) VALUES ("普段から緊急事態に備えておかなければならない。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); + +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); + +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); + +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); + +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); + +INSERT INTO t1 (c2) VALUES ("職員室に忘れて置いてきてしまった出席表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("出席表"); + +SELECT * FROM t1; +SELECT "===== tests for INSERT finished ====="; + +# tests for DELETE + +SELECT "===== tests for DELETE started ====="; +SELECT * FROM t1; + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("淼"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("表"); + +SELECT * FROM t1; +SELECT "===== tests for DELETE finished ====="; + +# tests for errors + +SELECT "===== tests for errors started ====="; + +--error 1191 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー" IN BOOLEAN MODE); + +--error 1054 +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー"); +--error 1054 +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー" IN BOOLEAN MODE); + +SELECT "===== tests for error finished ====="; + +DROP TABLE t1; +SELECT "===== TESTS for MeCab finished ====="; + +########################################################## + +# TESTS for Ngram +SELECT "===== TESTS for Ngram started ====="; + +SELECT "===== creating test data started ====="; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +CREATE TABLE t1 ( + c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 TEXT, + FULLTEXT INDEX ft USING NGRAM(c2) +) ENGINE = MyISAM DEFAULT CHARSET utf8; + +SHOW CREATE TABLE t1; +SHOW SENNA STATUS; + +INSERT INTO t1 (c2) VALUES ("世界で最もポピュラーなオープンソースデータベースMySQL"); +INSERT INTO t1 (c2) VALUES ("住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。"); +INSERT INTO t1 (c2) VALUES ("他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。"); +INSERT INTO t1 (c2) VALUES ("商用ライセンスは有料ですが、再配布なども自由に行えます。"); +INSERT INTO t1 (c2) VALUES ("信頼性と可用性は、MySQLの大きな特徴です。"); +INSERT INTO t1 (c2) VALUES ("企業のデータを適切に管理することは、DBAの最も大きな仕事です。"); +INSERT INTO t1 (c2) VALUES ("MySQLは優れたセキュリティ機能を提供しています。"); +INSERT INTO t1 (c2) VALUES ("ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。"); +INSERT INTO t1 (c2) VALUES ("MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。"); +INSERT INTO t1 (c2) VALUES ("MySQL Clusterはメモリベースの高速ストレージエンジンです。"); +INSERT INTO t1 (c2) VALUES ("GPLライセンスに基づいてソフトウェアの再配布を行うことができます"); +INSERT INTO t1 (c2) VALUES ("高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。"); +INSERT INTO t1 (c2) VALUES ("GPLソフトウェアは無料ですが、サービスは有料です。"); +INSERT INTO t1 (c2) VALUES ("システム管理工学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("理工学部で物理学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工*です。"); +INSERT INTO t1 (c2) VALUES ("東の湖にて水泳大会を行います。"); +INSERT INTO t1 (c2) VALUES ("先生、その件について詳しく教えて下さい。"); +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +INSERT INTO t1 (c2) VALUES ("御両親の印鑑を押してもらって明日持ってきてください、成績表"); + +SELECT * FROM t1; +SELECT "===== creating test data finished ====="; + +# tests for FULLTEXT search + +SELECT "===== tests for FULLTEXT search started ====="; +SELECT * FROM t1; + +SELECT c1, MATCH(c2) AGAINST("再配布") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("再配布"); +SELECT c1, MATCH(c2) AGAINST("機能") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("機能"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("最新"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+有料" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 +有料" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -有料" IN BOOLEAN MODE); +SELECT c1, MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE); +SELECT c1, MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE); +SELECT c1, MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("OR 商用 OR 教えて" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -(OR 商用 OR 教えて)" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('"DBMS"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*D- +再配布 自由' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -特徴' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -鳥取 -特徴' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N100"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N8"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N7"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N6"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N5"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N4"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N3"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N2"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N1"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N0"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("成績表"); + +SELECT "===== tests for FULLTEXT search finished ====="; + +# tests for INSERT + +SELECT "===== tests for INSERT started ====="; +SELECT * FROM t1; + +INSERT INTO t1 (c2) VALUES ("普段から緊急事態に備えておかなければならない。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); + +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); + +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); + +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); + +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); + +INSERT INTO t1 (c2) VALUES ("職員室に忘れて置いてきてしまった出席表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("出席表"); + +SELECT * FROM t1; +SELECT "===== tests for INSERT finished ====="; + +# tests for DELETE + +SELECT "===== tests for DELETE started ====="; +SELECT * FROM t1; + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("淼"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("表"); + +SELECT * FROM t1; +SELECT "===== tests for DELETE finished ====="; + +# tests for errors + +SELECT "===== tests for errors started ====="; + +--error 1191 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー" IN BOOLEAN MODE); + +--error 1054 +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー"); +--error 1054 +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー" IN BOOLEAN MODE); + +SELECT "===== tests for error finished ====="; + +DROP TABLE t1; +SELECT "===== TESTS for Ngram finished ====="; --- orig/mysql-test/suite/senna/r/senna_cp932.result 1970-01-01 09:00:00.000000000 +0900 +++ new/mysql-test/suite/senna/r/senna_cp932.result 2007-10-29 10:13:50.000000000 +0900 @@ -0,0 +1,404 @@ +SET NAMES utf8; +SELECT "===== TESTS for Ngram started ====="; +===== TESTS for Ngram started ===== +===== TESTS for Ngram started ===== +SELECT "===== creating test data started ====="; +===== creating test data started ===== +===== creating test data started ===== +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 ( +c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 TEXT, +FULLTEXT INDEX ft USING NGRAM(c2) +) ENGINE = MyISAM DEFAULT CHARSET cp932; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL auto_increment, + `c2` text, + PRIMARY KEY (`c1`), + FULLTEXT KEY `ft` (`c2`) +) ENGINE=MyISAM DEFAULT CHARSET=cp932 +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c2 cp932 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +INSERT INTO t1 (c2) VALUES ("世界で最もポピュラーなオープンソースデータベースMySQL"); +INSERT INTO t1 (c2) VALUES ("住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。"); +INSERT INTO t1 (c2) VALUES ("他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。"); +INSERT INTO t1 (c2) VALUES ("商用ライセンスは有料ですが、再配布なども自由に行えます。"); +INSERT INTO t1 (c2) VALUES ("信頼性と可用性は、MySQLの大きな特徴です。"); +INSERT INTO t1 (c2) VALUES ("企業のデータを適切に管理することは、DBAの最も大きな仕事です。"); +INSERT INTO t1 (c2) VALUES ("MySQLは優れたセキュリティ機能を提供しています。"); +INSERT INTO t1 (c2) VALUES ("ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。"); +INSERT INTO t1 (c2) VALUES ("MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。"); +INSERT INTO t1 (c2) VALUES ("MySQL Clusterはメモリベースの高速ストレージエンジンです。"); +INSERT INTO t1 (c2) VALUES ("GPLライセンスに基づいてソフトウェアの再配布を行うことができます"); +INSERT INTO t1 (c2) VALUES ("高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。"); +INSERT INTO t1 (c2) VALUES ("GPLソフトウェアは無料ですが、サービスは有料です。"); +INSERT INTO t1 (c2) VALUES ("システム管理工学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("理工学部で物理学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工*です。"); +INSERT INTO t1 (c2) VALUES ("東の湖にて水泳大会を行います。"); +INSERT INTO t1 (c2) VALUES ("先生、その件について詳しく教えて下さい。"); +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +INSERT INTO t1 (c2) VALUES ("御両親の印鑑を押してもらって明日持ってきてください、成績表"); +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム㈱でお願いいたします。 +21 ファイナルファンタジーⅶを1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +SELECT "===== creating test data finished ====="; +===== creating test data finished ===== +===== creating test data finished ===== +SELECT "===== tests for FULLTEXT search started ====="; +===== tests for FULLTEXT search started ===== +===== tests for FULLTEXT search started ===== +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム㈱でお願いいたします。 +21 ファイナルファンタジーⅶを1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +SELECT c1, MATCH(c2) AGAINST("再配布") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("再配布"); +c1 score c2 +4 1 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 1 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("機能") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("機能"); +c1 score c2 +7 1 MySQLは優れたセキュリティ機能を提供しています。 +12 2 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("最新"); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+有料" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 +有料" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -有料" IN BOOLEAN MODE); +c1 c2 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE); +c1 score c2 +2 5 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +4 10 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 5 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE); +c1 score c2 +4 4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 5 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE); +c1 score c2 +4 9 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 5 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("OR 商用 OR 教えて" IN BOOLEAN MODE); +c1 c2 +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +19 先生、その件について詳しく教えて下さい。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -(OR 商用 OR 教えて)" IN BOOLEAN MODE); +c1 c2 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('"DBMS"' IN BOOLEAN MODE); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*D- +再配布 自由' IN BOOLEAN MODE); +c1 c2 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -特徴' IN BOOLEAN MODE); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -鳥取 -特徴' IN BOOLEAN MODE); +c1 c2 +5 信頼性と可用性は、MySQLの大きな特徴です。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N100"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N8"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N7"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N6"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N5"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N4"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N3"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N2"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N1"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N0"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +c1 c2 +20 宛名書きは住商情報システム㈱でお願いいたします。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +c1 c2 +21 ファイナルファンタジーⅶを1本下さい。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +c1 c2 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +c1 c2 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("成績表"); +c1 c2 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +SELECT "===== tests for FULLTEXT search finished ====="; +===== tests for FULLTEXT search finished ===== +===== tests for FULLTEXT search finished ===== +SELECT "===== tests for INSERT started ====="; +===== tests for INSERT started ===== +===== tests for INSERT started ===== +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム㈱でお願いいたします。 +21 ファイナルファンタジーⅶを1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +INSERT INTO t1 (c2) VALUES ("普段から緊急事態に備えておかなければならない。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +c1 c2 +25 普段から緊急事態に備えておかなければならない。 +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +c1 c2 +20 宛名書きは住商情報システム㈱でお願いいたします。 +26 宛名書きは住商情報システム㈱でお願いいたします。 +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +c1 c2 +21 ファイナルファンタジーⅶを1本下さい。 +27 ファイナルファンタジーⅶを1本下さい。 +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +c1 c2 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +28 NEC選定IBM拡張文字の淼について今日はお話いたします。 +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +c1 c2 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +29 日本語の文字の種類のひとつとして半角カタカナがある。 +INSERT INTO t1 (c2) VALUES ("職員室に忘れて置いてきてしまった出席表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("出席表"); +c1 c2 +30 職員室に忘れて置いてきてしまった出席表 +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム㈱でお願いいたします。 +21 ファイナルファンタジーⅶを1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +25 普段から緊急事態に備えておかなければならない。 +26 宛名書きは住商情報システム㈱でお願いいたします。 +27 ファイナルファンタジーⅶを1本下さい。 +28 NEC選定IBM拡張文字の淼について今日はお話いたします。 +29 日本語の文字の種類のひとつとして半角カタカナがある。 +30 職員室に忘れて置いてきてしまった出席表 +SELECT "===== tests for INSERT finished ====="; +===== tests for INSERT finished ===== +===== tests for INSERT finished ===== +SELECT "===== tests for DELETE started ====="; +===== tests for DELETE started ===== +===== tests for DELETE started ===== +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム㈱でお願いいたします。 +21 ファイナルファンタジーⅶを1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +25 普段から緊急事態に備えておかなければならない。 +26 宛名書きは住商情報システム㈱でお願いいたします。 +27 ファイナルファンタジーⅶを1本下さい。 +28 NEC選定IBM拡張文字の淼について今日はお話いたします。 +29 日本語の文字の種類のひとつとして半角カタカナがある。 +30 職員室に忘れて置いてきてしまった出席表 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("淼"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("表"); +c1 c2 +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +SELECT "===== tests for DELETE finished ====="; +===== tests for DELETE finished ===== +===== tests for DELETE finished ===== +SELECT "===== tests for errors started ====="; +===== tests for errors started ===== +===== tests for errors started ===== +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー"); +ERROR HY000: Can't find FULLTEXT index matching the column list +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー" IN BOOLEAN MODE); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー"); +ERROR 42S22: Unknown column 'c3' in 'where clause' +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー" IN BOOLEAN MODE); +ERROR 42S22: Unknown column 'c3' in 'where clause' +SELECT "===== tests for error finished ====="; +===== tests for error finished ===== +===== tests for error finished ===== +DROP TABLE t1; +SELECT "===== TESTS for Ngram finished ====="; +===== TESTS for Ngram finished ===== +===== TESTS for Ngram finished ===== --- orig/mysql-test/suite/senna/r/senna_create.result 1970-01-01 09:00:00.000000000 +0900 +++ new/mysql-test/suite/senna/r/senna_create.result 2007-10-29 10:13:50.000000000 +0900 @@ -0,0 +1,210 @@ +SET NAMES utf8; +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 CHAR(100), +c3 VARCHAR(100), +c4 TINYTEXT, +c5 TEXT, +c6 MEDIUMTEXT, +c7 LONGTEXT, +FULLTEXT INDEX USING NGRAM (c2), +FULLTEXT INDEX USING NGRAM (c3), +FULLTEXT INDEX USING NGRAM (c4), +FULLTEXT INDEX USING NGRAM (c5), +FULLTEXT INDEX USING NGRAM (c6), +FULLTEXT INDEX USING NGRAM (c7) +) ENGINE = MyISAM DEFAULT CHARSET utf8; +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 c2 c2 utf8 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 c3 c3 utf8 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 c4 c4 utf8 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 c5 c5 utf8 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 c6 c6 utf8 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 c7 c7 utf8 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +DROP TABLE t1; +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 INT, +FULLTEXT INDEX USING NGRAM (c2) +) ENGINE = MyISAM DEFAULT CHARSET utf8; +ERROR HY000: Column 'c2' cannot be part of FULLTEXT index +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 DOUBLE, +FULLTEXT INDEX USING NGRAM (c2) +) ENGINE = MyISAM DEFAULT CHARSET utf8; +ERROR HY000: Column 'c2' cannot be part of FULLTEXT index +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 DATETIME, +FULLTEXT INDEX USING NGRAM (c2) +) ENGINE = MyISAM DEFAULT CHARSET utf8; +ERROR HY000: Column 'c2' cannot be part of FULLTEXT index +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 BLOB, +FULLTEXT INDEX USING NGRAM (c2) +) ENGINE = MyISAM DEFAULT CHARSET utf8; +ERROR HY000: Column 'c2' cannot be part of FULLTEXT index +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 CHAR(100), +FULLTEXT INDEX USING NGRAM (c2) +) ENGINE = MEMORY DEFAULT CHARSET utf8; +ERROR HY000: The used table type doesn't support FULLTEXT indexes +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 CHAR(100), +FULLTEXT INDEX USING NGRAM (c2) +) ENGINE = InnoDB DEFAULT CHARSET utf8; +Warnings: +Warning 1266 Using storage engine MyISAM for table 't1' +DROP TABLE t1; +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 VARCHAR(128), +c3 TEXT, +FULLTEXT INDEX USING NGRAM (c2, c3) +) ENGINE = MyISAM DEFAULT CHARSET utf8; +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 c2 c2 utf8 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 c2 c3 utf8 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +DROP TABLE t1; +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 VARCHAR(128), +c3 TEXT, +c4 TEXT, +FULLTEXT INDEX USING NGRAM (c2, c3, c4) +) ENGINE = MyISAM DEFAULT CHARSET utf8; +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 c2 c2 utf8 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 c2 c3 utf8 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 c2 c4 utf8 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +DROP TABLE t1; +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 TEXT +) ENGINE = MyISAM DEFAULT CHARSET utf8; +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +CREATE FULLTEXT INDEX ft USING NGRAM ON t1(c2); +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c2 utf8 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +DROP INDEX ft ON t1; +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +DROP TABLE t1; +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 TEXT, +c3 TEXT, +c4 TEXT, +c5 TEXT, +c6 TEXT, +c7 TEXT, +c8 TEXT +) ENGINE = MyISAM DEFAULT CHARSET utf8; +ALTER TABLE t1 ADD FULLTEXT INDEX ft2 USING NGRAM, 20 (c2); +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft2 c2 utf8 NGRAM OFF ON OFF OFF OFF 20 0 4268032 0 4268032 135168 8192 +ALTER TABLE t1 ADD FULLTEXT INDEX ft3 USING NGRAM, NO NORMALIZE (c3); +ALTER TABLE t1 ADD FULLTEXT INDEX ft4 USING NGRAM, NO NORMALIZE, 40 (c4); +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft2 c2 utf8 NGRAM OFF ON OFF OFF OFF 20 0 4268032 0 4268032 135168 8192 +t1 ft3 c3 utf8 NGRAM OFF OFF OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 ft4 c4 utf8 NGRAM OFF OFF OFF OFF OFF 40 0 4268032 0 4268032 135168 12288 +ALTER TABLE t1 ADD FULLTEXT INDEX ft5 USING NGRAM (c5); +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft2 c2 utf8 NGRAM OFF ON OFF OFF OFF 20 0 4268032 0 4268032 135168 8192 +t1 ft3 c3 utf8 NGRAM OFF OFF OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 ft4 c4 utf8 NGRAM OFF OFF OFF OFF OFF 40 0 4268032 0 4268032 135168 12288 +t1 ft5 c5 utf8 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +ALTER TABLE t1 ADD FULLTEXT INDEX ft6 USING NGRAM, NO NORMALIZE (c6); +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft2 c2 utf8 NGRAM OFF ON OFF OFF OFF 20 0 4268032 0 4268032 135168 8192 +t1 ft3 c3 utf8 NGRAM OFF OFF OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 ft4 c4 utf8 NGRAM OFF OFF OFF OFF OFF 40 0 4268032 0 4268032 135168 12288 +t1 ft5 c5 utf8 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 ft6 c6 utf8 NGRAM OFF OFF OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +ALTER TABLE t1 ADD FULLTEXT INDEX ft7 USING NGRAM, 70 (c7); +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft2 c2 utf8 NGRAM OFF ON OFF OFF OFF 20 0 4268032 0 4268032 135168 8192 +t1 ft3 c3 utf8 NGRAM OFF OFF OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 ft4 c4 utf8 NGRAM OFF OFF OFF OFF OFF 40 0 4268032 0 4268032 135168 12288 +t1 ft5 c5 utf8 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 ft6 c6 utf8 NGRAM OFF OFF OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 ft7 c7 utf8 NGRAM OFF ON OFF OFF OFF 70 0 4268032 0 4268032 139264 20480 +ALTER TABLE t1 ADD FULLTEXT INDEX ft8 USING NGRAM, NO NORMALIZE, 80 (c8); +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft2 c2 utf8 NGRAM OFF ON OFF OFF OFF 20 0 4268032 0 4268032 135168 8192 +t1 ft3 c3 utf8 NGRAM OFF OFF OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 ft4 c4 utf8 NGRAM OFF OFF OFF OFF OFF 40 0 4268032 0 4268032 135168 12288 +t1 ft5 c5 utf8 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 ft6 c6 utf8 NGRAM OFF OFF OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 ft7 c7 utf8 NGRAM OFF ON OFF OFF OFF 70 0 4268032 0 4268032 139264 20480 +t1 ft8 c8 utf8 NGRAM OFF OFF OFF OFF OFF 80 0 4268032 0 4268032 139264 24576 +DROP TABLE t1; +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 TEXT +) ENGINE = MyISAM DEFAULT CHARSET utf8; +ALTER TABLE t1 ADD FULLTEXT INDEX ft USING DUMMY; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DUMMY' at line 1 +ALTER TABLE t1 ADD FULLTEXT INDEX ft USING -100; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-100' at line 1 +ALTER TABLE t1 ADD FULLTEXT INDEX ft USING 10, NGRAM; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 +ALTER TABLE t1 ADD FULLTEXT INDEX ft USING NGRAM, 10, NO NORMALIZE; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 +DROP TABLE t1; +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 TEXT, +FULLTEXT INDEX ft USING NGRAM (c2) +) ENGINE = MyISAM DEFAULT CHARSET utf8; +DROP INDEX dummy ON t1; +ERROR 42000: Can't DROP 'dummy'; check that column/key exists +DROP INDEX ft ON t1; +DROP TABLE t1; +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 TEXT, +FULLTEXT INDEX ft USING NGRAM (c2) +) ENGINE = MyISAM DEFAULT CHARSET cp932; +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c2 cp932 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +DROP TABLE t1; +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 TEXT CHARSET sjis, +c3 TEXT CHARSET cp932, +c4 TEXT CHARSET utf8, +c5 TEXT CHARSET eucjpms, +c6 TEXT CHARSET ujis, +FULLTEXT INDEX ft2 USING NGRAM (c2), +FULLTEXT INDEX ft3 USING NGRAM (c3), +FULLTEXT INDEX ft4 USING NGRAM (c4), +FULLTEXT INDEX ft5 USING NGRAM (c5), +FULLTEXT INDEX ft6 USING NGRAM (c6) +) ENGINE = MyISAM; +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft2 c2 cp932 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 ft3 c3 cp932 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 ft4 c4 utf8 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 ft5 c5 eucjpms NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 ft6 c6 eucjpms NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +DROP TABLE t1; +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 TEXT CHARSET sjis, +c3 TEXT CHARSET ujis, +FULLTEXT INDEX ft USING NGRAM (c2, c3) +) ENGINE = MyISAM; +ERROR HY000: Column 'c3' cannot be part of FULLTEXT index +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM (c1)) DEFAULT CHARSET utf8; +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c1 utf8 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +DELETE FROM t1; +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c1 utf8 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +DROP TABLE t1; --- orig/mysql-test/suite/senna/r/senna_eucjpms.result 1970-01-01 09:00:00.000000000 +0900 +++ new/mysql-test/suite/senna/r/senna_eucjpms.result 2007-10-29 10:13:50.000000000 +0900 @@ -0,0 +1,404 @@ +SET NAMES utf8; +SELECT "===== TESTS for Ngram started ====="; +===== TESTS for Ngram started ===== +===== TESTS for Ngram started ===== +SELECT "===== creating test data started ====="; +===== creating test data started ===== +===== creating test data started ===== +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 ( +c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 TEXT, +FULLTEXT INDEX ft USING NGRAM(c2) +) ENGINE = MyISAM DEFAULT CHARSET eucjpms; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL auto_increment, + `c2` text, + PRIMARY KEY (`c1`), + FULLTEXT KEY `ft` (`c2`) +) ENGINE=MyISAM DEFAULT CHARSET=eucjpms +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c2 eucjpms NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +INSERT INTO t1 (c2) VALUES ("世界で最もポピュラーなオープンソースデータベースMySQL"); +INSERT INTO t1 (c2) VALUES ("住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。"); +INSERT INTO t1 (c2) VALUES ("他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。"); +INSERT INTO t1 (c2) VALUES ("商用ライセンスは有料ですが、再配布なども自由に行えます。"); +INSERT INTO t1 (c2) VALUES ("信頼性と可用性は、MySQLの大きな特徴です。"); +INSERT INTO t1 (c2) VALUES ("企業のデータを適切に管理することは、DBAの最も大きな仕事です。"); +INSERT INTO t1 (c2) VALUES ("MySQLは優れたセキュリティ機能を提供しています。"); +INSERT INTO t1 (c2) VALUES ("ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。"); +INSERT INTO t1 (c2) VALUES ("MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。"); +INSERT INTO t1 (c2) VALUES ("MySQL Clusterはメモリベースの高速ストレージエンジンです。"); +INSERT INTO t1 (c2) VALUES ("GPLライセンスに基づいてソフトウェアの再配布を行うことができます"); +INSERT INTO t1 (c2) VALUES ("高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。"); +INSERT INTO t1 (c2) VALUES ("GPLソフトウェアは無料ですが、サービスは有料です。"); +INSERT INTO t1 (c2) VALUES ("システム管理工学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("理工学部で物理学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工*です。"); +INSERT INTO t1 (c2) VALUES ("東の湖にて水泳大会を行います。"); +INSERT INTO t1 (c2) VALUES ("先生、その件について詳しく教えて下さい。"); +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +INSERT INTO t1 (c2) VALUES ("御両親の印鑑を押してもらって明日持ってきてください、成績表"); +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム㈱でお願いいたします。 +21 ファイナルファンタジーⅶを1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +SELECT "===== creating test data finished ====="; +===== creating test data finished ===== +===== creating test data finished ===== +SELECT "===== tests for FULLTEXT search started ====="; +===== tests for FULLTEXT search started ===== +===== tests for FULLTEXT search started ===== +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム㈱でお願いいたします。 +21 ファイナルファンタジーⅶを1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +SELECT c1, MATCH(c2) AGAINST("再配布") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("再配布"); +c1 score c2 +4 1 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 1 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("機能") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("機能"); +c1 score c2 +7 1 MySQLは優れたセキュリティ機能を提供しています。 +12 2 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("最新"); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+有料" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 +有料" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -有料" IN BOOLEAN MODE); +c1 c2 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE); +c1 score c2 +2 5 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +4 10 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 5 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE); +c1 score c2 +4 4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 5 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE); +c1 score c2 +4 9 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 5 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("OR 商用 OR 教えて" IN BOOLEAN MODE); +c1 c2 +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +19 先生、その件について詳しく教えて下さい。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -(OR 商用 OR 教えて)" IN BOOLEAN MODE); +c1 c2 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('"DBMS"' IN BOOLEAN MODE); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*D- +再配布 自由' IN BOOLEAN MODE); +c1 c2 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -特徴' IN BOOLEAN MODE); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -鳥取 -特徴' IN BOOLEAN MODE); +c1 c2 +5 信頼性と可用性は、MySQLの大きな特徴です。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N100"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N8"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N7"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N6"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N5"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N4"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N3"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N2"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N1"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N0"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +c1 c2 +20 宛名書きは住商情報システム㈱でお願いいたします。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +c1 c2 +21 ファイナルファンタジーⅶを1本下さい。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +c1 c2 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +c1 c2 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("成績表"); +c1 c2 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +SELECT "===== tests for FULLTEXT search finished ====="; +===== tests for FULLTEXT search finished ===== +===== tests for FULLTEXT search finished ===== +SELECT "===== tests for INSERT started ====="; +===== tests for INSERT started ===== +===== tests for INSERT started ===== +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム㈱でお願いいたします。 +21 ファイナルファンタジーⅶを1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +INSERT INTO t1 (c2) VALUES ("普段から緊急事態に備えておかなければならない。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +c1 c2 +25 普段から緊急事態に備えておかなければならない。 +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +c1 c2 +20 宛名書きは住商情報システム㈱でお願いいたします。 +26 宛名書きは住商情報システム㈱でお願いいたします。 +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +c1 c2 +21 ファイナルファンタジーⅶを1本下さい。 +27 ファイナルファンタジーⅶを1本下さい。 +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +c1 c2 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +28 NEC選定IBM拡張文字の淼について今日はお話いたします。 +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +c1 c2 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +29 日本語の文字の種類のひとつとして半角カタカナがある。 +INSERT INTO t1 (c2) VALUES ("職員室に忘れて置いてきてしまった出席表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("出席表"); +c1 c2 +30 職員室に忘れて置いてきてしまった出席表 +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム㈱でお願いいたします。 +21 ファイナルファンタジーⅶを1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +25 普段から緊急事態に備えておかなければならない。 +26 宛名書きは住商情報システム㈱でお願いいたします。 +27 ファイナルファンタジーⅶを1本下さい。 +28 NEC選定IBM拡張文字の淼について今日はお話いたします。 +29 日本語の文字の種類のひとつとして半角カタカナがある。 +30 職員室に忘れて置いてきてしまった出席表 +SELECT "===== tests for INSERT finished ====="; +===== tests for INSERT finished ===== +===== tests for INSERT finished ===== +SELECT "===== tests for DELETE started ====="; +===== tests for DELETE started ===== +===== tests for DELETE started ===== +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム㈱でお願いいたします。 +21 ファイナルファンタジーⅶを1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +25 普段から緊急事態に備えておかなければならない。 +26 宛名書きは住商情報システム㈱でお願いいたします。 +27 ファイナルファンタジーⅶを1本下さい。 +28 NEC選定IBM拡張文字の淼について今日はお話いたします。 +29 日本語の文字の種類のひとつとして半角カタカナがある。 +30 職員室に忘れて置いてきてしまった出席表 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("淼"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("表"); +c1 c2 +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +SELECT "===== tests for DELETE finished ====="; +===== tests for DELETE finished ===== +===== tests for DELETE finished ===== +SELECT "===== tests for errors started ====="; +===== tests for errors started ===== +===== tests for errors started ===== +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー"); +ERROR HY000: Can't find FULLTEXT index matching the column list +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー" IN BOOLEAN MODE); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー"); +ERROR 42S22: Unknown column 'c3' in 'where clause' +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー" IN BOOLEAN MODE); +ERROR 42S22: Unknown column 'c3' in 'where clause' +SELECT "===== tests for error finished ====="; +===== tests for error finished ===== +===== tests for error finished ===== +DROP TABLE t1; +SELECT "===== TESTS for Ngram finished ====="; +===== TESTS for Ngram finished ===== +===== TESTS for Ngram finished ===== --- orig/mysql-test/suite/senna/r/senna_kwic.result 1970-01-01 09:00:00.000000000 +0900 +++ new/mysql-test/suite/senna/r/senna_kwic.result 2007-10-29 10:13:50.000000000 +0900 @@ -0,0 +1,155 @@ +SET NAMES utf8; +DROP TABLE IF EXISTS t1; +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", ""); +KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "") +今日は東京 >>> 明日は +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "", "埼玉", "", ""); +KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "", "埼玉", "", "") +東京 >>> 明日は埼玉に +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 1, "","", "東京", "", ""); +KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 1, "","", "東京", "", "") +今日は東京 >>> 明日は +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 45, 1, 0, "... "," ...", "東京", "", ""); +KWIC("今日は東京 >>> 明日は埼玉に行きます。", 45, 1, 0, "... "," ...", "東京", "", "") +... 今日は東京 >>> 明日は埼玉に行き ... +CREATE TABLE t1 (c1 CHAR(100)) DEFAULT CHARSET utf8; +INSERT INTO t1 VALUES("今日は東京 >>> 明日は埼玉に行きます。"); +SELECT KWIC(c1, 30, 1, 0, "","", "東京", "", "") FROM t1; +KWIC(c1, 30, 1, 0, "","", "東京", "", "") +今日は東京 >>> 明日は +SELECT KWIC(c1, 30, 1, 0, "","", "東京", "", "", "埼玉", "", "") FROM t1; +KWIC(c1, 30, 1, 0, "","", "東京", "", "", "埼玉", "", "") +東京 >>> 明日は埼玉に +SELECT KWIC(c1, 30, 1, 1, "","", "東京", "", "") FROM t1; +KWIC(c1, 30, 1, 1, "","", "東京", "", "") +今日は東京 >>> 明日は +SELECT KWIC(c1, 45, 1, 0, "... "," ...", "東京", "", "") FROM t1; +KWIC(c1, 45, 1, 0, "... "," ...", "東京", "", "") +... 今日は東京 >>> 明日は埼玉に行き ... +DROP TABLE t1; +CREATE TABLE t1 (c1 VARCHAR(100)) DEFAULT CHARSET utf8; +INSERT INTO t1 VALUES("今日は東京 >>> 明日は埼玉に行きます。"); +SELECT KWIC(c1, 30, 1, 0, "","", "東京", "", "") FROM t1; +KWIC(c1, 30, 1, 0, "","", "東京", "", "") +今日は東京 >>> 明日は +SELECT KWIC(c1, 30, 1, 0, "","", "東京", "", "", "埼玉", "", "") FROM t1; +KWIC(c1, 30, 1, 0, "","", "東京", "", "", "埼玉", "", "") +東京 >>> 明日は埼玉に +SELECT KWIC(c1, 30, 1, 1, "","", "東京", "", "") FROM t1; +KWIC(c1, 30, 1, 1, "","", "東京", "", "") +今日は東京 >>> 明日は +SELECT KWIC(c1, 45, 1, 0, "... "," ...", "東京", "", "") FROM t1; +KWIC(c1, 45, 1, 0, "... "," ...", "東京", "", "") +... 今日は東京 >>> 明日は埼玉に行き ... +DROP TABLE t1; +CREATE TABLE t1 (c1 TEXT) DEFAULT CHARSET utf8; +INSERT INTO t1 VALUES("今日は東京 >>> 明日は埼玉に行きます。"); +SELECT KWIC(c1, 30, 1, 0, "","", "東京", "", "") FROM t1; +KWIC(c1, 30, 1, 0, "","", "東京", "", "") +今日は東京 >>> 明日は +SELECT KWIC(c1, 30, 1, 0, "","", "東京", "", "", "埼玉", "", "") FROM t1; +KWIC(c1, 30, 1, 0, "","", "東京", "", "", "埼玉", "", "") +東京 >>> 明日は埼玉に +SELECT KWIC(c1, 30, 1, 1, "","", "東京", "", "") FROM t1; +KWIC(c1, 30, 1, 1, "","", "東京", "", "") +今日は東京 >>> 明日は +SELECT KWIC(c1, 45, 1, 0, "... "," ...", "東京", "", "") FROM t1; +KWIC(c1, 45, 1, 0, "... "," ...", "東京", "", "") +... 今日は東京 >>> 明日は埼玉に行き ... +DROP TABLE t1; +CREATE TABLE t1 (c1 TEXT) DEFAULT CHARSET utf8; +INSERT INTO t1 VALUES("今日は東京 >>> 明日は埼玉に行きます。"); +PREPARE pstmt FROM 'SELECT KWIC(c1, 30, 1, 0, "","", ?, "", "") FROM t1'; +SET @a = "東京"; +EXECUTE pstmt USING @a; +KWIC(c1, 30, 1, 0, "","", ?, "", "") +今日は東京 >>> 明日は +DROP TABLE t1; +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", ""), +KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", ""); +KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "") KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "") +今日は東京 >>> 明日は 今日は東京 >>> 明日は +SELECT KWIC(KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", ""), +30, 1, 0, "","", "東京", "", ""); +KWIC(KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", ""), +30, 1, 0, "","", "東京", "", "") +lass='word'>東京 >>> +SELECT KWIC(null, 30, 1, 0, "","", "東京", "", ""); +KWIC(null, 30, 1, 0, "","", "東京", "", "") +NULL +SELECT KWIC(null, null, null, null, null, null, null, null, null); +KWIC(null, null, null, null, null, null, null, null, null) +NULL +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", ""); +KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "") + +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "", ""); +KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "", "") + +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "", "埼玉", ""); +KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "", "埼玉", "") + +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "", "埼玉", "", "", ""); +KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "", "埼玉", "", "", "") + +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 0, 1, 0, "","", "東京", "", "", ""); +KWIC("今日は東京 >>> 明日は埼玉に行きます。", 0, 1, 0, "","", "東京", "", "", "") + +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", -10, 1, 0, "","", "東京", "", "", ""); +KWIC("今日は東京 >>> 明日は埼玉に行きます。", -10, 1, 0, "","", "東京", "", "", "") + +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 0, 0, "","", "東京", "", "", ""); +KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 0, 0, "","", "東京", "", "", "") + +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, -10, 0, "","", "東京", "", "", ""); +KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, -10, 0, "","", "東京", "", "", "") + +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 10, "","", "東京", "", "", ""); +KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 10, "","", "東京", "", "", "") + +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, -30, "","", "東京", "", "", ""); +KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, -30, "","", "東京", "", "", "") + +drop table if exists t1; +create table t1 (c1 text) default charset utf8 engine = myisam; +insert into t1 values("今日は埼玉あああああああああああああああああああああああああああああああああああああ。 +明日も埼玉ああああああああああいいいいいいいいいいいいあああああああああああああああああああああ。 +明後日も埼玉あああああああああああああああああああああああああああああああああああ。 +いつでも埼玉あああああああああああああああああああああああああああああああああ。"); +select kwic(c1, 20, 1, 0, "", " ...", "埼玉", "", "") from t1; +kwic(c1, 20, 1, 0, "", " ...", "埼玉", "", "") +日は埼玉ああ ... +select kwic(c1, 20, 2, 0, "", " ...", "埼玉", "", "") from t1; +kwic(c1, 20, 2, 0, "", " ...", "埼玉", "", "") +日は埼玉ああ ...日も埼玉ああ ... +select kwic(c1, 20, 3, 0, "", " ...", "埼玉", "", "") from t1; +kwic(c1, 20, 3, 0, "", " ...", "埼玉", "", "") +日は埼玉ああ ...日も埼玉ああ ...日も埼玉ああ ... +select kwic(c1, 20, 4, 0, "", " ...", "埼玉", "", "") from t1; +kwic(c1, 20, 4, 0, "", " ...", "埼玉", "", "") +日は埼玉ああ ...日も埼玉ああ ...日も埼玉ああ ...でも埼玉ああ ... +select kwic(c1, 20, 5, 0, "", " ...", "埼玉", "", "") from t1; +kwic(c1, 20, 5, 0, "", " ...", "埼玉", "", "") +日は埼玉ああ ...日も埼玉ああ ...日も埼玉ああ ...でも埼玉ああ ... +select kwic(c1, 20, 1, 0, "(", ")", "埼玉", "[", "]") from t1; +kwic(c1, 20, 1, 0, "(", ")", "埼玉", "[", "]") +(日は[埼玉]ああ) +select kwic(c1, 20, 2, 0, "(", ")", "埼玉", "[", "]") from t1; +kwic(c1, 20, 2, 0, "(", ")", "埼玉", "[", "]") +(日は[埼玉]ああ)(日も[埼玉]ああ) +select kwic(c1, 20, 3, 0, "(", ")", "埼玉", "[", "]") from t1; +kwic(c1, 20, 3, 0, "(", ")", "埼玉", "[", "]") +(日は[埼玉]ああ)(日も[埼玉]ああ)(日も[埼玉]ああ) +select kwic(c1, 20, 4, 0, "(", ")", "埼玉", "[", "]") from t1; +kwic(c1, 20, 4, 0, "(", ")", "埼玉", "[", "]") +(日は[埼玉]ああ)(日も[埼玉]ああ)(日も[埼玉]ああ)(でも[埼玉]ああ) +select kwic(c1, 20, 5, 0, "(", ")", "埼玉", "[", "]") from t1; +kwic(c1, 20, 5, 0, "(", ")", "埼玉", "[", "]") +(日は[埼玉]ああ)(日も[埼玉]ああ)(日も[埼玉]ああ)(でも[埼玉]ああ) +drop table t1; +CREATE TABLE t1 (c1 int, c2 TEXT) DEFAULT CHARSET utf8; +INSERT INTO t1 (c1) VALUES (100); +SELECT KWIC(c1, 30, 1, 0, "","", "東京", "", "") FROM t1; +KWIC(c1, 30, 1, 0, "","", "東京", "", "") + +DROP TABLE t1; --- orig/mysql-test/suite/senna/r/senna_section.result 1970-01-01 09:00:00.000000000 +0900 +++ new/mysql-test/suite/senna/r/senna_section.result 2007-10-29 10:13:50.000000000 +0900 @@ -0,0 +1,140 @@ +SET NAMES utf8; +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 VARCHAR(20), c3 TEXT) DEFAULT CHARSET utf8; +ALTER TABLE t1 ADD FULLTEXT INDEX ft USING NGRAM, SECTIONALIZE (c2,c3); +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c2 utf8 NGRAM ON ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 ft c3 utf8 NGRAM ON ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +INSERT INTO t1 VALUES(1, "c2あたりc2", "c3あたりc3"); +INSERT INTO t1 VALUES(2, "c2あたりc2", "c3はずれc3"); +INSERT INTO t1 VALUES(3, "c2はずれc2", "c3あたりc3"); +INSERT INTO t1 VALUES(4, "c2はずれc2", "c3はずれc3"); +SELECT * FROM t1; +c1 c2 c3 +1 c2あたりc2 c3あたりc3 +2 c2あたりc2 c3はずれc3 +3 c2はずれc2 c3あたりc3 +4 c2はずれc2 c3はずれc3 +SELECT *, MATCH(c2,c3) AGAINST("あたり") AS score FROM t1 +WHERE MATCH(c2,c3) AGAINST("あたり") ORDER BY score DESC; +c1 c2 c3 score +1 c2あたりc2 c3あたりc3 2 +2 c2あたりc2 c3はずれc3 1 +3 c2はずれc2 c3あたりc3 1 +SELECT *, MATCH(c2,c3) AGAINST("あたり" IN BOOLEAN MODE) AS score FROM t1 +WHERE MATCH(c2,c3) AGAINST("あたり" IN BOOLEAN MODE) ORDER BY score DESC; +c1 c2 c3 score +1 c2あたりc2 c3あたりc3 10 +2 c2あたりc2 c3はずれc3 5 +3 c2はずれc2 c3あたりc3 5 +SELECT *, MATCH(c2,c3) AGAINST("*W1 あたり" IN BOOLEAN MODE) AS score FROM t1 +WHERE MATCH(c2,c3) AGAINST("*W1 あたり" IN BOOLEAN MODE); +c1 c2 c3 score +1 c2あたりc2 c3あたりc3 1 +2 c2あたりc2 c3はずれc3 1 +SELECT *, MATCH(c2,c3) AGAINST("*W2 あたり" IN BOOLEAN MODE) AS score FROM t1 +WHERE MATCH(c2,c3) AGAINST("*W2 あたり" IN BOOLEAN MODE); +c1 c2 c3 score +1 c2あたりc2 c3あたりc3 1 +3 c2はずれc2 c3あたりc3 1 +SELECT *, MATCH(c2,c3) AGAINST("*W1,2 あたり" IN BOOLEAN MODE) AS score FROM t1 +WHERE MATCH(c2,c3) AGAINST("*W1,2 あたり" IN BOOLEAN MODE); +c1 c2 c3 score +1 c2あたりc2 c3あたりc3 2 +2 c2あたりc2 c3はずれc3 1 +3 c2はずれc2 c3あたりc3 1 +SELECT *, MATCH(c2,c3) AGAINST("*W3 あたり" IN BOOLEAN MODE) AS score FROM t1 +WHERE MATCH(c2,c3) AGAINST("*W3 あたり" IN BOOLEAN MODE); +c1 c2 c3 score +SELECT *, MATCH(c2,c3) AGAINST("*W1:10,2:1 あたり" IN BOOLEAN MODE) AS score FROM t1 +WHERE MATCH(c2,c3) AGAINST("*W1:10,2:1 あたり" IN BOOLEAN MODE); +c1 c2 c3 score +1 c2あたりc2 c3あたりc3 11 +2 c2あたりc2 c3はずれc3 10 +3 c2はずれc2 c3あたりc3 1 +DELETE FROM t1 WHERE c1 = 2; +SELECT * FROM t1; +c1 c2 c3 +1 c2あたりc2 c3あたりc3 +3 c2はずれc2 c3あたりc3 +4 c2はずれc2 c3はずれc3 +SELECT *, MATCH(c2,c3) AGAINST("あたり" IN BOOLEAN MODE) AS score FROM t1 +WHERE MATCH(c2,c3) AGAINST("あたり" IN BOOLEAN MODE); +c1 c2 c3 score +1 c2あたりc2 c3あたりc3 10 +3 c2はずれc2 c3あたりc3 5 +DELETE FROM t1 WHERE c1 = 4; +SELECT * FROM t1; +c1 c2 c3 +1 c2あたりc2 c3あたりc3 +3 c2はずれc2 c3あたりc3 +DELETE FROM t1; +SELECT * FROM t1; +c1 c2 c3 +DROP INDEX ft ON t1; +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +DROP TABLE t1; +DROP TABLE IF EXISTS t1; +Warnings: +Note 1051 Unknown table 't1' +CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 VARCHAR(20), c3 INT, c4 TEXT) DEFAULT CHARSET utf8; +ALTER TABLE t1 ADD FULLTEXT INDEX ft USING NGRAM, SECTIONALIZE (c2,c4); +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c2 utf8 NGRAM ON ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 ft c4 utf8 NGRAM ON ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +INSERT INTO t1 VALUES(1, "c2あたりc2", 100, "c4あたりc4"); +INSERT INTO t1 VALUES(2, "c2あたりc2", 200, "c4はずれc4"); +INSERT INTO t1 VALUES(3, "c2はずれc2", 300, "c4あたりc4"); +INSERT INTO t1 VALUES(4, "c2はずれc2", 400, "c4はずれc4"); +SELECT *, MATCH(c2,c4) AGAINST("*W1:10,2:1 あたり" IN BOOLEAN MODE) AS score FROM t1 +WHERE MATCH(c2,c4) AGAINST("*W1:10,2:1 あたり" IN BOOLEAN MODE); +c1 c2 c3 c4 score +1 c2あたりc2 100 c4あたりc4 11 +2 c2あたりc2 200 c4はずれc4 10 +3 c2はずれc2 300 c4あたりc4 1 +DELETE FROM t1 WHERE c1 = 2; +SELECT * FROM t1; +c1 c2 c3 c4 +1 c2あたりc2 100 c4あたりc4 +3 c2はずれc2 300 c4あたりc4 +4 c2はずれc2 400 c4はずれc4 +SELECT *, MATCH(c2,c4) AGAINST("*W1:10,2:1 あたり" IN BOOLEAN MODE) AS score FROM t1 +WHERE MATCH(c2,c4) AGAINST("*W1:10,2:1 あたり" IN BOOLEAN MODE); +c1 c2 c3 c4 score +1 c2あたりc2 100 c4あたりc4 11 +3 c2はずれc2 300 c4あたりc4 1 +INSERT INTO t1 VALUES(2, "c2あたりc2", 200, "c4はずれc4"); +ALTER TABLE t1 ADD c2a INT AFTER c2; +UPDATE t1 SET c2a = 10; +SELECT *, MATCH(c2,c4) AGAINST("*W1:10,2:1 あたり" IN BOOLEAN MODE) AS score FROM t1 +WHERE MATCH(c2,c4) AGAINST("*W1:10,2:1 あたり" IN BOOLEAN MODE); +c1 c2 c2a c3 c4 score +1 c2あたりc2 10 100 c4あたりc4 11 +2 c2あたりc2 10 200 c4はずれc4 10 +3 c2はずれc2 10 300 c4あたりc4 1 +DELETE FROM t1 WHERE c1 = 2; +SELECT * FROM t1; +c1 c2 c2a c3 c4 +1 c2あたりc2 10 100 c4あたりc4 +3 c2はずれc2 10 300 c4あたりc4 +4 c2はずれc2 10 400 c4はずれc4 +SELECT *, MATCH(c2,c4) AGAINST("*W1:10,2:1 あたり" IN BOOLEAN MODE) AS score FROM t1 +WHERE MATCH(c2,c4) AGAINST("*W1:10,2:1 あたり" IN BOOLEAN MODE); +c1 c2 c2a c3 c4 score +1 c2あたりc2 10 100 c4あたりc4 11 +3 c2はずれc2 10 300 c4あたりc4 1 +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c2 utf8 NGRAM ON ON OFF OFF OFF 512 4 8462336 9 8462336 2789376 135168 +t1 ft c4 utf8 NGRAM ON ON OFF OFF OFF 512 4 8462336 9 8462336 2789376 135168 +DELETE FROM t1; +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c2 utf8 NGRAM ON ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +t1 ft c4 utf8 NGRAM ON ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +DROP TABLE t1; +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size --- orig/mysql-test/suite/senna/r/senna_sjis.result 1970-01-01 09:00:00.000000000 +0900 +++ new/mysql-test/suite/senna/r/senna_sjis.result 2007-10-29 10:13:50.000000000 +0900 @@ -0,0 +1,431 @@ +SET NAMES utf8; +SELECT "===== TESTS for Ngram started ====="; +===== TESTS for Ngram started ===== +===== TESTS for Ngram started ===== +SELECT "===== creating test data started ====="; +===== creating test data started ===== +===== creating test data started ===== +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 ( +c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 TEXT, +FULLTEXT INDEX ft USING NGRAM(c2) +) ENGINE = MyISAM DEFAULT CHARSET sjis; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL auto_increment, + `c2` text, + PRIMARY KEY (`c1`), + FULLTEXT KEY `ft` (`c2`) +) ENGINE=MyISAM DEFAULT CHARSET=sjis +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c2 cp932 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +INSERT INTO t1 (c2) VALUES ("世界で最もポピュラーなオープンソースデータベースMySQL"); +INSERT INTO t1 (c2) VALUES ("住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。"); +INSERT INTO t1 (c2) VALUES ("他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。"); +INSERT INTO t1 (c2) VALUES ("商用ライセンスは有料ですが、再配布なども自由に行えます。"); +INSERT INTO t1 (c2) VALUES ("信頼性と可用性は、MySQLの大きな特徴です。"); +INSERT INTO t1 (c2) VALUES ("企業のデータを適切に管理することは、DBAの最も大きな仕事です。"); +INSERT INTO t1 (c2) VALUES ("MySQLは優れたセキュリティ機能を提供しています。"); +INSERT INTO t1 (c2) VALUES ("ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。"); +INSERT INTO t1 (c2) VALUES ("MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。"); +INSERT INTO t1 (c2) VALUES ("MySQL Clusterはメモリベースの高速ストレージエンジンです。"); +INSERT INTO t1 (c2) VALUES ("GPLライセンスに基づいてソフトウェアの再配布を行うことができます"); +INSERT INTO t1 (c2) VALUES ("高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。"); +INSERT INTO t1 (c2) VALUES ("GPLソフトウェアは無料ですが、サービスは有料です。"); +INSERT INTO t1 (c2) VALUES ("システム管理工学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("理工学部で物理学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工*です。"); +INSERT INTO t1 (c2) VALUES ("東の湖にて水泳大会を行います。"); +INSERT INTO t1 (c2) VALUES ("先生、その件について詳しく教えて下さい。"); +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +Warnings: +Warning 1366 Incorrect string value: '\xE3\x88\xB1\xE3\x81\xA7...' for column 'c2' at row 1 +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +Warnings: +Warning 1366 Incorrect string value: '\xE2\x85\xB6\xE3\x82\x92...' for column 'c2' at row 1 +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +Warnings: +Warning 1366 Incorrect string value: '\xE6\xB7\xBC\xE3\x81\xAB...' for column 'c2' at row 1 +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +INSERT INTO t1 (c2) VALUES ("御両親の印鑑を押してもらって明日持ってきてください、成績表"); +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム?でお願いいたします。 +21 ファイナルファンタジー?を1本下さい。 +22 NEC選定IBM拡張文字の?について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +SELECT "===== creating test data finished ====="; +===== creating test data finished ===== +===== creating test data finished ===== +SELECT "===== tests for FULLTEXT search started ====="; +===== tests for FULLTEXT search started ===== +===== tests for FULLTEXT search started ===== +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム?でお願いいたします。 +21 ファイナルファンタジー?を1本下さい。 +22 NEC選定IBM拡張文字の?について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +SELECT c1, MATCH(c2) AGAINST("再配布") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("再配布"); +c1 score c2 +4 1 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 1 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("機能") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("機能"); +c1 score c2 +7 1 MySQLは優れたセキュリティ機能を提供しています。 +12 2 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("最新"); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+有料" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 +有料" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -有料" IN BOOLEAN MODE); +c1 c2 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE); +c1 score c2 +2 5 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +4 10 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 5 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE); +c1 score c2 +4 4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 5 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE); +c1 score c2 +4 9 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 5 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("OR 商用 OR 教えて" IN BOOLEAN MODE); +c1 c2 +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +19 先生、その件について詳しく教えて下さい。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -(OR 商用 OR 教えて)" IN BOOLEAN MODE); +c1 c2 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('"DBMS"' IN BOOLEAN MODE); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*D- +再配布 自由' IN BOOLEAN MODE); +c1 c2 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -特徴' IN BOOLEAN MODE); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -鳥取 -特徴' IN BOOLEAN MODE); +c1 c2 +5 信頼性と可用性は、MySQLの大きな特徴です。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N100"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N8"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N7"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N6"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N5"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N4"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N3"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N2"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N1"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N0"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +c1 c2 +20 宛名書きは住商情報システム?でお願いいたします。 +21 ファイナルファンタジー?を1本下さい。 +22 NEC選定IBM拡張文字の?について今日はお話いたします。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +c1 c2 +20 宛名書きは住商情報システム?でお願いいたします。 +21 ファイナルファンタジー?を1本下さい。 +22 NEC選定IBM拡張文字の?について今日はお話いたします。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +c1 c2 +20 宛名書きは住商情報システム?でお願いいたします。 +21 ファイナルファンタジー?を1本下さい。 +22 NEC選定IBM拡張文字の?について今日はお話いたします。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +c1 c2 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("成績表"); +c1 c2 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +SELECT "===== tests for FULLTEXT search finished ====="; +===== tests for FULLTEXT search finished ===== +===== tests for FULLTEXT search finished ===== +SELECT "===== tests for INSERT started ====="; +===== tests for INSERT started ===== +===== tests for INSERT started ===== +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム?でお願いいたします。 +21 ファイナルファンタジー?を1本下さい。 +22 NEC選定IBM拡張文字の?について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +INSERT INTO t1 (c2) VALUES ("普段から緊急事態に備えておかなければならない。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +c1 c2 +25 普段から緊急事態に備えておかなければならない。 +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +Warnings: +Warning 1366 Incorrect string value: '\xE3\x88\xB1\xE3\x81\xA7...' for column 'c2' at row 1 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +c1 c2 +20 宛名書きは住商情報システム?でお願いいたします。 +21 ファイナルファンタジー?を1本下さい。 +22 NEC選定IBM拡張文字の?について今日はお話いたします。 +26 宛名書きは住商情報システム?でお願いいたします。 +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +Warnings: +Warning 1366 Incorrect string value: '\xE2\x85\xB6\xE3\x82\x92...' for column 'c2' at row 1 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +c1 c2 +20 宛名書きは住商情報システム?でお願いいたします。 +21 ファイナルファンタジー?を1本下さい。 +22 NEC選定IBM拡張文字の?について今日はお話いたします。 +26 宛名書きは住商情報システム?でお願いいたします。 +27 ファイナルファンタジー?を1本下さい。 +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +Warnings: +Warning 1366 Incorrect string value: '\xE6\xB7\xBC\xE3\x81\xAB...' for column 'c2' at row 1 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +c1 c2 +20 宛名書きは住商情報システム?でお願いいたします。 +21 ファイナルファンタジー?を1本下さい。 +22 NEC選定IBM拡張文字の?について今日はお話いたします。 +26 宛名書きは住商情報システム?でお願いいたします。 +27 ファイナルファンタジー?を1本下さい。 +28 NEC選定IBM拡張文字の?について今日はお話いたします。 +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +c1 c2 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +29 日本語の文字の種類のひとつとして半角カタカナがある。 +INSERT INTO t1 (c2) VALUES ("職員室に忘れて置いてきてしまった出席表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("出席表"); +c1 c2 +30 職員室に忘れて置いてきてしまった出席表 +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム?でお願いいたします。 +21 ファイナルファンタジー?を1本下さい。 +22 NEC選定IBM拡張文字の?について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +25 普段から緊急事態に備えておかなければならない。 +26 宛名書きは住商情報システム?でお願いいたします。 +27 ファイナルファンタジー?を1本下さい。 +28 NEC選定IBM拡張文字の?について今日はお話いたします。 +29 日本語の文字の種類のひとつとして半角カタカナがある。 +30 職員室に忘れて置いてきてしまった出席表 +SELECT "===== tests for INSERT finished ====="; +===== tests for INSERT finished ===== +===== tests for INSERT finished ===== +SELECT "===== tests for DELETE started ====="; +===== tests for DELETE started ===== +===== tests for DELETE started ===== +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム?でお願いいたします。 +21 ファイナルファンタジー?を1本下さい。 +22 NEC選定IBM拡張文字の?について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +25 普段から緊急事態に備えておかなければならない。 +26 宛名書きは住商情報システム?でお願いいたします。 +27 ファイナルファンタジー?を1本下さい。 +28 NEC選定IBM拡張文字の?について今日はお話いたします。 +29 日本語の文字の種類のひとつとして半角カタカナがある。 +30 職員室に忘れて置いてきてしまった出席表 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("淼"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("表"); +c1 c2 +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +SELECT "===== tests for DELETE finished ====="; +===== tests for DELETE finished ===== +===== tests for DELETE finished ===== +SELECT "===== tests for errors started ====="; +===== tests for errors started ===== +===== tests for errors started ===== +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー"); +ERROR HY000: Can't find FULLTEXT index matching the column list +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー" IN BOOLEAN MODE); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー"); +ERROR 42S22: Unknown column 'c3' in 'where clause' +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー" IN BOOLEAN MODE); +ERROR 42S22: Unknown column 'c3' in 'where clause' +SELECT "===== tests for error finished ====="; +===== tests for error finished ===== +===== tests for error finished ===== +DROP TABLE t1; +SELECT "===== TESTS for Ngram finished ====="; +===== TESTS for Ngram finished ===== +===== TESTS for Ngram finished ===== --- orig/mysql-test/suite/senna/r/senna_split.result 1970-01-01 09:00:00.000000000 +0900 +++ new/mysql-test/suite/senna/r/senna_split.result 2007-10-29 10:13:50.000000000 +0900 @@ -0,0 +1,318 @@ +SET NAMES utf8; +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM, SPLIT_ALPHA (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c1 utf8 NGRAM OFF ON ON OFF OFF 512 0 4268032 0 4268032 167936 135168 +DROP TABLE t1; +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM, SPLIT_DIGIT (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c1 utf8 NGRAM OFF ON OFF ON OFF 512 0 4268032 0 4268032 167936 135168 +DROP TABLE t1; +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM, SPLIT_SYMBOL (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c1 utf8 NGRAM OFF ON OFF OFF ON 512 0 4268032 0 4268032 167936 135168 +DROP TABLE t1; +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM, SPLIT_ALPHA, SPLIT_DIGIT, SPLIT_SYMBOL (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c1 utf8 NGRAM OFF ON ON ON ON 512 0 4268032 0 4268032 167936 135168 +DROP TABLE t1; +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; +INSERT INTO t1 VALUES("FedoraCore500の技"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +c1 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +c1 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +DROP TABLE t1; +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM, SPLIT_ALPHA, SPLIT_DIGIT, SPLIT_SYMBOL (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; +INSERT INTO t1 VALUES("FedoraCore500の技"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +DROP TABLE t1; +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM (c1)) +ENGINE = MyISAM DEFAULT CHARSET = cp932; +INSERT INTO t1 VALUES("FedoraCore500の技"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +c1 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +c1 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +DROP TABLE t1; +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM, SPLIT_ALPHA, SPLIT_DIGIT, SPLIT_SYMBOL (c1)) +ENGINE = MyISAM DEFAULT CHARSET = cp932; +INSERT INTO t1 VALUES("FedoraCore500の技"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +DROP TABLE t1; +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM (c1)) +ENGINE = MyISAM DEFAULT CHARSET = eucjpms; +INSERT INTO t1 VALUES("FedoraCore500の技"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +c1 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +c1 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +DROP TABLE t1; +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM, SPLIT_ALPHA, SPLIT_DIGIT, SPLIT_SYMBOL (c1)) +ENGINE = MyISAM DEFAULT CHARSET = eucjpms; +INSERT INTO t1 VALUES("FedoraCore500の技"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +DROP TABLE t1; +SET NAMES utf8; +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM, SPLIT_ALPHA (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c1 utf8 NGRAM OFF ON ON OFF OFF 512 0 4268032 0 4268032 167936 135168 +DROP TABLE t1; +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM, SPLIT_DIGIT (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c1 utf8 NGRAM OFF ON OFF ON OFF 512 0 4268032 0 4268032 167936 135168 +DROP TABLE t1; +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM, SPLIT_SYMBOL (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c1 utf8 NGRAM OFF ON OFF OFF ON 512 0 4268032 0 4268032 167936 135168 +DROP TABLE t1; +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM, SPLIT_ALPHA, SPLIT_DIGIT, SPLIT_SYMBOL (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c1 utf8 NGRAM OFF ON ON ON ON 512 0 4268032 0 4268032 167936 135168 +DROP TABLE t1; +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; +INSERT INTO t1 VALUES("FedoraCore500の技"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +c1 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +c1 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +DROP TABLE t1; +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM, SPLIT_ALPHA, SPLIT_DIGIT, SPLIT_SYMBOL (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; +INSERT INTO t1 VALUES("FedoraCore500の技"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +DROP TABLE t1; +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM (c1)) +ENGINE = MyISAM DEFAULT CHARSET = cp932; +INSERT INTO t1 VALUES("FedoraCore500の技"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +c1 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +c1 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +DROP TABLE t1; +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM, SPLIT_ALPHA, SPLIT_DIGIT, SPLIT_SYMBOL (c1)) +ENGINE = MyISAM DEFAULT CHARSET = cp932; +INSERT INTO t1 VALUES("FedoraCore500の技"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +DROP TABLE t1; +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM (c1)) +ENGINE = MyISAM DEFAULT CHARSET = eucjpms; +INSERT INTO t1 VALUES("FedoraCore500の技"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +c1 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +c1 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +DROP TABLE t1; +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM, SPLIT_ALPHA, SPLIT_DIGIT, SPLIT_SYMBOL (c1)) +ENGINE = MyISAM DEFAULT CHARSET = eucjpms; +INSERT INTO t1 VALUES("FedoraCore500の技"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +c1 +FedoraCore500の技 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +c1 +FedoraCore500の技 +DROP TABLE t1; --- orig/mysql-test/suite/senna/r/senna_ujis.result 1970-01-01 09:00:00.000000000 +0900 +++ new/mysql-test/suite/senna/r/senna_ujis.result 2007-10-29 10:13:50.000000000 +0900 @@ -0,0 +1,417 @@ +SET NAMES utf8; +SELECT "===== TESTS for Ngram started ====="; +===== TESTS for Ngram started ===== +===== TESTS for Ngram started ===== +SELECT "===== creating test data started ====="; +===== creating test data started ===== +===== creating test data started ===== +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 ( +c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 TEXT, +FULLTEXT INDEX ft USING NGRAM(c2) +) ENGINE = MyISAM DEFAULT CHARSET ujis; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL auto_increment, + `c2` text, + PRIMARY KEY (`c1`), + FULLTEXT KEY `ft` (`c2`) +) ENGINE=MyISAM DEFAULT CHARSET=ujis +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c2 eucjpms NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +INSERT INTO t1 (c2) VALUES ("世界で最もポピュラーなオープンソースデータベースMySQL"); +INSERT INTO t1 (c2) VALUES ("住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。"); +INSERT INTO t1 (c2) VALUES ("他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。"); +INSERT INTO t1 (c2) VALUES ("商用ライセンスは有料ですが、再配布なども自由に行えます。"); +INSERT INTO t1 (c2) VALUES ("信頼性と可用性は、MySQLの大きな特徴です。"); +INSERT INTO t1 (c2) VALUES ("企業のデータを適切に管理することは、DBAの最も大きな仕事です。"); +INSERT INTO t1 (c2) VALUES ("MySQLは優れたセキュリティ機能を提供しています。"); +INSERT INTO t1 (c2) VALUES ("ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。"); +INSERT INTO t1 (c2) VALUES ("MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。"); +INSERT INTO t1 (c2) VALUES ("MySQL Clusterはメモリベースの高速ストレージエンジンです。"); +INSERT INTO t1 (c2) VALUES ("GPLライセンスに基づいてソフトウェアの再配布を行うことができます"); +INSERT INTO t1 (c2) VALUES ("高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。"); +INSERT INTO t1 (c2) VALUES ("GPLソフトウェアは無料ですが、サービスは有料です。"); +INSERT INTO t1 (c2) VALUES ("システム管理工学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("理工学部で物理学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工*です。"); +INSERT INTO t1 (c2) VALUES ("東の湖にて水泳大会を行います。"); +INSERT INTO t1 (c2) VALUES ("先生、その件について詳しく教えて下さい。"); +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +Warnings: +Warning 1366 Incorrect string value: '\xE3\x88\xB1\xE3\x81\xA7...' for column 'c2' at row 1 +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +Warnings: +Warning 1366 Incorrect string value: '\xE2\x85\xB6\xE3\x82\x92...' for column 'c2' at row 1 +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +INSERT INTO t1 (c2) VALUES ("御両親の印鑑を押してもらって明日持ってきてください、成績表"); +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム?でお願いいたします。 +21 ファイナルファンタジー?を1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +SELECT "===== creating test data finished ====="; +===== creating test data finished ===== +===== creating test data finished ===== +SELECT "===== tests for FULLTEXT search started ====="; +===== tests for FULLTEXT search started ===== +===== tests for FULLTEXT search started ===== +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム?でお願いいたします。 +21 ファイナルファンタジー?を1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +SELECT c1, MATCH(c2) AGAINST("再配布") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("再配布"); +c1 score c2 +4 1 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 1 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("機能") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("機能"); +c1 score c2 +7 1 MySQLは優れたセキュリティ機能を提供しています。 +12 2 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("最新"); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+有料" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 +有料" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -有料" IN BOOLEAN MODE); +c1 c2 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE); +c1 score c2 +2 5 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +4 10 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 5 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE); +c1 score c2 +4 4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 5 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE); +c1 score c2 +4 9 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 5 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("OR 商用 OR 教えて" IN BOOLEAN MODE); +c1 c2 +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +19 先生、その件について詳しく教えて下さい。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -(OR 商用 OR 教えて)" IN BOOLEAN MODE); +c1 c2 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('"DBMS"' IN BOOLEAN MODE); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*D- +再配布 自由' IN BOOLEAN MODE); +c1 c2 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -特徴' IN BOOLEAN MODE); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -鳥取 -特徴' IN BOOLEAN MODE); +c1 c2 +5 信頼性と可用性は、MySQLの大きな特徴です。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N100"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N8"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N7"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N6"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N5"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N4"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N3"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N2"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N1"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N0"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +c1 c2 +20 宛名書きは住商情報システム?でお願いいたします。 +21 ファイナルファンタジー?を1本下さい。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +c1 c2 +20 宛名書きは住商情報システム?でお願いいたします。 +21 ファイナルファンタジー?を1本下さい。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +c1 c2 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +c1 c2 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("成績表"); +c1 c2 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +SELECT "===== tests for FULLTEXT search finished ====="; +===== tests for FULLTEXT search finished ===== +===== tests for FULLTEXT search finished ===== +SELECT "===== tests for INSERT started ====="; +===== tests for INSERT started ===== +===== tests for INSERT started ===== +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム?でお願いいたします。 +21 ファイナルファンタジー?を1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +INSERT INTO t1 (c2) VALUES ("普段から緊急事態に備えておかなければならない。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +c1 c2 +25 普段から緊急事態に備えておかなければならない。 +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +Warnings: +Warning 1366 Incorrect string value: '\xE3\x88\xB1\xE3\x81\xA7...' for column 'c2' at row 1 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +c1 c2 +20 宛名書きは住商情報システム?でお願いいたします。 +21 ファイナルファンタジー?を1本下さい。 +26 宛名書きは住商情報システム?でお願いいたします。 +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +Warnings: +Warning 1366 Incorrect string value: '\xE2\x85\xB6\xE3\x82\x92...' for column 'c2' at row 1 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +c1 c2 +20 宛名書きは住商情報システム?でお願いいたします。 +21 ファイナルファンタジー?を1本下さい。 +26 宛名書きは住商情報システム?でお願いいたします。 +27 ファイナルファンタジー?を1本下さい。 +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +c1 c2 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +28 NEC選定IBM拡張文字の淼について今日はお話いたします。 +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +c1 c2 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +29 日本語の文字の種類のひとつとして半角カタカナがある。 +INSERT INTO t1 (c2) VALUES ("職員室に忘れて置いてきてしまった出席表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("出席表"); +c1 c2 +30 職員室に忘れて置いてきてしまった出席表 +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム?でお願いいたします。 +21 ファイナルファンタジー?を1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +25 普段から緊急事態に備えておかなければならない。 +26 宛名書きは住商情報システム?でお願いいたします。 +27 ファイナルファンタジー?を1本下さい。 +28 NEC選定IBM拡張文字の淼について今日はお話いたします。 +29 日本語の文字の種類のひとつとして半角カタカナがある。 +30 職員室に忘れて置いてきてしまった出席表 +SELECT "===== tests for INSERT finished ====="; +===== tests for INSERT finished ===== +===== tests for INSERT finished ===== +SELECT "===== tests for DELETE started ====="; +===== tests for DELETE started ===== +===== tests for DELETE started ===== +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム?でお願いいたします。 +21 ファイナルファンタジー?を1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +25 普段から緊急事態に備えておかなければならない。 +26 宛名書きは住商情報システム?でお願いいたします。 +27 ファイナルファンタジー?を1本下さい。 +28 NEC選定IBM拡張文字の淼について今日はお話いたします。 +29 日本語の文字の種類のひとつとして半角カタカナがある。 +30 職員室に忘れて置いてきてしまった出席表 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("淼"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("表"); +c1 c2 +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +SELECT "===== tests for DELETE finished ====="; +===== tests for DELETE finished ===== +===== tests for DELETE finished ===== +SELECT "===== tests for errors started ====="; +===== tests for errors started ===== +===== tests for errors started ===== +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー"); +ERROR HY000: Can't find FULLTEXT index matching the column list +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー" IN BOOLEAN MODE); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー"); +ERROR 42S22: Unknown column 'c3' in 'where clause' +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー" IN BOOLEAN MODE); +ERROR 42S22: Unknown column 'c3' in 'where clause' +SELECT "===== tests for error finished ====="; +===== tests for error finished ===== +===== tests for error finished ===== +DROP TABLE t1; +SELECT "===== TESTS for Ngram finished ====="; +===== TESTS for Ngram finished ===== +===== TESTS for Ngram finished ===== --- orig/mysql-test/suite/senna/r/senna_utf8.result 1970-01-01 09:00:00.000000000 +0900 +++ new/mysql-test/suite/senna/r/senna_utf8.result 2007-10-29 10:13:50.000000000 +0900 @@ -0,0 +1,404 @@ +SET NAMES utf8; +SELECT "===== TESTS for Ngram started ====="; +===== TESTS for Ngram started ===== +===== TESTS for Ngram started ===== +SELECT "===== creating test data started ====="; +===== creating test data started ===== +===== creating test data started ===== +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 ( +c1 INT PRIMARY KEY AUTO_INCREMENT, +c2 TEXT, +FULLTEXT INDEX ft USING NGRAM(c2) +) ENGINE = MyISAM DEFAULT CHARSET utf8; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL auto_increment, + `c2` text, + PRIMARY KEY (`c1`), + FULLTEXT KEY `ft` (`c2`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 +SHOW SENNA STATUS; +Table Key_name Column_name Encoding Index_type Sectionalize Normalize Split_alpha Split_digit Split_symbol Initial_n_segments Senna_keys_size Senna_keys_file_size Senna_lexicon_size Senna_lexicon_file_size Senna_inv_seg_size Senna_inv_chunk_size +t1 ft c2 utf8 NGRAM OFF ON OFF OFF OFF 512 0 4268032 0 4268032 167936 135168 +INSERT INTO t1 (c2) VALUES ("世界で最もポピュラーなオープンソースデータベースMySQL"); +INSERT INTO t1 (c2) VALUES ("住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。"); +INSERT INTO t1 (c2) VALUES ("他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。"); +INSERT INTO t1 (c2) VALUES ("商用ライセンスは有料ですが、再配布なども自由に行えます。"); +INSERT INTO t1 (c2) VALUES ("信頼性と可用性は、MySQLの大きな特徴です。"); +INSERT INTO t1 (c2) VALUES ("企業のデータを適切に管理することは、DBAの最も大きな仕事です。"); +INSERT INTO t1 (c2) VALUES ("MySQLは優れたセキュリティ機能を提供しています。"); +INSERT INTO t1 (c2) VALUES ("ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。"); +INSERT INTO t1 (c2) VALUES ("MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。"); +INSERT INTO t1 (c2) VALUES ("MySQL Clusterはメモリベースの高速ストレージエンジンです。"); +INSERT INTO t1 (c2) VALUES ("GPLライセンスに基づいてソフトウェアの再配布を行うことができます"); +INSERT INTO t1 (c2) VALUES ("高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。"); +INSERT INTO t1 (c2) VALUES ("GPLソフトウェアは無料ですが、サービスは有料です。"); +INSERT INTO t1 (c2) VALUES ("システム管理工学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("理工学部で物理学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工*です。"); +INSERT INTO t1 (c2) VALUES ("東の湖にて水泳大会を行います。"); +INSERT INTO t1 (c2) VALUES ("先生、その件について詳しく教えて下さい。"); +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +INSERT INTO t1 (c2) VALUES ("御両親の印鑑を押してもらって明日持ってきてください、成績表"); +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム㈱でお願いいたします。 +21 ファイナルファンタジーⅶを1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +SELECT "===== creating test data finished ====="; +===== creating test data finished ===== +===== creating test data finished ===== +SELECT "===== tests for FULLTEXT search started ====="; +===== tests for FULLTEXT search started ===== +===== tests for FULLTEXT search started ===== +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム㈱でお願いいたします。 +21 ファイナルファンタジーⅶを1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +SELECT c1, MATCH(c2) AGAINST("再配布") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("再配布"); +c1 score c2 +4 1 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 1 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("機能") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("機能"); +c1 score c2 +7 1 MySQLは優れたセキュリティ機能を提供しています。 +12 2 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("最新"); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+有料" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 +有料" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -有料" IN BOOLEAN MODE); +c1 c2 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE); +c1 score c2 +2 5 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +4 10 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 5 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE); +c1 score c2 +4 4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 5 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT c1, MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE); +c1 score c2 +4 9 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 5 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +c1 c2 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("OR 商用 OR 教えて" IN BOOLEAN MODE); +c1 c2 +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +19 先生、その件について詳しく教えて下さい。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -(OR 商用 OR 教えて)" IN BOOLEAN MODE); +c1 c2 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('"DBMS"' IN BOOLEAN MODE); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*D- +再配布 自由' IN BOOLEAN MODE); +c1 c2 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -特徴' IN BOOLEAN MODE); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -鳥取 -特徴' IN BOOLEAN MODE); +c1 c2 +5 信頼性と可用性は、MySQLの大きな特徴です。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N100"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N8"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N7"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N6"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N5"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N4"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N3"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N2"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N1"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N0"湖 水泳"' IN BOOLEAN MODE); +c1 c2 +18 東の湖にて水泳大会を行います。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +c1 c2 +20 宛名書きは住商情報システム㈱でお願いいたします。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +c1 c2 +21 ファイナルファンタジーⅶを1本下さい。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +c1 c2 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +c1 c2 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("成績表"); +c1 c2 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +SELECT "===== tests for FULLTEXT search finished ====="; +===== tests for FULLTEXT search finished ===== +===== tests for FULLTEXT search finished ===== +SELECT "===== tests for INSERT started ====="; +===== tests for INSERT started ===== +===== tests for INSERT started ===== +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム㈱でお願いいたします。 +21 ファイナルファンタジーⅶを1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +INSERT INTO t1 (c2) VALUES ("普段から緊急事態に備えておかなければならない。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +c1 c2 +25 普段から緊急事態に備えておかなければならない。 +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +c1 c2 +20 宛名書きは住商情報システム㈱でお願いいたします。 +26 宛名書きは住商情報システム㈱でお願いいたします。 +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +c1 c2 +21 ファイナルファンタジーⅶを1本下さい。 +27 ファイナルファンタジーⅶを1本下さい。 +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +c1 c2 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +28 NEC選定IBM拡張文字の淼について今日はお話いたします。 +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +c1 c2 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +29 日本語の文字の種類のひとつとして半角カタカナがある。 +INSERT INTO t1 (c2) VALUES ("職員室に忘れて置いてきてしまった出席表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("出席表"); +c1 c2 +30 職員室に忘れて置いてきてしまった出席表 +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム㈱でお願いいたします。 +21 ファイナルファンタジーⅶを1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +25 普段から緊急事態に備えておかなければならない。 +26 宛名書きは住商情報システム㈱でお願いいたします。 +27 ファイナルファンタジーⅶを1本下さい。 +28 NEC選定IBM拡張文字の淼について今日はお話いたします。 +29 日本語の文字の種類のひとつとして半角カタカナがある。 +30 職員室に忘れて置いてきてしまった出席表 +SELECT "===== tests for INSERT finished ====="; +===== tests for INSERT finished ===== +===== tests for INSERT finished ===== +SELECT "===== tests for DELETE started ====="; +===== tests for DELETE started ===== +===== tests for DELETE started ===== +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +20 宛名書きは住商情報システム㈱でお願いいたします。 +21 ファイナルファンタジーⅶを1本下さい。 +22 NEC選定IBM拡張文字の淼について今日はお話いたします。 +23 日本語の文字の種類のひとつとして半角カタカナがある。 +24 御両親の印鑑を押してもらって明日持ってきてください、成績表 +25 普段から緊急事態に備えておかなければならない。 +26 宛名書きは住商情報システム㈱でお願いいたします。 +27 ファイナルファンタジーⅶを1本下さい。 +28 NEC選定IBM拡張文字の淼について今日はお話いたします。 +29 日本語の文字の種類のひとつとして半角カタカナがある。 +30 職員室に忘れて置いてきてしまった出席表 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("淼"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +c1 c2 +DELETE FROM t1 WHERE MATCH(c2) AGAINST("表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("表"); +c1 c2 +SELECT * FROM t1; +c1 c2 +1 世界で最もポピュラーなオープンソースデータベースMySQL +2 住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。 +3 他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。 +4 商用ライセンスは有料ですが、再配布なども自由に行えます。 +5 信頼性と可用性は、MySQLの大きな特徴です。 +6 企業のデータを適切に管理することは、DBAの最も大きな仕事です。 +7 MySQLは優れたセキュリティ機能を提供しています。 +8 ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。 +9 MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。 +10 MySQL Clusterはメモリベースの高速ストレージエンジンです。 +11 GPLライセンスに基づいてソフトウェアの再配布を行うことができます +12 高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。 +13 GPLソフトウェアは無料ですが、サービスは有料です。 +14 システム管理工学を担当している教授です。 +15 理工学部で物理学を担当している教授です。 +16 私の専攻は理工です。 +17 私の専攻は理工*です。 +18 東の湖にて水泳大会を行います。 +19 先生、その件について詳しく教えて下さい。 +SELECT "===== tests for DELETE finished ====="; +===== tests for DELETE finished ===== +===== tests for DELETE finished ===== +SELECT "===== tests for errors started ====="; +===== tests for errors started ===== +===== tests for errors started ===== +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー"); +ERROR HY000: Can't find FULLTEXT index matching the column list +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー" IN BOOLEAN MODE); +c1 c2 +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー"); +ERROR 42S22: Unknown column 'c3' in 'where clause' +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー" IN BOOLEAN MODE); +ERROR 42S22: Unknown column 'c3' in 'where clause' +SELECT "===== tests for error finished ====="; +===== tests for error finished ===== +===== tests for error finished ===== +DROP TABLE t1; +SELECT "===== TESTS for Ngram finished ====="; +===== TESTS for Ngram finished ===== +===== TESTS for Ngram finished ===== --- orig/mysql-test/suite/senna/r/senna_util.result 1970-01-01 09:00:00.000000000 +0900 +++ new/mysql-test/suite/senna/r/senna_util.result 2007-10-29 10:13:50.000000000 +0900 @@ -0,0 +1,106 @@ +SHOW VARIABLES LIKE 'senna_%'; +Variable_name Value +senna_2ind OFF +senna_index_type NGRAM +senna_log OFF +senna_log_level NOTICE +SET senna_log_level=INFO; +ERROR HY000: Variable 'senna_log_level' is a GLOBAL variable and should be set with SET GLOBAL +SET GLOBAL senna_log_level=NONE; +SHOW GLOBAL VARIABLES LIKE 'senna_log_level'; +Variable_name Value +senna_log_level NONE +SET GLOBAL senna_log_level=EMERG; +SHOW GLOBAL VARIABLES LIKE 'senna_log_level'; +Variable_name Value +senna_log_level EMERG +SET GLOBAL senna_log_level=ALERT; +SHOW GLOBAL VARIABLES LIKE 'senna_log_level'; +Variable_name Value +senna_log_level ALERT +SET GLOBAL senna_log_level=CRIT; +SHOW GLOBAL VARIABLES LIKE 'senna_log_level'; +Variable_name Value +senna_log_level CRIT +SET GLOBAL senna_log_level=ERROR; +SHOW GLOBAL VARIABLES LIKE 'senna_log_level'; +Variable_name Value +senna_log_level ERROR +SET GLOBAL senna_log_level=WARNING; +SHOW GLOBAL VARIABLES LIKE 'senna_log_level'; +Variable_name Value +senna_log_level WARNING +SET GLOBAL senna_log_level=NOTICE; +SHOW GLOBAL VARIABLES LIKE 'senna_log_level'; +Variable_name Value +senna_log_level NOTICE +SET GLOBAL senna_log_level=INFO; +SHOW GLOBAL VARIABLES LIKE 'senna_log_level'; +Variable_name Value +senna_log_level INFO +SET GLOBAL senna_log_level=DEBUG; +SHOW GLOBAL VARIABLES LIKE 'senna_log_level'; +Variable_name Value +senna_log_level DEBUG +SET GLOBAL senna_log_level=DUMP; +SHOW GLOBAL VARIABLES LIKE 'senna_log_level'; +Variable_name Value +senna_log_level DUMP +SET GLOBAL senna_log_level=DUMMY; +ERROR 42000: Variable 'senna_log_level' can't be set to the value of 'DUMMY' +SHOW VARIABLES LIKE 'senna_log_level'; +Variable_name Value +senna_log_level DUMP +SHOW GLOBAL VARIABLES LIKE 'senna_2ind'; +Variable_name Value +senna_2ind OFF +SHOW SESSION VARIABLES LIKE 'senna_2ind'; +Variable_name Value +senna_2ind OFF +SET senna_2ind=ON; +SHOW GLOBAL VARIABLES LIKE 'senna_2ind'; +Variable_name Value +senna_2ind OFF +SHOW SESSION VARIABLES LIKE 'senna_2ind'; +Variable_name Value +senna_2ind ON +SET senna_2ind=OFF; +SHOW GLOBAL VARIABLES LIKE 'senna_2ind'; +Variable_name Value +senna_2ind OFF +SHOW SESSION VARIABLES LIKE 'senna_2ind'; +Variable_name Value +senna_2ind OFF +SET GLOBAL senna_2ind=ON; +SHOW GLOBAL VARIABLES LIKE 'senna_2ind'; +Variable_name Value +senna_2ind ON +SHOW SESSION VARIABLES LIKE 'senna_2ind'; +Variable_name Value +senna_2ind OFF +SET GLOBAL senna_2ind=OFF; +SHOW GLOBAL VARIABLES LIKE 'senna_2ind'; +Variable_name Value +senna_2ind OFF +SHOW SESSION VARIABLES LIKE 'senna_2ind'; +Variable_name Value +senna_2ind OFF +SET senna_2ind=DUMMY; +ERROR 42000: Variable 'senna_2ind' can't be set to the value of 'DUMMY' +SET GLOBAL senna_2ind=DUMMY; +ERROR 42000: Variable 'senna_2ind' can't be set to the value of 'DUMMY' +SHOW VARIABLES LIKE 'senna_index_type'; +Variable_name Value +senna_index_type NGRAM +SET GLOBAL senna_index_type=mecab; +SHOW VARIABLES LIKE 'senna_index_type'; +Variable_name Value +senna_index_type MECAB +SET GLOBAL senna_index_type=ngram; +SHOW VARIABLES LIKE 'senna_index_type'; +Variable_name Value +senna_index_type NGRAM +SET GLOBAL senna_index_type=hoge; +ERROR 42000: Variable 'senna_index_type' can't be set to the value of 'hoge' +SET SESSION senna_index_type=ngram; +ERROR HY000: Variable 'senna_index_type' is a GLOBAL variable and should be set with SET GLOBAL --- orig/mysql-test/suite/senna/t/senna_cp932.test 1970-01-01 09:00:00.000000000 +0900 +++ new/mysql-test/suite/senna/t/senna_cp932.test 2007-10-29 10:13:50.000000000 +0900 @@ -0,0 +1,160 @@ +# cp932 test + +SET NAMES utf8; + +# TESTS for Ngram +SELECT "===== TESTS for Ngram started ====="; + +SELECT "===== creating test data started ====="; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +CREATE TABLE t1 ( + c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 TEXT, + FULLTEXT INDEX ft USING NGRAM(c2) +) ENGINE = MyISAM DEFAULT CHARSET cp932; + +SHOW CREATE TABLE t1; +SHOW SENNA STATUS; + +INSERT INTO t1 (c2) VALUES ("世界で最もポピュラーなオープンソースデータベースMySQL"); +INSERT INTO t1 (c2) VALUES ("住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。"); +INSERT INTO t1 (c2) VALUES ("他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。"); +INSERT INTO t1 (c2) VALUES ("商用ライセンスは有料ですが、再配布なども自由に行えます。"); +INSERT INTO t1 (c2) VALUES ("信頼性と可用性は、MySQLの大きな特徴です。"); +INSERT INTO t1 (c2) VALUES ("企業のデータを適切に管理することは、DBAの最も大きな仕事です。"); +INSERT INTO t1 (c2) VALUES ("MySQLは優れたセキュリティ機能を提供しています。"); +INSERT INTO t1 (c2) VALUES ("ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。"); +INSERT INTO t1 (c2) VALUES ("MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。"); +INSERT INTO t1 (c2) VALUES ("MySQL Clusterはメモリベースの高速ストレージエンジンです。"); +INSERT INTO t1 (c2) VALUES ("GPLライセンスに基づいてソフトウェアの再配布を行うことができます"); +INSERT INTO t1 (c2) VALUES ("高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。"); +INSERT INTO t1 (c2) VALUES ("GPLソフトウェアは無料ですが、サービスは有料です。"); +INSERT INTO t1 (c2) VALUES ("システム管理工学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("理工学部で物理学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工*です。"); +INSERT INTO t1 (c2) VALUES ("東の湖にて水泳大会を行います。"); +INSERT INTO t1 (c2) VALUES ("先生、その件について詳しく教えて下さい。"); +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +INSERT INTO t1 (c2) VALUES ("御両親の印鑑を押してもらって明日持ってきてください、成績表"); + +SELECT * FROM t1; +SELECT "===== creating test data finished ====="; + +# tests for FULLTEXT search + +SELECT "===== tests for FULLTEXT search started ====="; +SELECT * FROM t1; + +SELECT c1, MATCH(c2) AGAINST("再配布") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("再配布"); +SELECT c1, MATCH(c2) AGAINST("機能") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("機能"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("最新"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+有料" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 +有料" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -有料" IN BOOLEAN MODE); +SELECT c1, MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE); +SELECT c1, MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE); +SELECT c1, MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("OR 商用 OR 教えて" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -(OR 商用 OR 教えて)" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('"DBMS"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*D- +再配布 自由' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -特徴' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -鳥取 -特徴' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N100"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N8"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N7"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N6"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N5"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N4"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N3"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N2"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N1"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N0"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("成績表"); + +SELECT "===== tests for FULLTEXT search finished ====="; + +# tests for INSERT + +SELECT "===== tests for INSERT started ====="; +SELECT * FROM t1; + +INSERT INTO t1 (c2) VALUES ("普段から緊急事態に備えておかなければならない。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); + +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); + +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); + +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); + +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); + +INSERT INTO t1 (c2) VALUES ("職員室に忘れて置いてきてしまった出席表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("出席表"); + +SELECT * FROM t1; +SELECT "===== tests for INSERT finished ====="; + +# tests for DELETE + +SELECT "===== tests for DELETE started ====="; +SELECT * FROM t1; + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("淼"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("表"); + +SELECT * FROM t1; +SELECT "===== tests for DELETE finished ====="; + +# tests for errors + +SELECT "===== tests for errors started ====="; + +--error 1191 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー" IN BOOLEAN MODE); + +--error 1054 +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー"); +--error 1054 +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー" IN BOOLEAN MODE); + +SELECT "===== tests for error finished ====="; + +DROP TABLE t1; +SELECT "===== TESTS for Ngram finished ====="; --- orig/mysql-test/suite/senna/t/senna_create.test 1970-01-01 09:00:00.000000000 +0900 +++ new/mysql-test/suite/senna/t/senna_create.test 2007-10-29 10:13:50.000000000 +0900 @@ -0,0 +1,216 @@ +SET NAMES utf8; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + + +# test for column types + +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 CHAR(100), + c3 VARCHAR(100), + c4 TINYTEXT, + c5 TEXT, + c6 MEDIUMTEXT, + c7 LONGTEXT, + FULLTEXT INDEX USING NGRAM (c2), + FULLTEXT INDEX USING NGRAM (c3), + FULLTEXT INDEX USING NGRAM (c4), + FULLTEXT INDEX USING NGRAM (c5), + FULLTEXT INDEX USING NGRAM (c6), + FULLTEXT INDEX USING NGRAM (c7) +) ENGINE = MyISAM DEFAULT CHARSET utf8; + +SHOW SENNA STATUS; +DROP TABLE t1; + + +# test for colmun types - error + +--error 1283 +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 INT, + FULLTEXT INDEX USING NGRAM (c2) +) ENGINE = MyISAM DEFAULT CHARSET utf8; + +--error 1283 +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 DOUBLE, + FULLTEXT INDEX USING NGRAM (c2) +) ENGINE = MyISAM DEFAULT CHARSET utf8; + +--error 1283 +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 DATETIME, + FULLTEXT INDEX USING NGRAM (c2) +) ENGINE = MyISAM DEFAULT CHARSET utf8; + +--error 1283 +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 BLOB, + FULLTEXT INDEX USING NGRAM (c2) +) ENGINE = MyISAM DEFAULT CHARSET utf8; + + +# fulltext unsupported storage engine +--error 1214 +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 CHAR(100), + FULLTEXT INDEX USING NGRAM (c2) +) ENGINE = MEMORY DEFAULT CHARSET utf8; + +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 CHAR(100), + FULLTEXT INDEX USING NGRAM (c2) +) ENGINE = InnoDB DEFAULT CHARSET utf8; +DROP TABLE t1; + +# multi column fulltext index +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 VARCHAR(128), + c3 TEXT, + FULLTEXT INDEX USING NGRAM (c2, c3) +) ENGINE = MyISAM DEFAULT CHARSET utf8; + +SHOW SENNA STATUS; +DROP TABLE t1; + +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 VARCHAR(128), + c3 TEXT, + c4 TEXT, + FULLTEXT INDEX USING NGRAM (c2, c3, c4) +) ENGINE = MyISAM DEFAULT CHARSET utf8; + +SHOW SENNA STATUS; +DROP TABLE t1; + + +# create and drop index + +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 TEXT +) ENGINE = MyISAM DEFAULT CHARSET utf8; + +SHOW SENNA STATUS; +CREATE FULLTEXT INDEX ft USING NGRAM ON t1(c2); +SHOW SENNA STATUS; + +DROP INDEX ft ON t1; +SHOW SENNA STATUS; + +DROP TABLE t1; + +# alter table and using expressions + +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 TEXT, + c3 TEXT, + c4 TEXT, + c5 TEXT, + c6 TEXT, + c7 TEXT, + c8 TEXT +) ENGINE = MyISAM DEFAULT CHARSET utf8; + +ALTER TABLE t1 ADD FULLTEXT INDEX ft2 USING NGRAM, 20 (c2); +SHOW SENNA STATUS; + +ALTER TABLE t1 ADD FULLTEXT INDEX ft3 USING NGRAM, NO NORMALIZE (c3); + +ALTER TABLE t1 ADD FULLTEXT INDEX ft4 USING NGRAM, NO NORMALIZE, 40 (c4); +SHOW SENNA STATUS; + +ALTER TABLE t1 ADD FULLTEXT INDEX ft5 USING NGRAM (c5); +SHOW SENNA STATUS; + +ALTER TABLE t1 ADD FULLTEXT INDEX ft6 USING NGRAM, NO NORMALIZE (c6); +SHOW SENNA STATUS; + +ALTER TABLE t1 ADD FULLTEXT INDEX ft7 USING NGRAM, 70 (c7); +SHOW SENNA STATUS; + +ALTER TABLE t1 ADD FULLTEXT INDEX ft8 USING NGRAM, NO NORMALIZE, 80 (c8); +SHOW SENNA STATUS; + +DROP TABLE t1; + + +# parser error + +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 TEXT +) ENGINE = MyISAM DEFAULT CHARSET utf8; + +--error 1064 +ALTER TABLE t1 ADD FULLTEXT INDEX ft USING DUMMY; + +--error 1064 +ALTER TABLE t1 ADD FULLTEXT INDEX ft USING -100; + +--error 1064 +ALTER TABLE t1 ADD FULLTEXT INDEX ft USING 10, NGRAM; + +--error 1064 +ALTER TABLE t1 ADD FULLTEXT INDEX ft USING NGRAM, 10, NO NORMALIZE; + +DROP TABLE t1; + + +# drop index and drop error + +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 TEXT, + FULLTEXT INDEX ft USING NGRAM (c2) +) ENGINE = MyISAM DEFAULT CHARSET utf8; + +--error 1091 +DROP INDEX dummy ON t1; + +DROP INDEX ft ON t1; + +DROP TABLE t1; + +# charsets + +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 TEXT, + FULLTEXT INDEX ft USING NGRAM (c2) +) ENGINE = MyISAM DEFAULT CHARSET cp932; + +SHOW SENNA STATUS; + +DROP TABLE t1; + +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 TEXT CHARSET sjis, + c3 TEXT CHARSET cp932, + c4 TEXT CHARSET utf8, + c5 TEXT CHARSET eucjpms, + c6 TEXT CHARSET ujis, + FULLTEXT INDEX ft2 USING NGRAM (c2), + FULLTEXT INDEX ft3 USING NGRAM (c3), + FULLTEXT INDEX ft4 USING NGRAM (c4), + FULLTEXT INDEX ft5 USING NGRAM (c5), + FULLTEXT INDEX ft6 USING NGRAM (c6) +) ENGINE = MyISAM; + +SHOW SENNA STATUS; + +DROP TABLE t1; + +--error 1283 +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 TEXT CHARSET sjis, + c3 TEXT CHARSET ujis, + FULLTEXT INDEX ft USING NGRAM (c2, c3) +) ENGINE = MyISAM; + +# bugfix for delete_all_rows cause missing senna_encoding +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM (c1)) DEFAULT CHARSET utf8; +SHOW SENNA STATUS; +DELETE FROM t1; +SHOW SENNA STATUS; +DROP TABLE t1; + --- orig/mysql-test/suite/senna/t/senna_eucjpms.test 1970-01-01 09:00:00.000000000 +0900 +++ new/mysql-test/suite/senna/t/senna_eucjpms.test 2007-10-29 10:13:50.000000000 +0900 @@ -0,0 +1,160 @@ +# eucjpms test + +SET NAMES utf8; + +# TESTS for Ngram +SELECT "===== TESTS for Ngram started ====="; + +SELECT "===== creating test data started ====="; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +CREATE TABLE t1 ( + c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 TEXT, + FULLTEXT INDEX ft USING NGRAM(c2) +) ENGINE = MyISAM DEFAULT CHARSET eucjpms; + +SHOW CREATE TABLE t1; +SHOW SENNA STATUS; + +INSERT INTO t1 (c2) VALUES ("世界で最もポピュラーなオープンソースデータベースMySQL"); +INSERT INTO t1 (c2) VALUES ("住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。"); +INSERT INTO t1 (c2) VALUES ("他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。"); +INSERT INTO t1 (c2) VALUES ("商用ライセンスは有料ですが、再配布なども自由に行えます。"); +INSERT INTO t1 (c2) VALUES ("信頼性と可用性は、MySQLの大きな特徴です。"); +INSERT INTO t1 (c2) VALUES ("企業のデータを適切に管理することは、DBAの最も大きな仕事です。"); +INSERT INTO t1 (c2) VALUES ("MySQLは優れたセキュリティ機能を提供しています。"); +INSERT INTO t1 (c2) VALUES ("ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。"); +INSERT INTO t1 (c2) VALUES ("MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。"); +INSERT INTO t1 (c2) VALUES ("MySQL Clusterはメモリベースの高速ストレージエンジンです。"); +INSERT INTO t1 (c2) VALUES ("GPLライセンスに基づいてソフトウェアの再配布を行うことができます"); +INSERT INTO t1 (c2) VALUES ("高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。"); +INSERT INTO t1 (c2) VALUES ("GPLソフトウェアは無料ですが、サービスは有料です。"); +INSERT INTO t1 (c2) VALUES ("システム管理工学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("理工学部で物理学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工*です。"); +INSERT INTO t1 (c2) VALUES ("東の湖にて水泳大会を行います。"); +INSERT INTO t1 (c2) VALUES ("先生、その件について詳しく教えて下さい。"); +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +INSERT INTO t1 (c2) VALUES ("御両親の印鑑を押してもらって明日持ってきてください、成績表"); + +SELECT * FROM t1; +SELECT "===== creating test data finished ====="; + +# tests for FULLTEXT search + +SELECT "===== tests for FULLTEXT search started ====="; +SELECT * FROM t1; + +SELECT c1, MATCH(c2) AGAINST("再配布") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("再配布"); +SELECT c1, MATCH(c2) AGAINST("機能") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("機能"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("最新"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+有料" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 +有料" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -有料" IN BOOLEAN MODE); +SELECT c1, MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE); +SELECT c1, MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE); +SELECT c1, MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("OR 商用 OR 教えて" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -(OR 商用 OR 教えて)" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('"DBMS"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*D- +再配布 自由' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -特徴' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -鳥取 -特徴' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N100"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N8"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N7"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N6"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N5"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N4"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N3"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N2"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N1"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N0"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("成績表"); + +SELECT "===== tests for FULLTEXT search finished ====="; + +# tests for INSERT + +SELECT "===== tests for INSERT started ====="; +SELECT * FROM t1; + +INSERT INTO t1 (c2) VALUES ("普段から緊急事態に備えておかなければならない。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); + +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); + +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); + +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); + +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); + +INSERT INTO t1 (c2) VALUES ("職員室に忘れて置いてきてしまった出席表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("出席表"); + +SELECT * FROM t1; +SELECT "===== tests for INSERT finished ====="; + +# tests for DELETE + +SELECT "===== tests for DELETE started ====="; +SELECT * FROM t1; + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("淼"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("表"); + +SELECT * FROM t1; +SELECT "===== tests for DELETE finished ====="; + +# tests for errors + +SELECT "===== tests for errors started ====="; + +--error 1191 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー" IN BOOLEAN MODE); + +--error 1054 +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー"); +--error 1054 +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー" IN BOOLEAN MODE); + +SELECT "===== tests for error finished ====="; + +DROP TABLE t1; +SELECT "===== TESTS for Ngram finished ====="; --- orig/mysql-test/suite/senna/t/senna_kwic.test 1970-01-01 09:00:00.000000000 +0900 +++ new/mysql-test/suite/senna/t/senna_kwic.test 2007-10-29 10:13:50.000000000 +0900 @@ -0,0 +1,107 @@ +# test case for kwic native sql function +SET NAMES utf8; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +# string literal +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", ""); +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "", "埼玉", "", ""); +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 1, "","", "東京", "", ""); +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 45, 1, 0, "... "," ...", "東京", "", ""); + +# char column +CREATE TABLE t1 (c1 CHAR(100)) DEFAULT CHARSET utf8; +INSERT INTO t1 VALUES("今日は東京 >>> 明日は埼玉に行きます。"); +SELECT KWIC(c1, 30, 1, 0, "","", "東京", "", "") FROM t1; +SELECT KWIC(c1, 30, 1, 0, "","", "東京", "", "", "埼玉", "", "") FROM t1; +SELECT KWIC(c1, 30, 1, 1, "","", "東京", "", "") FROM t1; +SELECT KWIC(c1, 45, 1, 0, "... "," ...", "東京", "", "") FROM t1; +DROP TABLE t1; + +# varchar column +CREATE TABLE t1 (c1 VARCHAR(100)) DEFAULT CHARSET utf8; +INSERT INTO t1 VALUES("今日は東京 >>> 明日は埼玉に行きます。"); +SELECT KWIC(c1, 30, 1, 0, "","", "東京", "", "") FROM t1; +SELECT KWIC(c1, 30, 1, 0, "","", "東京", "", "", "埼玉", "", "") FROM t1; +SELECT KWIC(c1, 30, 1, 1, "","", "東京", "", "") FROM t1; +SELECT KWIC(c1, 45, 1, 0, "... "," ...", "東京", "", "") FROM t1; +DROP TABLE t1; + +# text column +CREATE TABLE t1 (c1 TEXT) DEFAULT CHARSET utf8; +INSERT INTO t1 VALUES("今日は東京 >>> 明日は埼玉に行きます。"); +SELECT KWIC(c1, 30, 1, 0, "","", "東京", "", "") FROM t1; +SELECT KWIC(c1, 30, 1, 0, "","", "東京", "", "", "埼玉", "", "") FROM t1; +SELECT KWIC(c1, 30, 1, 1, "","", "東京", "", "") FROM t1; +SELECT KWIC(c1, 45, 1, 0, "... "," ...", "東京", "", "") FROM t1; +DROP TABLE t1; + +# prepared statement +CREATE TABLE t1 (c1 TEXT) DEFAULT CHARSET utf8; +INSERT INTO t1 VALUES("今日は東京 >>> 明日は埼玉に行きます。"); +PREPARE pstmt FROM 'SELECT KWIC(c1, 30, 1, 0, "","", ?, "", "") FROM t1'; +SET @a = "東京"; +EXECUTE pstmt USING @a; +DROP TABLE t1; + +# twice in one query +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", ""), +KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", ""); + +# nested +SELECT KWIC(KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", ""), +30, 1, 0, "","", "東京", "", ""); + +# null +SELECT KWIC(null, 30, 1, 0, "","", "東京", "", ""); +SELECT KWIC(null, null, null, null, null, null, null, null, null); + +# invalid number of arguments +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", ""); +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "", ""); +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "", "埼玉", ""); +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "", "", "埼玉", "", "", ""); + +# invalid value of arguments +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 0, 1, 0, "","", "東京", "", "", ""); +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", -10, 1, 0, "","", "東京", "", "", ""); +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 0, 0, "","", "東京", "", "", ""); +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, -10, 0, "","", "東京", "", "", ""); + +# this is acceptable +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 10, "","", "東京", "", "", ""); +SELECT KWIC("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, -30, "","", "東京", "", "", ""); + +# bugfix for multiple-snippet +--disable_warnings +drop table if exists t1; +--enable_warnings +create table t1 (c1 text) default charset utf8 engine = myisam; + +insert into t1 values("今日は埼玉あああああああああああああああああああああああああああああああああああああ。 +明日も埼玉ああああああああああいいいいいいいいいいいいあああああああああああああああああああああ。 +明後日も埼玉あああああああああああああああああああああああああああああああああああ。 +いつでも埼玉あああああああああああああああああああああああああああああああああ。"); + +select kwic(c1, 20, 1, 0, "", " ...", "埼玉", "", "") from t1; +select kwic(c1, 20, 2, 0, "", " ...", "埼玉", "", "") from t1; +select kwic(c1, 20, 3, 0, "", " ...", "埼玉", "", "") from t1; +select kwic(c1, 20, 4, 0, "", " ...", "埼玉", "", "") from t1; +select kwic(c1, 20, 5, 0, "", " ...", "埼玉", "", "") from t1; + +select kwic(c1, 20, 1, 0, "(", ")", "埼玉", "[", "]") from t1; +select kwic(c1, 20, 2, 0, "(", ")", "埼玉", "[", "]") from t1; +select kwic(c1, 20, 3, 0, "(", ")", "埼玉", "[", "]") from t1; +select kwic(c1, 20, 4, 0, "(", ")", "埼玉", "[", "]") from t1; +select kwic(c1, 20, 5, 0, "(", ")", "埼玉", "[", "]") from t1; + +drop table t1; + +# bugfix colmun data is null +CREATE TABLE t1 (c1 int, c2 TEXT) DEFAULT CHARSET utf8; +INSERT INTO t1 (c1) VALUES (100); +SELECT KWIC(c1, 30, 1, 0, "","", "東京", "", "") FROM t1; +DROP TABLE t1; + --- orig/mysql-test/suite/senna/t/senna_section.test 1970-01-01 09:00:00.000000000 +0900 +++ new/mysql-test/suite/senna/t/senna_section.test 2007-10-29 10:13:50.000000000 +0900 @@ -0,0 +1,94 @@ +# test case for multi-section function +SET NAMES utf8; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 VARCHAR(20), c3 TEXT) DEFAULT CHARSET utf8; +ALTER TABLE t1 ADD FULLTEXT INDEX ft USING NGRAM, SECTIONALIZE (c2,c3); +SHOW SENNA STATUS; + +INSERT INTO t1 VALUES(1, "c2あたりc2", "c3あたりc3"); +INSERT INTO t1 VALUES(2, "c2あたりc2", "c3はずれc3"); +INSERT INTO t1 VALUES(3, "c2はずれc2", "c3あたりc3"); +INSERT INTO t1 VALUES(4, "c2はずれc2", "c3はずれc3"); +SELECT * FROM t1; + +# non-section search +SELECT *, MATCH(c2,c3) AGAINST("あたり") AS score FROM t1 +WHERE MATCH(c2,c3) AGAINST("あたり") ORDER BY score DESC; + +SELECT *, MATCH(c2,c3) AGAINST("あたり" IN BOOLEAN MODE) AS score FROM t1 +WHERE MATCH(c2,c3) AGAINST("あたり" IN BOOLEAN MODE) ORDER BY score DESC; + +# simple section search +SELECT *, MATCH(c2,c3) AGAINST("*W1 あたり" IN BOOLEAN MODE) AS score FROM t1 +WHERE MATCH(c2,c3) AGAINST("*W1 あたり" IN BOOLEAN MODE); + +SELECT *, MATCH(c2,c3) AGAINST("*W2 あたり" IN BOOLEAN MODE) AS score FROM t1 +WHERE MATCH(c2,c3) AGAINST("*W2 あたり" IN BOOLEAN MODE); + +SELECT *, MATCH(c2,c3) AGAINST("*W1,2 あたり" IN BOOLEAN MODE) AS score FROM t1 +WHERE MATCH(c2,c3) AGAINST("*W1,2 あたり" IN BOOLEAN MODE); + +# non-existing section number +SELECT *, MATCH(c2,c3) AGAINST("*W3 あたり" IN BOOLEAN MODE) AS score FROM t1 +WHERE MATCH(c2,c3) AGAINST("*W3 あたり" IN BOOLEAN MODE); + +# section search with weight factor +SELECT *, MATCH(c2,c3) AGAINST("*W1:10,2:1 あたり" IN BOOLEAN MODE) AS score FROM t1 +WHERE MATCH(c2,c3) AGAINST("*W1:10,2:1 あたり" IN BOOLEAN MODE); + +# delete and select +DELETE FROM t1 WHERE c1 = 2; +SELECT * FROM t1; +SELECT *, MATCH(c2,c3) AGAINST("あたり" IN BOOLEAN MODE) AS score FROM t1 +WHERE MATCH(c2,c3) AGAINST("あたり" IN BOOLEAN MODE); + +DELETE FROM t1 WHERE c1 = 4; +SELECT * FROM t1; + +DELETE FROM t1; +SELECT * FROM t1; + +DROP INDEX ft ON t1; +SHOW SENNA STATUS; +DROP TABLE t1; + +# complex test +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 VARCHAR(20), c3 INT, c4 TEXT) DEFAULT CHARSET utf8; +ALTER TABLE t1 ADD FULLTEXT INDEX ft USING NGRAM, SECTIONALIZE (c2,c4); +SHOW SENNA STATUS; + +INSERT INTO t1 VALUES(1, "c2あたりc2", 100, "c4あたりc4"); +INSERT INTO t1 VALUES(2, "c2あたりc2", 200, "c4はずれc4"); +INSERT INTO t1 VALUES(3, "c2はずれc2", 300, "c4あたりc4"); +INSERT INTO t1 VALUES(4, "c2はずれc2", 400, "c4はずれc4"); + +SELECT *, MATCH(c2,c4) AGAINST("*W1:10,2:1 あたり" IN BOOLEAN MODE) AS score FROM t1 +WHERE MATCH(c2,c4) AGAINST("*W1:10,2:1 あたり" IN BOOLEAN MODE); + +DELETE FROM t1 WHERE c1 = 2; +SELECT * FROM t1; +SELECT *, MATCH(c2,c4) AGAINST("*W1:10,2:1 あたり" IN BOOLEAN MODE) AS score FROM t1 +WHERE MATCH(c2,c4) AGAINST("*W1:10,2:1 あたり" IN BOOLEAN MODE); + +INSERT INTO t1 VALUES(2, "c2あたりc2", 200, "c4はずれc4"); +ALTER TABLE t1 ADD c2a INT AFTER c2; +UPDATE t1 SET c2a = 10; + +SELECT *, MATCH(c2,c4) AGAINST("*W1:10,2:1 あたり" IN BOOLEAN MODE) AS score FROM t1 +WHERE MATCH(c2,c4) AGAINST("*W1:10,2:1 あたり" IN BOOLEAN MODE); + +DELETE FROM t1 WHERE c1 = 2; +SELECT * FROM t1; +SELECT *, MATCH(c2,c4) AGAINST("*W1:10,2:1 あたり" IN BOOLEAN MODE) AS score FROM t1 +WHERE MATCH(c2,c4) AGAINST("*W1:10,2:1 あたり" IN BOOLEAN MODE); + +SHOW SENNA STATUS; +DELETE FROM t1; +SHOW SENNA STATUS; +DROP TABLE t1; +SHOW SENNA STATUS; --- orig/mysql-test/suite/senna/t/senna_sjis.test 1970-01-01 09:00:00.000000000 +0900 +++ new/mysql-test/suite/senna/t/senna_sjis.test 2007-10-29 10:13:50.000000000 +0900 @@ -0,0 +1,163 @@ +# sjis test + +SET NAMES utf8; + +# TESTS for Ngram +SELECT "===== TESTS for Ngram started ====="; + +SELECT "===== creating test data started ====="; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +CREATE TABLE t1 ( + c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 TEXT, + FULLTEXT INDEX ft USING NGRAM(c2) +) ENGINE = MyISAM DEFAULT CHARSET sjis; + +SHOW CREATE TABLE t1; +SHOW SENNA STATUS; + +INSERT INTO t1 (c2) VALUES ("世界で最もポピュラーなオープンソースデータベースMySQL"); +INSERT INTO t1 (c2) VALUES ("住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。"); +INSERT INTO t1 (c2) VALUES ("他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。"); +INSERT INTO t1 (c2) VALUES ("商用ライセンスは有料ですが、再配布なども自由に行えます。"); +INSERT INTO t1 (c2) VALUES ("信頼性と可用性は、MySQLの大きな特徴です。"); +INSERT INTO t1 (c2) VALUES ("企業のデータを適切に管理することは、DBAの最も大きな仕事です。"); +INSERT INTO t1 (c2) VALUES ("MySQLは優れたセキュリティ機能を提供しています。"); +INSERT INTO t1 (c2) VALUES ("ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。"); +INSERT INTO t1 (c2) VALUES ("MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。"); +INSERT INTO t1 (c2) VALUES ("MySQL Clusterはメモリベースの高速ストレージエンジンです。"); +INSERT INTO t1 (c2) VALUES ("GPLライセンスに基づいてソフトウェアの再配布を行うことができます"); +INSERT INTO t1 (c2) VALUES ("高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。"); +INSERT INTO t1 (c2) VALUES ("GPLソフトウェアは無料ですが、サービスは有料です。"); +INSERT INTO t1 (c2) VALUES ("システム管理工学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("理工学部で物理学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工*です。"); +INSERT INTO t1 (c2) VALUES ("東の湖にて水泳大会を行います。"); +INSERT INTO t1 (c2) VALUES ("先生、その件について詳しく教えて下さい。"); +# warning 1366 +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +# warning 1366 +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +# warning 1366 +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +INSERT INTO t1 (c2) VALUES ("御両親の印鑑を押してもらって明日持ってきてください、成績表"); + +SELECT * FROM t1; +SELECT "===== creating test data finished ====="; + +# tests for FULLTEXT search + +SELECT "===== tests for FULLTEXT search started ====="; +SELECT * FROM t1; + +SELECT c1, MATCH(c2) AGAINST("再配布") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("再配布"); +SELECT c1, MATCH(c2) AGAINST("機能") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("機能"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("最新"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+有料" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 +有料" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -有料" IN BOOLEAN MODE); +SELECT c1, MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE); +SELECT c1, MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE); +SELECT c1, MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("OR 商用 OR 教えて" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -(OR 商用 OR 教えて)" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('"DBMS"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*D- +再配布 自由' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -特徴' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -鳥取 -特徴' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N100"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N8"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N7"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N6"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N5"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N4"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N3"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N2"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N1"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N0"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("成績表"); + +SELECT "===== tests for FULLTEXT search finished ====="; + +# tests for INSERT + +SELECT "===== tests for INSERT started ====="; +SELECT * FROM t1; + +INSERT INTO t1 (c2) VALUES ("普段から緊急事態に備えておかなければならない。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); + +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); + +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); + +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); + +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); + +INSERT INTO t1 (c2) VALUES ("職員室に忘れて置いてきてしまった出席表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("出席表"); + +SELECT * FROM t1; +SELECT "===== tests for INSERT finished ====="; + +# tests for DELETE + +SELECT "===== tests for DELETE started ====="; +SELECT * FROM t1; + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("淼"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("表"); + +SELECT * FROM t1; +SELECT "===== tests for DELETE finished ====="; + +# tests for errors + +SELECT "===== tests for errors started ====="; + +--error 1191 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー" IN BOOLEAN MODE); + +--error 1054 +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー"); +--error 1054 +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー" IN BOOLEAN MODE); + +SELECT "===== tests for error finished ====="; + +DROP TABLE t1; +SELECT "===== TESTS for Ngram finished ====="; --- orig/mysql-test/suite/senna/t/senna_split.test 1970-01-01 09:00:00.000000000 +0900 +++ new/mysql-test/suite/senna/t/senna_split.test 2007-10-29 10:13:50.000000000 +0900 @@ -0,0 +1,266 @@ +# testcase for SPLIT_ALPHA, SPLIT_DIGIT, SPLIT_SYMBOL + +SET NAMES utf8; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +# create index and show senna status + +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM, SPLIT_ALPHA (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; +SHOW SENNA STATUS; +DROP TABLE t1; + +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM, SPLIT_DIGIT (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; +SHOW SENNA STATUS; +DROP TABLE t1; + +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM, SPLIT_SYMBOL (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; +SHOW SENNA STATUS; +DROP TABLE t1; + +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM, SPLIT_ALPHA, SPLIT_DIGIT, SPLIT_SYMBOL (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; +SHOW SENNA STATUS; +DROP TABLE t1; + + +# search without split flags (utf8) + +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; + +INSERT INTO t1 VALUES("FedoraCore500の技"); + +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); + +DROP TABLE t1; + +# search with split flags (utf8) + +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM, SPLIT_ALPHA, SPLIT_DIGIT, SPLIT_SYMBOL (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; + +INSERT INTO t1 VALUES("FedoraCore500の技"); + +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); + +DROP TABLE t1; + +# search without split flags (cp932) + +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM (c1)) +ENGINE = MyISAM DEFAULT CHARSET = cp932; + +INSERT INTO t1 VALUES("FedoraCore500の技"); + +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); + +DROP TABLE t1; + +# search with split flags (cp932) + +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM, SPLIT_ALPHA, SPLIT_DIGIT, SPLIT_SYMBOL (c1)) +ENGINE = MyISAM DEFAULT CHARSET = cp932; + +INSERT INTO t1 VALUES("FedoraCore500の技"); + +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); + +DROP TABLE t1; + +# search without split flags (eucjpms) + +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM (c1)) +ENGINE = MyISAM DEFAULT CHARSET = eucjpms; + +INSERT INTO t1 VALUES("FedoraCore500の技"); + +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); + +DROP TABLE t1; + +# search with split flags (eucjpms) + +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM, SPLIT_ALPHA, SPLIT_DIGIT, SPLIT_SYMBOL (c1)) +ENGINE = MyISAM DEFAULT CHARSET = eucjpms; + +INSERT INTO t1 VALUES("FedoraCore500の技"); + +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); + +DROP TABLE t1; +# testcase for SPLIT_ALPHA, SPLIT_DIGIT, SPLIT_SYMBOL + +SET NAMES utf8; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +# create index and show senna status + +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM, SPLIT_ALPHA (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; +SHOW SENNA STATUS; +DROP TABLE t1; + +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM, SPLIT_DIGIT (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; +SHOW SENNA STATUS; +DROP TABLE t1; + +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM, SPLIT_SYMBOL (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; +SHOW SENNA STATUS; +DROP TABLE t1; + +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM, SPLIT_ALPHA, SPLIT_DIGIT, SPLIT_SYMBOL (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; +SHOW SENNA STATUS; +DROP TABLE t1; + + +# search without split flags (utf8) + +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; + +INSERT INTO t1 VALUES("FedoraCore500の技"); + +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); + +DROP TABLE t1; + +# search with split flags (utf8) + +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM, SPLIT_ALPHA, SPLIT_DIGIT, SPLIT_SYMBOL (c1)) +ENGINE = MyISAM DEFAULT CHARSET = utf8; + +INSERT INTO t1 VALUES("FedoraCore500の技"); + +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); + +DROP TABLE t1; + +# search without split flags (cp932) + +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM (c1)) +ENGINE = MyISAM DEFAULT CHARSET = cp932; + +INSERT INTO t1 VALUES("FedoraCore500の技"); + +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); + +DROP TABLE t1; + +# search with split flags (cp932) + +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM, SPLIT_ALPHA, SPLIT_DIGIT, SPLIT_SYMBOL (c1)) +ENGINE = MyISAM DEFAULT CHARSET = cp932; + +INSERT INTO t1 VALUES("FedoraCore500の技"); + +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); + +DROP TABLE t1; + +# search without split flags (eucjpms) + +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM (c1)) +ENGINE = MyISAM DEFAULT CHARSET = eucjpms; + +INSERT INTO t1 VALUES("FedoraCore500の技"); + +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); + +DROP TABLE t1; + +# search with split flags (eucjpms) + +CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft +USING NGRAM, SPLIT_ALPHA, SPLIT_DIGIT, SPLIT_SYMBOL (c1)) +ENGINE = MyISAM DEFAULT CHARSET = eucjpms; + +INSERT INTO t1 VALUES("FedoraCore500の技"); + +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500"); + +DROP TABLE t1; --- orig/mysql-test/suite/senna/t/senna_ujis.test 1970-01-01 09:00:00.000000000 +0900 +++ new/mysql-test/suite/senna/t/senna_ujis.test 2007-10-29 10:13:50.000000000 +0900 @@ -0,0 +1,162 @@ +# ujis test + +SET NAMES utf8; + +# TESTS for Ngram +SELECT "===== TESTS for Ngram started ====="; + +SELECT "===== creating test data started ====="; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +CREATE TABLE t1 ( + c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 TEXT, + FULLTEXT INDEX ft USING NGRAM(c2) +) ENGINE = MyISAM DEFAULT CHARSET ujis; + +SHOW CREATE TABLE t1; +SHOW SENNA STATUS; + +INSERT INTO t1 (c2) VALUES ("世界で最もポピュラーなオープンソースデータベースMySQL"); +INSERT INTO t1 (c2) VALUES ("住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。"); +INSERT INTO t1 (c2) VALUES ("他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。"); +INSERT INTO t1 (c2) VALUES ("商用ライセンスは有料ですが、再配布なども自由に行えます。"); +INSERT INTO t1 (c2) VALUES ("信頼性と可用性は、MySQLの大きな特徴です。"); +INSERT INTO t1 (c2) VALUES ("企業のデータを適切に管理することは、DBAの最も大きな仕事です。"); +INSERT INTO t1 (c2) VALUES ("MySQLは優れたセキュリティ機能を提供しています。"); +INSERT INTO t1 (c2) VALUES ("ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。"); +INSERT INTO t1 (c2) VALUES ("MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。"); +INSERT INTO t1 (c2) VALUES ("MySQL Clusterはメモリベースの高速ストレージエンジンです。"); +INSERT INTO t1 (c2) VALUES ("GPLライセンスに基づいてソフトウェアの再配布を行うことができます"); +INSERT INTO t1 (c2) VALUES ("高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。"); +INSERT INTO t1 (c2) VALUES ("GPLソフトウェアは無料ですが、サービスは有料です。"); +INSERT INTO t1 (c2) VALUES ("システム管理工学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("理工学部で物理学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工*です。"); +INSERT INTO t1 (c2) VALUES ("東の湖にて水泳大会を行います。"); +INSERT INTO t1 (c2) VALUES ("先生、その件について詳しく教えて下さい。"); +# warning 1366 +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +# warning 1366 +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +INSERT INTO t1 (c2) VALUES ("御両親の印鑑を押してもらって明日持ってきてください、成績表"); + +SELECT * FROM t1; +SELECT "===== creating test data finished ====="; + +# tests for FULLTEXT search + +SELECT "===== tests for FULLTEXT search started ====="; +SELECT * FROM t1; + +SELECT c1, MATCH(c2) AGAINST("再配布") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("再配布"); +SELECT c1, MATCH(c2) AGAINST("機能") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("機能"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("最新"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+有料" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 +有料" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -有料" IN BOOLEAN MODE); +SELECT c1, MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE); +SELECT c1, MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE); +SELECT c1, MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("OR 商用 OR 教えて" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -(OR 商用 OR 教えて)" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('"DBMS"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*D- +再配布 自由' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -特徴' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -鳥取 -特徴' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N100"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N8"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N7"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N6"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N5"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N4"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N3"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N2"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N1"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N0"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("成績表"); + +SELECT "===== tests for FULLTEXT search finished ====="; + +# tests for INSERT + +SELECT "===== tests for INSERT started ====="; +SELECT * FROM t1; + +INSERT INTO t1 (c2) VALUES ("普段から緊急事態に備えておかなければならない。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); + +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); + +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); + +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); + +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); + +INSERT INTO t1 (c2) VALUES ("職員室に忘れて置いてきてしまった出席表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("出席表"); + +SELECT * FROM t1; +SELECT "===== tests for INSERT finished ====="; + +# tests for DELETE + +SELECT "===== tests for DELETE started ====="; +SELECT * FROM t1; + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("淼"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("表"); + +SELECT * FROM t1; +SELECT "===== tests for DELETE finished ====="; + +# tests for errors + +SELECT "===== tests for errors started ====="; + +--error 1191 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー" IN BOOLEAN MODE); + +--error 1054 +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー"); +--error 1054 +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー" IN BOOLEAN MODE); + +SELECT "===== tests for error finished ====="; + +DROP TABLE t1; +SELECT "===== TESTS for Ngram finished ====="; --- orig/mysql-test/suite/senna/t/senna_utf8.test 1970-01-01 09:00:00.000000000 +0900 +++ new/mysql-test/suite/senna/t/senna_utf8.test 2007-10-29 10:13:50.000000000 +0900 @@ -0,0 +1,160 @@ +# utf8 test + +SET NAMES utf8; + +# TESTS for Ngram +SELECT "===== TESTS for Ngram started ====="; + +SELECT "===== creating test data started ====="; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +CREATE TABLE t1 ( + c1 INT PRIMARY KEY AUTO_INCREMENT, + c2 TEXT, + FULLTEXT INDEX ft USING NGRAM(c2) +) ENGINE = MyISAM DEFAULT CHARSET utf8; + +SHOW CREATE TABLE t1; +SHOW SENNA STATUS; + +INSERT INTO t1 (c2) VALUES ("世界で最もポピュラーなオープンソースデータベースMySQL"); +INSERT INTO t1 (c2) VALUES ("住商情報システムはMySQLのオフィシャルトレーニングと商用ライセンスを提供しております。"); +INSERT INTO t1 (c2) VALUES ("他のオープンソースRDBMSと比較して「高速」で「安定」していることに定評があり、世界で600万のMySQLが稼動しています。"); +INSERT INTO t1 (c2) VALUES ("商用ライセンスは有料ですが、再配布なども自由に行えます。"); +INSERT INTO t1 (c2) VALUES ("信頼性と可用性は、MySQLの大きな特徴です。"); +INSERT INTO t1 (c2) VALUES ("企業のデータを適切に管理することは、DBAの最も大きな仕事です。"); +INSERT INTO t1 (c2) VALUES ("MySQLは優れたセキュリティ機能を提供しています。"); +INSERT INTO t1 (c2) VALUES ("ビジネスシステムで利用する場合には、サポートを購入して頂くことで安心してMySQLをご利用頂けます。"); +INSERT INTO t1 (c2) VALUES ("MySQLの特徴を活かした設計を、お客様のご要件に基づいて行います。"); +INSERT INTO t1 (c2) VALUES ("MySQL Clusterはメモリベースの高速ストレージエンジンです。"); +INSERT INTO t1 (c2) VALUES ("GPLライセンスに基づいてソフトウェアの再配布を行うことができます"); +INSERT INTO t1 (c2) VALUES ("高機能性と高速性の両立は大変ですが、MySQLは機能的にも優れ、かつ性能も非常に良いです。"); +INSERT INTO t1 (c2) VALUES ("GPLソフトウェアは無料ですが、サービスは有料です。"); +INSERT INTO t1 (c2) VALUES ("システム管理工学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("理工学部で物理学を担当している教授です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工です。"); +INSERT INTO t1 (c2) VALUES ("私の専攻は理工*です。"); +INSERT INTO t1 (c2) VALUES ("東の湖にて水泳大会を行います。"); +INSERT INTO t1 (c2) VALUES ("先生、その件について詳しく教えて下さい。"); +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +INSERT INTO t1 (c2) VALUES ("御両親の印鑑を押してもらって明日持ってきてください、成績表"); + +SELECT * FROM t1; +SELECT "===== creating test data finished ====="; + +# tests for FULLTEXT search + +SELECT "===== tests for FULLTEXT search started ====="; +SELECT * FROM t1; + +SELECT c1, MATCH(c2) AGAINST("再配布") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("再配布"); +SELECT c1, MATCH(c2) AGAINST("機能") as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("機能"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("最新"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+有料" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 +有料" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -有料" IN BOOLEAN MODE); +SELECT c1, MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("OR 再配布 OR 商用" IN BOOLEAN MODE); +SELECT c1, MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 ~ 商用" IN BOOLEAN MODE); +SELECT c1, MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE) as score, c2 FROM t1 WHERE MATCH(c2) AGAINST("+再配布 < 商用 > 教えて" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("OR 商用 OR 教えて" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("+再配布 -(OR 商用 OR 教えて)" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('"DBMS"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*D- +再配布 自由' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -特徴' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('+信頼性 -埼玉 -東京 -千葉 -神奈川 -山梨 -新潟 -静岡 -長野 -栃木 -群馬 -茨城 -福島 -青森 -岩手 -山形 -秋田 -富山 -加賀 -滋賀 -愛知 -岐阜 -京都 -大阪 -奈良 -和歌山 -愛媛 -高知 -徳島 -岡山 -広島 -鳥取 -特徴' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N100"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N8"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N7"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N6"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N5"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N4"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N3"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N2"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N1"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST('*N0"湖 水泳"' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("成績表"); + +SELECT "===== tests for FULLTEXT search finished ====="; + +# tests for INSERT + +SELECT "===== tests for INSERT started ====="; +SELECT * FROM t1; + +INSERT INTO t1 (c2) VALUES ("普段から緊急事態に備えておかなければならない。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); + +INSERT INTO t1 (c2) VALUES ("宛名書きは住商情報システム㈱でお願いいたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); + +INSERT INTO t1 (c2) VALUES ("ファイナルファンタジーⅶを1本下さい。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); + +INSERT INTO t1 (c2) VALUES ("NEC選定IBM拡張文字の淼について今日はお話いたします。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); + +INSERT INTO t1 (c2) VALUES ("日本語の文字の種類のひとつとして半角カタカナがある。"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); + +INSERT INTO t1 (c2) VALUES ("職員室に忘れて置いてきてしまった出席表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("出席表"); + +SELECT * FROM t1; +SELECT "===== tests for INSERT finished ====="; + +# tests for DELETE + +SELECT "===== tests for DELETE started ====="; +SELECT * FROM t1; + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("緊急"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("緊急"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("㈱"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("㈱"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("ⅶ"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("淼"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("淼"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("カタカナ"); + +DELETE FROM t1 WHERE MATCH(c2) AGAINST("表"); +SELECT * FROM t1 WHERE MATCH(c2) AGAINST("表"); + +SELECT * FROM t1; +SELECT "===== tests for DELETE finished ====="; + +# tests for errors + +SELECT "===== tests for errors started ====="; + +--error 1191 +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー"); +SELECT * FROM t1 WHERE MATCH(c1) AGAINST("ダミー" IN BOOLEAN MODE); + +--error 1054 +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー"); +--error 1054 +SELECT * FROM t1 WHERE MATCH(c3) AGAINST("ダミー" IN BOOLEAN MODE); + +SELECT "===== tests for error finished ====="; + +DROP TABLE t1; +SELECT "===== TESTS for Ngram finished ====="; --- orig/mysql-test/suite/senna/t/senna_util.test 1970-01-01 09:00:00.000000000 +0900 +++ new/mysql-test/suite/senna/t/senna_util.test 2007-10-29 10:13:50.000000000 +0900 @@ -0,0 +1,88 @@ + +# test for added senna variables + +SHOW VARIABLES LIKE 'senna_%'; + +# test for senna_log_level + +--error 1229 +SET senna_log_level=INFO; + +SET GLOBAL senna_log_level=NONE; +SHOW GLOBAL VARIABLES LIKE 'senna_log_level'; + +SET GLOBAL senna_log_level=EMERG; +SHOW GLOBAL VARIABLES LIKE 'senna_log_level'; + +SET GLOBAL senna_log_level=ALERT; +SHOW GLOBAL VARIABLES LIKE 'senna_log_level'; + +SET GLOBAL senna_log_level=CRIT; +SHOW GLOBAL VARIABLES LIKE 'senna_log_level'; + +SET GLOBAL senna_log_level=ERROR; +SHOW GLOBAL VARIABLES LIKE 'senna_log_level'; + +SET GLOBAL senna_log_level=WARNING; +SHOW GLOBAL VARIABLES LIKE 'senna_log_level'; + +SET GLOBAL senna_log_level=NOTICE; +SHOW GLOBAL VARIABLES LIKE 'senna_log_level'; + +SET GLOBAL senna_log_level=INFO; +SHOW GLOBAL VARIABLES LIKE 'senna_log_level'; + +SET GLOBAL senna_log_level=DEBUG; +SHOW GLOBAL VARIABLES LIKE 'senna_log_level'; + +SET GLOBAL senna_log_level=DUMP; +SHOW GLOBAL VARIABLES LIKE 'senna_log_level'; + +--error 1231 +SET GLOBAL senna_log_level=DUMMY; +SHOW VARIABLES LIKE 'senna_log_level'; + +# test for senna_2ind + +SHOW GLOBAL VARIABLES LIKE 'senna_2ind'; +SHOW SESSION VARIABLES LIKE 'senna_2ind'; + +SET senna_2ind=ON; + +SHOW GLOBAL VARIABLES LIKE 'senna_2ind'; +SHOW SESSION VARIABLES LIKE 'senna_2ind'; + +SET senna_2ind=OFF; + +SHOW GLOBAL VARIABLES LIKE 'senna_2ind'; +SHOW SESSION VARIABLES LIKE 'senna_2ind'; + +SET GLOBAL senna_2ind=ON; + +SHOW GLOBAL VARIABLES LIKE 'senna_2ind'; +SHOW SESSION VARIABLES LIKE 'senna_2ind'; + +SET GLOBAL senna_2ind=OFF; + +SHOW GLOBAL VARIABLES LIKE 'senna_2ind'; +SHOW SESSION VARIABLES LIKE 'senna_2ind'; + +--error 1231 +SET senna_2ind=DUMMY; + +--error 1231 +SET GLOBAL senna_2ind=DUMMY; + +# test for senna_index_type + +SHOW VARIABLES LIKE 'senna_index_type'; +SET GLOBAL senna_index_type=mecab; +SHOW VARIABLES LIKE 'senna_index_type'; +SET GLOBAL senna_index_type=ngram; +SHOW VARIABLES LIKE 'senna_index_type'; + +--error 1231 +SET GLOBAL senna_index_type=hoge; + +--error 1229 +SET SESSION senna_index_type=ngram; --- orig/scripts/mysqlbug 2007-07-04 22:15:30.000000000 +0900 +++ new/scripts/mysqlbug 2007-10-29 10:13:54.000000000 +0900 @@ -23,8 +23,8 @@ VERSION="5.0.45" COMPILATION_COMMENT="Source distribution" BUGmysql="mysql@lists.mysql.com" # This is set by configure -COMP_ENV_INFO="CC='ccache gcc' CFLAGS='' CXX='ccache gcc' CXXFLAGS='-felide-constructors -fno-exceptions -fno-rtti' LDFLAGS='' ASFLAGS=''" -CONFIGURE_LINE="./configure '--with-embedded-server' '--with-berkeley-db' '--with-innodb' '--enable-thread-safe-client' '--with-extra-charsets=complex' '--with-ndbcluster' 'CC=ccache gcc' 'CXXFLAGS=-felide-constructors -fno-exceptions -fno-rtti' 'CXX=ccache gcc'" +COMP_ENV_INFO="CC='gcc' CFLAGS='' CXX='gcc' CXXFLAGS='-felide-constructors -fno-exceptions -fno-rtti' LDFLAGS='' ASFLAGS=''" +CONFIGURE_LINE="./configure '--with-embedded-server' '--with-berkeley-db' '--with-innodb' '--enable-thread-safe-client' '--with-extra-charsets=complex' '--with-ndbcluster' 'CC=gcc' 'CXXFLAGS=-felide-constructors -fno-exceptions -fno-rtti' 'CXX=gcc'" LIBC_INFO="" for pat in /lib/libc.* /lib/libc-* /usr/lib/libc.* /usr/lib/libc-* @@ -252,8 +252,8 @@ ${ORGANIZATION- $ORGANIZATION_C} >Class: $CLASS_C >Release: mysql-${VERSION} ($COMPILATION_COMMENT) `test -n "$MYSQL_SERVER" && echo ">Server: $MYSQL_SERVER"` ->C compiler: gcc (GCC) 4.0.2 20051125 (Red Hat 4.0.2-8) ->C++ compiler: gcc (GCC) 4.0.2 20051125 (Red Hat 4.0.2-8) +>C compiler: gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-8) +>C++ compiler: gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-8) >Environment: $ENVIRONMENT_C `test -n "$SYSTEM" && echo "System: $SYSTEM"` --- orig/sql/Makefile.am 2007-07-04 22:06:40.000000000 +0900 +++ new/sql/Makefile.am 2007-10-29 10:14:21.000000000 +0900 @@ -22,7 +22,7 @@ INCLUDES = @ZLIB_INCLUDES@ \ @bdb_includes@ @innodb_includes@ @ndbcluster_includes@ \ -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/regex -I$(srcdir) \ - $(openssl_includes) + $(openssl_includes) @SENNA_INCLUDES@ @MECAB_INCLUDES@ WRAPLIBS= @WRAPLIBS@ SUBDIRS = share libexec_PROGRAMS = mysqld @@ -44,7 +44,8 @@ mysqld_LDADD = @MYSQLD_EXTRA_LDFLAGS@ \ @ndbcluster_libs@ @ndbcluster_system_libs@ \ $(LDADD) $(CXXLDFLAGS) $(WRAPLIBS) @LIBDL@ \ $(yassl_libs) $(openssl_libs) \ - @MYSQLD_EXTRA_LIBS@ + @MYSQLD_EXTRA_LIBS@ \ + @SENNA_LIBS@ @MECAB_LIBS@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \ item_strfunc.h item_timefunc.h item_uniq.h \ --- orig/sql/filesort.cc 2007-07-04 22:06:16.000000000 +0900 +++ new/sql/filesort.cc 2007-10-29 10:14:21.000000000 +0900 @@ -1307,6 +1307,9 @@ sortlength(THD *thd, SORT_FIELD *sortord } if (sortorder->field->maybe_null()) length++; // Place for NULL marker +#ifdef ENABLE_SENNA + my_thread_var->sen_flags |= SENNA_FILESORT; +#endif /* ENABLE_SENNA */ } else { --- orig/sql/ha_myisam.cc 2007-07-04 22:06:09.000000000 +0900 +++ new/sql/ha_myisam.cc 2007-10-29 10:14:21.000000000 +0900 @@ -120,6 +120,45 @@ static void mi_check_print_msg(MI_CHECK return; } +#ifdef ENABLE_SENNA +typedef struct st_senna_enc_map { + char* enc_mysql; + sen_encoding enc_senna; +} SENNA_ENC_MAP; + +SENNA_ENC_MAP senna_enc_mapping[] = { + {"utf8", sen_enc_utf8}, + {"cp932", sen_enc_sjis}, + {"sjis", sen_enc_sjis}, + {"eucjpms", sen_enc_euc_jp}, + {"ujis", sen_enc_euc_jp}, + {"latin1", sen_enc_latin1}, + {"koi8r", sen_enc_koi8r}, + {0, sen_enc_default}, + {0, sen_enc_none}}; /* this must be last */ + +sen_encoding senna_enc_senna(const char *csname) +{ + if (!csname) return sen_enc_none; + int i; + for (i = 0; senna_enc_mapping[i].enc_mysql; i++) { + if (!(my_strcasecmp(system_charset_info, csname, + senna_enc_mapping[i].enc_mysql))) + return senna_enc_mapping[i].enc_senna; + } + return sen_enc_none; +} + +char *senna_enc_mysql(sen_encoding encoding) +{ + int i; + for (i = 0; (senna_enc_mapping[i].enc_senna != sen_enc_default); i++) { + if (senna_enc_mapping[i].enc_senna == encoding) + return senna_enc_mapping[i].enc_mysql; + } + return 0; +} +#endif /* ENABLE_SENNA */ /* Convert TABLE object to MyISAM key and column definition @@ -166,6 +205,18 @@ int table2myisam(TABLE *table_arg, MI_KE for (i= 0; i < share->keys; i++, pos++) { keydef[i].flag= (pos->flags & (HA_NOSAME | HA_FULLTEXT | HA_SPATIAL)); +#ifdef ENABLE_SENNA + if ((keydef[i].flag & HA_FULLTEXT)) { + if (table_arg->key_info) { + keydef[i].senna_flags=pos->senna_flags; + keydef[i].senna_initial_n_segments=pos->senna_initial_n_segments; + keydef[i].senna_encoding=senna_enc_senna(pos->senna_encoding); + } else { + keydef[i].senna_flags=SEN_DISABLE_SENNA; + keydef[i].senna_initial_n_segments=0; + } + } +#endif /* ENABLE_SENNA */ keydef[i].key_alg= pos->algorithm == HA_KEY_ALG_UNDEF ? (pos->flags & HA_SPATIAL ? HA_KEY_ALG_RTREE : HA_KEY_ALG_BTREE) : pos->algorithm; @@ -453,7 +504,6 @@ int check_definition(MI_KEYDEF *t1_keyin DBUG_RETURN(0); } - extern "C" { volatile int *killed_ptr(MI_CHECK *param) @@ -525,9 +575,12 @@ const char **ha_myisam::bas_ext() const const char *ha_myisam::index_type(uint key_number) { - return ((table->key_info[key_number].flags & HA_FULLTEXT) ? - "FULLTEXT" : - (table->key_info[key_number].flags & HA_SPATIAL) ? + if (table->key_info[key_number].flags & HA_FULLTEXT) + { + return "FULLTEXT"; + } + else + return ((table->key_info[key_number].flags & HA_SPATIAL) ? "SPATIAL" : (table->key_info[key_number].algorithm == HA_KEY_ALG_RTREE) ? "RTREE" : @@ -1663,6 +1716,28 @@ int ha_myisam::info(uint flag) delete_length= misam_info.delete_length; check_time= misam_info.check_time; mean_rec_length= misam_info.mean_reclength; +#ifdef ENABLE_SENNA + if (flag & HA_STATUS_SENNA) { + int i; + for (i = 0; i < table->s->keys; i++) { + KEY *key = &table->key_info[i]; + MI_KEYDEF *mi_keydef = &file->s->keyinfo[i]; + sen_index *senna = mi_keydef->senna; + if (senna) { + key->senna_flags = mi_keydef->senna_flags; + key->senna_initial_n_segments = mi_keydef->senna_initial_n_segments; + key->senna_keys_size = mi_keydef->senna_keys_size; + key->senna_keys_file_size = mi_keydef->senna_keys_file_size; + key->senna_lexicon_size = mi_keydef->senna_lexicon_size; + key->senna_lexicon_file_size = mi_keydef->senna_lexicon_file_size; + key->senna_inv_seg_size = mi_keydef->senna_inv_seg_size; + key->senna_inv_chunk_size = mi_keydef->senna_inv_chunk_size; + + key->senna_encoding = senna_enc_mysql(mi_keydef->senna_encoding); + } + } + } +#endif /* ENABLE_SENNA */ } if (flag & HA_STATUS_CONST) { @@ -1787,8 +1862,36 @@ int ha_myisam::create(const char *name, TABLE_SHARE *share= table->s; uint options= share->db_options_in_use; DBUG_ENTER("ha_myisam::create"); +#ifdef ENABLE_SENNA + if ((ha_create_info->query_type == SENNA_CREATE_TABLE)) + { + int i; + for (i=0; i < share->keys; i++) + { + if ((ha_create_info->key_info[i].flags & HA_FULLTEXT)) + { + table_arg->key_info[i].senna_flags = ha_create_info->key_info[i].senna_flags; + table_arg->key_info[i].senna_initial_n_segments = ha_create_info->key_info[i].senna_initial_n_segments; + table_arg->key_info[i].senna_encoding = ha_create_info->key_info[i].senna_encoding; + } + } + } + else if ((ha_create_info->query_type == SENNA_TRUNCATE_TABLE) && file) /* file check for restore table */ + { + table_arg->file->open(name,0,0); + table_arg->file->info(HA_STATUS_VARIABLE | HA_STATUS_SENNA); + } + else if ((ha_create_info->query_type == SENNA_CREATE_TABLE_LIKE)) + { + SEN_LOG(sen_log_warning, "ha_myisam::create: create table %s like ... may lost senna extention", name); + } +#endif /* ENABLE_SENNA */ if ((error= table2myisam(table_arg, &keydef, &recinfo, &records))) DBUG_RETURN(error); /* purecov: inspected */ +#ifdef ENABLE_SENNA + if ((ha_create_info->query_type == SENNA_TRUNCATE_TABLE) && file) + table_arg->file->close(); +#endif bzero((char*) &create_info, sizeof(create_info)); create_info.max_rows= share->max_rows; create_info.reloc_rows= share->min_rows; @@ -1921,4 +2024,3 @@ uint ha_myisam::checksum() const { return (uint)file->state->checksum; } - --- orig/sql/handler.h 2007-07-04 22:06:25.000000000 +0900 +++ new/sql/handler.h 2007-10-29 10:14:21.000000000 +0900 @@ -449,6 +449,10 @@ typedef struct st_ha_create_information bool table_existed; /* 1 in create if table existed */ bool frm_only; /* 1 if no ha_create_table() */ bool varchar; /* 1 if table has a VARCHAR */ +#ifdef ENABLE_SENNA + KEY *key_info; + int query_type; +#endif /* ENABLE_SENNA */ } HA_CREATE_INFO; --- orig/sql/item.h 2007-07-04 22:06:41.000000000 +0900 +++ new/sql/item.h 2007-10-29 10:14:21.000000000 +0900 @@ -701,7 +701,9 @@ public: Any new item which can be NULL must implement this method. */ virtual bool is_null() { return 0; } - +#ifdef ENABLE_SENNA + virtual bool needs_record() { return true; } +#endif /* ENABLE_SENNA */ /* Make sure the null_value member has a correct value. */ --- orig/sql/item_cmpfunc.cc 2007-07-04 22:06:40.000000000 +0900 +++ new/sql/item_cmpfunc.cc 2007-10-29 10:14:21.000000000 +0900 @@ -3162,6 +3162,22 @@ bool Item_func_in::nulls_in_row() return 0; } +#ifdef ENABLE_SENNA +bool +Item_cond::needs_record() +{ + List_iterator_fast li(list); + Item *item; + while ((item=li++)) + { + if (item->needs_record()) + { + return true; + } + } + return false; +} +#endif /* ENABLE_SENNA */ /* Perform context analysis of an IN item tree --- orig/sql/item_cmpfunc.h 2007-07-04 22:06:49.000000000 +0900 +++ new/sql/item_cmpfunc.h 2007-10-29 10:14:21.000000000 +0900 @@ -1362,6 +1362,9 @@ public: void add_at_head(List *nlist) { list.prepand(nlist); } bool fix_fields(THD *, Item **ref); +#ifdef ENABLE_SENNA + bool needs_record(); +#endif /* ENABLE_SENNA */ enum Type type() const { return COND_ITEM; } List* argument_list() { return &list; } table_map used_tables() const; --- orig/sql/item_func.cc 2007-07-04 22:06:50.000000000 +0900 +++ new/sql/item_func.cc 2007-10-29 10:14:21.000000000 +0900 @@ -4969,7 +4969,11 @@ bool Item_func_match::fix_index() for (keynr=0 ; keynr < table->s->keys ; keynr++) { if ((table->key_info[keynr].flags & HA_FULLTEXT) && - (table->s->keys_in_use.is_set(keynr))) + ((table->keys_in_use_for_query.is_set(keynr)) +#ifdef ENABLE_SENNA + || my_thread_var->sen_flags +#endif /* ENABLE_SENNA */ + )) { ft_to_key[fts]=keynr; ft_cnt[fts]=0; --- orig/sql/item_func.h 2007-07-04 22:06:25.000000000 +0900 +++ new/sql/item_func.h 2007-10-29 10:14:21.000000000 +0900 @@ -1372,6 +1372,9 @@ public: table_map not_null_tables() const { return 0; } bool fix_fields(THD *thd, Item **ref); bool eq(const Item *, bool binary_cmp) const; +#ifdef ENABLE_SENNA + bool needs_record() { return false; } +#endif /* ENABLE_SENNA */ /* The following should be safe, even if we compare doubles */ longlong val_int() { DBUG_ASSERT(fixed == 1); return val_real() != 0.0; } double val_real(); --- orig/sql/item_strfunc.cc 2007-07-04 22:06:26.000000000 +0900 +++ new/sql/item_strfunc.cc 2007-10-29 10:14:21.000000000 +0900 @@ -34,6 +34,9 @@ C_MODE_START #include "../mysys/my_static.h" // For soundex_map C_MODE_END +#ifdef ENABLE_SENNA +#include +#endif /* ENABLE_SENNA */ String my_empty_string("",default_charset_info); @@ -3374,3 +3377,216 @@ String *Item_func_uuid::val_str(String * strmov(s+18, clock_seq_and_node_str); return str; } + +#ifdef ENABLE_SENNA +static sen_encoding senna_enc_type(const char *csname) +{ + if (!my_strcasecmp(system_charset_info, csname, "latin1")) + return sen_enc_latin1; + else if (!my_strcasecmp(system_charset_info, csname, "utf8")) + return sen_enc_utf8; + else if (!my_strcasecmp(system_charset_info, csname, "cp932")) + return sen_enc_sjis; + else if (!my_strcasecmp(system_charset_info, csname, "sjis")) + return sen_enc_sjis; + else if (!my_strcasecmp(system_charset_info, csname, "eucjpms")) + return sen_enc_euc_jp; + else if (!my_strcasecmp(system_charset_info, csname, "ujis")) + return sen_enc_euc_jp; + else if (!my_strcasecmp(system_charset_info, csname, "koi8r")) + return sen_enc_koi8r; + else + return sen_enc_default; +} + + +String *Item_func_senna_kwic::val_str(String *str) +{ + String *target, target_tmp; + int max_snip_len; + int max_snips; + int html_encoding; + String *start, start_tmp; + String *end, end_tmp; + String *keyword, keyword_tmp; + String *open_tag, open_tmp; + String *close_tag, close_tmp; + + sen_snip *snip; + sen_encoding encoding; + sen_rc rc; + uint nresults; + uint max_tagged_len; + sen_snip_mapping *mapping; + + char *result; + uint result_len; + int i; + + if (str == NULL) { + SEN_LOG(sen_log_warning, "Item_func_senna_snipet::val_str(null) is called"); + goto err_null; + } + + if (arg_count < 9 || arg_count % 3 != 0) { + SEN_LOG(sen_log_warning, "Incorrect number of arguments for kwic: %d", arg_count); + return &my_empty_string; + } + + for (i = 0; i < arg_count; i++) { + if (args[i]->null_value) { + SEN_LOG(sen_log_warning, "kwic argument #%d is null", i+1); + goto err_null; + } + } + + target = args[0]->str_result(&target_tmp); + max_snip_len = args[1]->val_int(); + max_snips = args[2]->val_int(); + html_encoding = args[3]->val_int(); + start = args[4]->str_result(&start_tmp); + end = args[5]->str_result(&end_tmp); + + if (max_snip_len <= 0) { + SEN_LOG(sen_log_warning, "kwic argument #2 must be positive value, passed %d", max_snip_len); + return &my_empty_string; + } + + if (max_snips <= 0) { + SEN_LOG(sen_log_warning, "kwic argument #3 must be positive value, passed %d", max_snips); + return &my_empty_string; + } + + if (target == NULL) return &my_empty_string; + encoding = senna_enc_senna(target->charset()->csname); + if (html_encoding == 1) { + mapping = (sen_snip_mapping *) -1; + } else { + mapping = NULL; + } + + SEN_LOG(sen_log_debug, "Item_func_senna_kwic::val_str => sen_snip_open: " \ + "%d, SEN_SNIP_NORMALIZE, %d, %d, \"\", 0, \"\", 0, %p", + encoding, max_snip_len, max_snips, mapping); + if (!(snip = sen_snip_open(encoding, SEN_SNIP_NORMALIZE, + max_snip_len, max_snips, "", 0, + "", 0, mapping))) { + SEN_LOG(sen_log_error, "sen_snip_open failed: snip = %p", snip); + return &my_empty_string; + } + + for (i = 6; i < arg_count; i+=3) { + keyword = args[i]->str_result(&keyword_tmp); + open_tag = args[i+1]->str_result(&open_tmp); + close_tag = args[i+2]->str_result(&close_tmp); + + SEN_LOG(sen_log_debug, "Item_func_senna_kwic::val_str => sen_snip_add_cond: " \ + "%p, %p, %d, %p, %d, %p, %d", snip, keyword->ptr(), keyword->length(), + open_tag->ptr(), open_tag->length(), close_tag->ptr(), close_tag->length()); + if ((rc = sen_snip_add_cond(snip, keyword->ptr(), keyword->length(), + open_tag->ptr(), open_tag->length(), + close_tag->ptr(), close_tag->length()))) { + SEN_LOG(sen_log_error, "sen_snip_add_cond failed: sen_rc= %d", rc); + SEN_LOG(sen_log_debug, "Item_func_senna_kwic::val_str => sen_snip_close: " \ + "snip = %p", snip); + if ((rc = sen_snip_close(snip))) { + SEN_LOG(sen_log_error, "sen_snip_close failed: sen_rc = %d", rc); + } + return &my_empty_string; + } + } + + SEN_LOG(sen_log_debug, "Item_func_senna_kwic::val_str => sen_snip_exec: " \ + "%p, %p, %d, %p, %p", snip, target->ptr(), target->length(), + &nresults, &max_tagged_len); + if ((rc = sen_snip_exec(snip, target->ptr(), target->length(), + &nresults, &max_tagged_len))) { + SEN_LOG(sen_log_error, "sen_snip_exec failed: sen_rc= %d", rc); + SEN_LOG(sen_log_debug, "Item_func_senna_kwic::val_str => sen_snip_close: " \ + "snip = %p", snip); + if ((rc = sen_snip_close(snip))) { + SEN_LOG(sen_log_error, "sen_snip_close failed: sen_rc = %d", rc); + } + return &my_empty_string; + } + + + if (!(result = sql_alloc(max_tagged_len))) { + SEN_LOG(sen_log_error, "sql_alloc failed", rc); + SEN_LOG(sen_log_debug, "Item_func_senna_kwic::val_str => sen_snip_close: " \ + "snip = %p\n", snip); + if ((rc = sen_snip_close(snip))) { + SEN_LOG(sen_log_error, "sen_snip_close failed: sen_rc = %d\n", rc); + } + return &my_empty_string; + } + + str->copy("", 0, target->charset()); + + for (i = 0; i < nresults; i++) { + SEN_LOG(sen_log_debug, "Item_func_senna_kwic::val_str => sen_snip_get_result: " \ + "%p, 0, %p, %p", snip, result, &result_len); + if ((rc = sen_snip_get_result(snip, i, result, &result_len))) { + SEN_LOG(sen_log_error, "sen_snip_get_result failed: sen_rc= %d", rc); + SEN_LOG(sen_log_debug, "Item_func_senna_kwic::val_str => sen_snip_close: " \ + "snip = %p", snip); + if ((rc = sen_snip_close(snip))) { + SEN_LOG(sen_log_error, "sen_snip_close failed: sen_rc = %d", rc); + } + return &my_empty_string; + } + + if (result_len <= 0) { + SEN_LOG(sen_log_error, "result_len is not positive value: %d", result_len); + SEN_LOG(sen_log_debug, "Item_func_senna_kwic::val_str => sen_snip_close: " \ + "snip = %p", snip); + if ((rc = sen_snip_close(snip))) { + SEN_LOG(sen_log_error, "sen_snip_close failed: sen_rc = %d", rc); + } + return &my_empty_string; + } + + str->append(start->ptr(), start->length(), target->charset()); + str->append(result, result_len, target->charset()); + str->append(end->ptr(), end->length(), target->charset()); + } + + SEN_LOG(sen_log_debug, "Item_func_senna_kwic::val_str => sen_snip_close: " \ + "snip = %p", snip); + if ((rc = sen_snip_close(snip))) { + SEN_LOG(sen_log_error, "sen_snip_close failed: sen_rc = %d", rc); + } + + return str; + +err_null: + null_value= 1; + return 0; +} + + +void Item_func_senna_kwic::fix_length_and_dec() +{ + ulonglong max_result_length= 0; + + if (agg_arg_charsets(collation, args, arg_count, MY_COLL_ALLOW_CONV, 1)) + return; + + for (uint i=0 ; i < arg_count ; i++) + { + if (args[i]->collation.collation->mbmaxlen != collation.collation->mbmaxlen) + max_result_length+= (args[i]->max_length / + args[i]->collation.collation->mbmaxlen) * + collation.collation->mbmaxlen; + else + max_result_length+= args[i]->max_length; + } + + if (max_result_length >= MAX_BLOB_WIDTH) + { + max_result_length= MAX_BLOB_WIDTH; + maybe_null= 1; + } + max_length= (ulong) max_result_length; +} +#endif /* ENABLE_SENNA */ --- orig/sql/item_strfunc.h 2007-07-04 22:06:05.000000000 +0900 +++ new/sql/item_strfunc.h 2007-10-29 10:14:21.000000000 +0900 @@ -850,3 +850,14 @@ public: String *val_str(String *); }; +#ifdef ENABLE_SENNA +class Item_func_senna_kwic :public Item_str_func +{ + public: + Item_func_senna_kwic(List &list) :Item_str_func(list) {} + Item_func_senna_kwic(Item *a,Item *b) :Item_str_func(a,b) {} + String *val_str(String *); + void fix_length_and_dec(); + const char *func_name() const { return "kwic"; } +}; +#endif /* ENABLE SENNA */ --- orig/sql/item_sum.cc 2007-07-04 22:06:49.000000000 +0900 +++ new/sql/item_sum.cc 2007-10-29 10:14:21.000000000 +0900 @@ -2451,6 +2451,9 @@ bool Item_sum_count_distinct::setup(THD return TRUE; /* Create a table with an unique key over all parameters */ +#ifdef ENABLE_SENNA + my_thread_var->sen_flags |= SENNA_DISTINCT; +#endif /* ENABLE_SENNA */ for (uint i=0; i < arg_count ; i++) { Item *item=args[i]; --- orig/sql/lex.h 2007-07-04 22:06:41.000000000 +0900 +++ new/sql/lex.h 2007-10-29 10:14:21.000000000 +0900 @@ -157,6 +157,7 @@ static SYMBOL symbols[] = { { "DELAYED", SYM(DELAYED_SYM)}, { "DELAY_KEY_WRITE", SYM(DELAY_KEY_WRITE_SYM)}, { "DELETE", SYM(DELETE_SYM)}, + { "DELIMITED", SYM(SENNA_DELIMITED_SYM)}, { "DESC", SYM(DESC)}, { "DESCRIBE", SYM(DESCRIBE)}, { "DES_KEY_FILE", SYM(DES_KEY_FILE)}, @@ -311,6 +312,7 @@ static SYMBOL symbols[] = { { "MAX_ROWS", SYM(MAX_ROWS)}, { "MAX_UPDATES_PER_HOUR", SYM(MAX_UPDATES_PER_HOUR)}, { "MAX_USER_CONNECTIONS", SYM(MAX_USER_CONNECTIONS_SYM)}, + { "MECAB", SYM(SENNA_MECAB_SYM)}, { "MEDIUM", SYM(MEDIUM_SYM)}, { "MEDIUMBLOB", SYM(MEDIUMBLOB)}, { "MEDIUMINT", SYM(MEDIUMINT)}, @@ -342,8 +344,10 @@ static SYMBOL symbols[] = { { "NCHAR", SYM(NCHAR_SYM)}, { "NEW", SYM(NEW_SYM)}, { "NEXT", SYM(NEXT_SYM)}, + { "NGRAM", SYM(SENNA_NGRAM_SYM)}, { "NO", SYM(NO_SYM)}, { "NONE", SYM(NONE_SYM)}, + { "NORMALIZE", SYM(SENNA_NORMALIZE_SYM)}, { "NOT", SYM(NOT_SYM)}, { "NO_WRITE_TO_BINLOG", SYM(NO_WRITE_TO_BINLOG)}, { "NULL", SYM(NULL_SYM)}, @@ -428,8 +432,10 @@ static SYMBOL symbols[] = { { "SCHEMAS", SYM(DATABASES)}, { "SECOND", SYM(SECOND_SYM)}, { "SECOND_MICROSECOND", SYM(SECOND_MICROSECOND_SYM)}, + { "SECTIONALIZE", SYM(SENNA_SECTIONALIZE_SYM)}, { "SECURITY", SYM(SECURITY_SYM)}, { "SELECT", SYM(SELECT_SYM)}, + { "SENNA", SYM(SENNA_SYM)}, { "SENSITIVE", SYM(SENSITIVE_SYM)}, { "SEPARATOR", SYM(SEPARATOR_SYM)}, { "SERIAL", SYM(SERIAL_SYM)}, @@ -450,6 +456,9 @@ static SYMBOL symbols[] = { { "SOURCE", SYM(SOURCE_SYM)}, { "SPATIAL", SYM(SPATIAL_SYM)}, { "SPECIFIC", SYM(SPECIFIC_SYM)}, + { "SPLIT_ALPHA", SYM(SENNA_SPLIT_ALPHA_SYM)}, + { "SPLIT_DIGIT", SYM(SENNA_SPLIT_DIGIT_SYM)}, + { "SPLIT_SYMBOL", SYM(SENNA_SPLIT_SYMBOL_SYM)}, { "SQL", SYM(SQL_SYM)}, { "SQLEXCEPTION", SYM(SQLEXCEPTION_SYM)}, { "SQLSTATE", SYM(SQLSTATE_SYM)}, @@ -656,6 +665,9 @@ static SYMBOL sql_functions[] = { { "ISNULL", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_isnull)}, { "IS_FREE_LOCK", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_is_free_lock)}, { "IS_USED_LOCK", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_is_used_lock)}, +#ifdef ENABLE_SENNA + { "KWIC", SYM(SENNA_KWIC_SYM)}, +#endif /* ENABLE_SENNA */ { "LAST_INSERT_ID", SYM(LAST_INSERT_ID)}, { "ISSIMPLE", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_issimple)}, { "LAST_DAY", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_last_day)}, --- orig/sql/mysql_priv.h 2007-07-04 22:06:41.000000000 +0900 +++ new/sql/mysql_priv.h 2007-10-29 10:14:21.000000000 +0900 @@ -947,6 +947,11 @@ void calc_sum_of_all_status(STATUS_VAR * void append_definer(THD *thd, String *buffer, const LEX_STRING *definer_user, const LEX_STRING *definer_host); +#ifdef ENABLE_SENNA +bool senna_show_status(THD *thd, LEX *lex); +char *senna_enc_mysql(sen_encoding encoding); +sen_encoding senna_enc_senna(const char *csname); +#endif /* information schema */ extern LEX_STRING INFORMATION_SCHEMA_NAME; @@ -1437,6 +1442,13 @@ extern SHOW_COMP_OPTION have_geometry, h extern SHOW_COMP_OPTION have_crypt; extern SHOW_COMP_OPTION have_compress; +#ifdef ENABLE_SENNA +extern my_bool opt_senna_log; +extern uint senna_log_level_options; +extern uint senna_index_type_options; +extern int senna_default_flags; +#endif + #ifndef __WIN__ extern pthread_t signal_thread; #endif --- orig/sql/mysqld.cc 2007-07-04 22:06:03.000000000 +0900 +++ new/sql/mysqld.cc 2007-10-29 10:14:21.000000000 +0900 @@ -337,6 +337,12 @@ static pthread_cond_t COND_thread_cache, static my_bool opt_sync_bdb_logs; #endif +#ifdef ENABLE_SENNA +static char *opt_senna_logname; +static char *opt_senna_log_level; +static char *opt_senna_index_type; +#endif + /* Global variables */ bool opt_log, opt_update_log, opt_bin_log, opt_slow_log; @@ -512,6 +518,14 @@ SHOW_COMP_OPTION have_raid, have_ssl, ha SHOW_COMP_OPTION have_geometry, have_rtree_keys, have_dlopen; SHOW_COMP_OPTION have_crypt, have_compress; +#ifdef ENABLE_SENNA +my_bool opt_senna_log; +char* senna_logname; +uint senna_log_level_options; +uint senna_index_type_options; +int senna_default_flags; +#endif + /* Thread specific variables */ pthread_key(MEM_ROOT**,THR_MALLOC); @@ -996,9 +1010,16 @@ static void __cdecl kill_server(int sig_ if (sig != 0) // 0 is not a valid signal number my_sigset(sig, SIG_IGN); /* purify inspected */ if (sig == MYSQL_KILL_SIGNAL || sig == 0) + { sql_print_information(ER(ER_NORMAL_SHUTDOWN),my_progname); +#ifdef ENABLE_SENNA /* nkjm added below for SFID:10293 2007/04/26. */ + SEN_LOG(sen_log_notice, "kill_server: mysqld is shutting down..."); +#endif /* nkjm added above. */ + } else + { sql_print_error(ER(ER_GOT_SIGNAL),my_progname,sig); /* purecov: inspected */ + } #if defined(HAVE_SMEM) && defined(__WIN__) /* @@ -1192,7 +1213,13 @@ void clean_up(bool print_message) #endif if (print_message && errmesg) + { sql_print_information(ER(ER_SHUTDOWN_COMPLETE),my_progname); +#ifdef ENABLE_SENNA /* nkjm added below for SFID:10293 2007/04/26. */ + SEN_LOG(sen_log_notice, "clean_up: mysqld shutdown complete."); +#endif /* nkjm added above. */ + } + #if !defined(EMBEDDED_LIBRARY) if (!opt_bootstrap) (void) my_delete(pidfile_name,MYF(0)); // This may not always exist @@ -1710,6 +1737,14 @@ void end_thread(THD *thd, bool put_in_ca thd->mysys_var->abort= 0; thd->thr_create_time= time(NULL); threads.append(thd); + +#if !defined(__WIN__) && !defined(OS2) && defined ENABLE_SENNA /* nkjm SFID:10294 */ + struct st_my_thread_var *sen_tmp; + extern pthread_key_t THR_KEY_mysys; + sen_tmp= (struct st_my_thread_var *)pthread_getspecific(THR_KEY_mysys); + sen_tmp->sen_connection_id= thd->thread_id; +#endif /* nkjm SFID:10294 */ + pthread_mutex_unlock(&LOCK_thread_count); DBUG_VOID_RETURN; } @@ -3538,6 +3573,29 @@ int main(int argc, char **argv) (void) thr_setconcurrency(concurrency); // 10 by default +#ifdef ENABLE_SENNA + sen_init(); + if (opt_senna_log) + { + if (!opt_senna_logname) opt_senna_logname = "senna.log"; + int senna_logname_len = strlen(mysql_data_home) + strlen(opt_senna_logname) + 1; + senna_logname = my_malloc(senna_logname_len, MYF(MY_WME)); + my_snprintf(senna_logname, senna_logname_len, "%s%s", mysql_data_home, opt_senna_logname); + senna_logger.max_level = (sen_log_level) senna_log_level_options; + sen_logger_info_set(&senna_logger); + } +#ifdef MECAB_STATIC + const char *mecabrc = getenv("MECABRC"); + if (!mecabrc) { + char *mecabrc_rpath = "etc/mecabrc"; + int mecabrc_len = strlen(mysql_home) + strlen(mecabrc_rpath) + 1; + char *mecabrc_path = my_malloc(mecabrc_len, MYF(MY_WME)); + my_snprintf(mecabrc_path, mecabrc_len, "%s%s", mysql_home, mecabrc_rpath); + setenv("MECABRC", mecabrc_path, 1); + } +#endif /* MECAB_STATIC */ +#endif /* ENABLE_SENNA */ + select_thread=pthread_self(); select_thread_in_use=1; init_ssl(); @@ -3683,6 +3741,10 @@ we force server id to 2, but this MySQL mysqld_port, MYSQL_COMPILATION_COMMENT); +#ifdef ENABLE_SENNA /* nkjm added below for SFID:10293 2007/04/26 */ + SEN_LOG(sen_log_notice, "main: mysqld started."); +#endif /* nkjm added above. */ + #if defined(__NT__) || defined(HAVE_SMEM) handle_connections_methods(); #else @@ -4818,6 +4880,12 @@ enum options_mysqld OPT_TABLE_LOCK_WAIT_TIMEOUT, OPT_PORT_OPEN_TIMEOUT, OPT_MERGE, +#ifdef ENABLE_SENNA + OPT_SENNA_LOG, + OPT_SENNA_LOG_LEVEL, + OPT_SENNA_2IND, + OPT_SENNA_INDEX_TYPE, +#endif OPT_PROFILING, OPT_INNODB_ROLLBACK_ON_TIMEOUT, OPT_SECURE_FILE_PRIV @@ -5481,6 +5549,21 @@ Can't be set to 1 if --log-slave-updates {"secure-auth", OPT_SECURE_AUTH, "Disallow authentication for accounts that have old (pre-4.1) passwords.", (gptr*) &opt_secure_auth, (gptr*) &opt_secure_auth, 0, GET_BOOL, NO_ARG, my_bool(0), 0, 0, 0, 0, 0}, +#ifdef ENABLE_SENNA + {"senna-2ind", OPT_SENNA_2IND, "Enable Senna 2ind-patch.", + (gptr*) &global_system_variables.senna_2ind, + (gptr*) &global_system_variables.senna_2ind, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"senna-index-type", OPT_SENNA_INDEX_TYPE, "Senna default index type. A value can be NGRAM or MECAB. Default value is NGRAM.", + (gptr*) &opt_senna_index_type, (gptr*) &opt_senna_index_type, 0, GET_STR, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + {"senna-log", OPT_SENNA_LOG, "Senna log file.", + (gptr*) &opt_senna_logname, (gptr*) &opt_senna_logname, 0, GET_STR, OPT_ARG, + 0, 0, 0, 0, 0, 0}, + {"senna-log-level", OPT_SENNA_LOG_LEVEL, "Senna log level.", + (gptr*) &opt_senna_log_level, (gptr*) &opt_senna_log_level, 0, GET_STR, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, +#endif {"secure-file-priv", OPT_SECURE_FILE_PRIV, "Limit LOAD DATA, SELECT ... OUTFILE, and LOAD_FILE() to files within specified directory", (gptr*) &opt_secure_file_priv, (gptr*) &opt_secure_file_priv, 0, @@ -6296,6 +6379,9 @@ struct show_var_st status_vars[]= { {"Com_show_open_tables", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_OPEN_TABLES]), SHOW_LONG_STATUS}, {"Com_show_privileges", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_PRIVILEGES]), SHOW_LONG_STATUS}, {"Com_show_processlist", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_PROCESSLIST]), SHOW_LONG_STATUS}, +#ifdef ENABLE_SENNA + {"Com_show_senna_status", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_SENNA_STATUS]), SHOW_LONG_STATUS}, +#endif {"Com_show_slave_hosts", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_SLAVE_HOSTS]), SHOW_LONG_STATUS}, {"Com_show_slave_status", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_SLAVE_STAT]), SHOW_LONG_STATUS}, {"Com_show_status", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_STATUS]), SHOW_LONG_STATUS}, @@ -6384,6 +6470,9 @@ struct show_var_st status_vars[]= { {"Select_range", (char*) offsetof(STATUS_VAR, select_range_count), SHOW_LONG_STATUS}, {"Select_range_check", (char*) offsetof(STATUS_VAR, select_range_check_count), SHOW_LONG_STATUS}, {"Select_scan", (char*) offsetof(STATUS_VAR, select_scan_count), SHOW_LONG_STATUS}, +#ifdef ENABLE_SENNA + {"Senna_2ind_count", (char*) offsetof(STATUS_VAR, senna_2ind_count), SHOW_LONG_STATUS}, +#endif {"Slave_open_temp_tables", (char*) &slave_open_temp_tables, SHOW_LONG}, {"Slave_retried_transactions",(char*) 0, SHOW_SLAVE_RETRIED_TRANS}, {"Slave_running", (char*) 0, SHOW_SLAVE_RUNNING}, @@ -6736,6 +6825,14 @@ static void mysql_init_variables(void) opt_specialflag |= SPECIAL_NO_PRIOR; #endif +#ifdef ENABLE_SENNA + senna_index_type_options = 0; + senna_default_flags = (SEN_INDEX_NORMALIZE | SEN_INDEX_NGRAM); + opt_senna_log = 0; + senna_log_level_options = senna_logger.max_level; + global_system_variables.senna_2ind = 0; +#endif + #if defined(__WIN__) || defined(__NETWARE__) /* Allow Win32 and NetWare users to move MySQL anywhere */ { @@ -7330,6 +7427,44 @@ get_one_option(int optid, const struct m lower_case_table_names= argument ? atoi(argument) : 1; lower_case_table_names_used= 1; break; +#ifdef ENABLE_SENNA + case OPT_SENNA_INDEX_TYPE: + int type; + if ((type=find_type(argument, &senna_index_type_typelib, 2)) <= 0) + { + fprintf(stderr, "Unkown senna_index_type type: %s\n",argument); + exit(1); + } + senna_index_type_options= (uint) type-1; + if (senna_index_type_options == 1) { + senna_default_flags = (SEN_INDEX_NORMALIZE); + } else { + senna_default_flags = (SEN_INDEX_NORMALIZE | SEN_INDEX_NGRAM); + } + break; + case OPT_SENNA_LOG: + opt_senna_log = 1; + break; + case OPT_SENNA_LOG_LEVEL: + if (argument == disabled_my_option) + senna_log_level_options= (uint) sen_log_none; + else if (! argument) + senna_log_level_options= (uint) sen_log_none; + else + { + int type; + if ((type=find_type(argument, &senna_log_level_typelib, 2)) <= 0) + { + fprintf(stderr,"Unknown senna_log_level type: %s\n",argument); + exit(1); + } + senna_log_level_options= (uint) type-1; + } + break; + case OPT_SENNA_2IND: + global_system_variables.senna_2ind = 1; + break; +#endif } return 0; } @@ -7790,3 +7925,45 @@ template class I_List; template class I_List; template class I_List_iterator; #endif + +#ifdef ENABLE_SENNA +void senna_logger_func(int level, const char *time, const char *title, + const char *msg, const char *location, void *func_arg) +{ + static FILE *fp = NULL; + const char slev[] = " EACewnid-"; + if (!fp) + { + fp = fopen(senna_logname, "a"); + } + +/* nkjm SFID:10294 */ +#if !defined(__WIN__) && !defined(OS2) + struct st_my_thread_var *sen_tmp; + extern pthread_key_t THR_KEY_mysys; + sen_tmp= (struct st_my_thread_var *)pthread_getspecific(THR_KEY_mysys); + if (fp) + { + if (sen_tmp) + { + fprintf(fp, "%s|%c|%u|%s %s %s\n", time, *(slev + level), sen_tmp->sen_connection_id, title, msg, location); + fflush(fp); + } + } +#else + if (fp) + { + fprintf(fp, "%s|%c|%u|%s %s %s\n", time, *(slev + level), (uint)pthread_self(), title, msg, location); + fflush(fp); + } +#endif +/* nkjm SFID:10294 */ +} + +sen_logger_info senna_logger = { + sen_log_notice, + SEN_LOG_TIME|SEN_LOG_MESSAGE, + senna_logger_func, + NULL +}; +#endif /* ENABLE_SENNA */ --- orig/sql/records.cc 2007-07-04 22:06:26.000000000 +0900 +++ new/sql/records.cc 2007-10-29 10:14:21.000000000 +0900 @@ -156,6 +156,9 @@ void init_read_record(READ_RECORD *info, table->sort.found_records*info->ref_length; info->read_record= (table->sort.addon_field ? rr_unpack_from_buffer : rr_from_pointers); +#ifdef ENABLE_SENNA + my_thread_var->sen_flags |= SENNA_DO_READ_RECORD; +#endif /* ENABLE_SENNA */ } else { @@ -320,6 +323,15 @@ static int rr_from_tempfile(READ_RECORD { if (my_b_read(info->io_cache,info->ref_pos,info->ref_length)) return -1; /* End of file */ +#ifdef ENABLE_SENNA + if ((my_thread_var->sen_flags & SENNA_USE_2IND) && + (my_thread_var->sen_flags & + (SENNA_MATCH | SENNA_DO_READ_RECORD | SENNA_IF_READ_RECORD)) + == (SENNA_MATCH | SENNA_DO_READ_RECORD)) { + SEN_LOG(sen_log_debug, "rr_from_tempfile: 2ind return 0"); + return 0; + } +#endif /* ENABLE_SENNA */ if (!(tmp=info->file->rnd_pos(info->record,info->ref_pos))) break; /* The following is extremely unlikely to happen */ @@ -373,6 +385,15 @@ static int rr_from_pointers(READ_RECORD cache_pos= info->cache_pos; info->cache_pos+= info->ref_length; +#ifdef ENABLE_SENNA + if ((my_thread_var->sen_flags & SENNA_USE_2IND) && + (my_thread_var->sen_flags & + (SENNA_MATCH | SENNA_DO_READ_RECORD | SENNA_IF_READ_RECORD)) + == (SENNA_MATCH | SENNA_DO_READ_RECORD)) { + SEN_LOG(sen_log_debug, "rr_from_pointers: 2ind return 0"); + return 0; + } +#endif /* ENABLE_SENNA */ if (!(tmp=info->file->rnd_pos(info->record,cache_pos))) break; --- orig/sql/set_var.cc 2007-07-04 22:06:26.000000000 +0900 +++ new/sql/set_var.cc 2007-10-29 10:14:21.000000000 +0900 @@ -82,6 +82,25 @@ TYPELIB delay_key_write_typelib= delay_key_write_type_names, NULL }; +#ifdef ENABLE_SENNA +const char *senna_log_level_type_names[] = { "NONE", "EMERG", "ALERT", + "CRIT", "ERROR", "WARNING", + "NOTICE", "INFO", "DEBUG", + "DUMP", NullS }; +TYPELIB senna_log_level_typelib= +{ + array_elements(senna_log_level_type_names)-1, "", + senna_log_level_type_names, NULL +}; + +const char *senna_index_type_type_names[] = { "NGRAM", "MECAB", NullS}; +TYPELIB senna_index_type_typelib= +{ + array_elements(senna_index_type_type_names)-1, "", + senna_index_type_type_names, NULL +}; +#endif + static int sys_check_ftb_syntax(THD *thd, set_var *var); static bool sys_update_ftb_syntax(THD *thd, set_var * var); static void sys_default_ftb_syntax(THD *thd, enum_var_type type); @@ -457,6 +476,15 @@ sys_var_long_ptr sys_innodb_flush_log_a &srv_flush_log_at_trx_commit); #endif +#ifdef ENABLE_SENNA +sys_var_enum sys_senna_index_type("senna_index_type",&senna_index_type_options, + &senna_index_type_typelib, fix_senna_index_type); +sys_var_bool_ptr sys_senna_log("senna_log", &opt_senna_log); +sys_var_enum sys_senna_log_level("senna_log_level",&senna_log_level_options, + &senna_log_level_typelib, fix_senna_log_level); +sys_var_thd_bool sys_senna_2ind("senna_2ind", &SV::senna_2ind, fix_senna_2ind); +#endif + /* Condition pushdown to storage engine */ sys_var_thd_bool sys_engine_condition_pushdown("engine_condition_pushdown", @@ -737,6 +765,11 @@ sys_var *sys_variables[]= &sys_secure_auth, &sys_secure_file_priv, &sys_select_limit, +#ifdef ENABLE_SENNA + &sys_senna_2ind, + &sys_senna_index_type, + &sys_senna_log_level, +#endif &sys_server_id, #ifdef HAVE_REPLICATION &sys_slave_compressed_protocol, @@ -1054,6 +1087,12 @@ struct show_var_st init_vars[]= { {sys_rpl_recovery_rank.name,(char*) &sys_rpl_recovery_rank, SHOW_SYS}, {"secure_auth", (char*) &sys_secure_auth, SHOW_SYS}, {"secure_file_priv", (char*) &sys_secure_file_priv, SHOW_SYS}, +#ifdef ENABLE_SENNA + {"senna_2ind", (char*) &sys_senna_2ind, SHOW_SYS}, + {"senna_index_type", (char*) &sys_senna_index_type, SHOW_SYS}, + {"senna_log", (char*) &opt_senna_log, SHOW_MY_BOOL}, + {"senna_log_level", (char*) &sys_senna_log_level, SHOW_SYS}, +#endif #ifdef HAVE_SMEM {"shared_memory", (char*) &opt_enable_shared_memory, SHOW_MY_BOOL}, {"shared_memory_base_name", (char*) &shared_memory_base_name, SHOW_CHAR_PTR}, @@ -1375,6 +1414,33 @@ extern void fix_delay_key_write(THD *thd } } +#ifdef ENABLE_SENNA +extern void fix_senna_index_type(THD *thd, enum_var_type type) +{ + DBUG_ENTER("fix_senna_index_type"); + if (senna_index_type_options == 0) { + senna_default_flags = (SEN_INDEX_NORMALIZE | SEN_INDEX_NGRAM); + } else { + senna_default_flags = (SEN_INDEX_NORMALIZE); + } + DBUG_VOID_RETURN; +} + +extern void fix_senna_log_level(THD *thd, enum_var_type type) +{ + DBUG_ENTER("fix_senna_log_level"); + senna_logger.max_level = (sen_log_level) senna_log_level_options; + DBUG_VOID_RETURN; +} + +extern void fix_senna_2ind(THD *thd, enum_var_type type) +{ + DBUG_ENTER("fix_senna_2ind"); + my_thread_var->sen_flags = (thd->variables.senna_2ind ? SENNA_USE_2IND : 0); + DBUG_VOID_RETURN; +} +#endif + static void fix_max_binlog_size(THD *thd, enum_var_type type) { DBUG_ENTER("fix_max_binlog_size"); --- orig/sql/set_var.h 2007-07-04 22:06:22.000000000 +0900 +++ new/sql/set_var.h 2007-10-29 10:14:21.000000000 +0900 @@ -31,6 +31,12 @@ typedef struct my_locale_st MY_LOCALE; extern TYPELIB bool_typelib, delay_key_write_typelib, sql_mode_typelib; +#ifdef ENABLE_SENNA +extern TYPELIB senna_log_level_typelib; +extern TYPELIB senna_index_type_typelib; +extern int senna_default_flags; +#endif + typedef int (*sys_check_func)(THD *, set_var *); typedef bool (*sys_update_func)(THD *, set_var *); typedef void (*sys_after_update_func)(THD *,enum_var_type); @@ -1010,6 +1016,11 @@ extern sys_var_thd_bit sys_autocommit; CHARSET_INFO *get_old_charset_by_name(const char *old_name); gptr find_named(I_List *list, const char *name, uint length, NAMED_LIST **found); +#ifdef ENABLE_SENNA +void fix_senna_log_level(THD *thd, enum_var_type type); +void fix_senna_2ind(THD *thd, enum_var_type type); +void fix_senna_index_type(THD *thd, enum_var_type type); +#endif /* key_cache functions */ KEY_CACHE *get_key_cache(LEX_STRING *cache_name); --- orig/sql/sp_head.cc 2007-07-04 22:06:05.000000000 +0900 +++ new/sql/sp_head.cc 2007-10-29 10:14:21.000000000 +0900 @@ -189,6 +189,9 @@ sp_get_flags_for_command(LEX *lex) case SQLCOM_SHOW_OPEN_TABLES: case SQLCOM_SHOW_PRIVILEGES: case SQLCOM_SHOW_PROCESSLIST: +#ifdef ENABLE_SENNA + case SQLCOM_SHOW_SENNA_STATUS: +#endif case SQLCOM_SHOW_SLAVE_HOSTS: case SQLCOM_SHOW_SLAVE_STAT: case SQLCOM_SHOW_STATUS: --- orig/sql/sql_class.h 2007-07-04 22:06:41.000000000 +0900 +++ new/sql/sql_class.h 2007-10-29 10:14:21.000000000 +0900 @@ -423,11 +423,22 @@ public: List columns; const char *name; bool generated; +#ifdef ENABLE_SENNA + int senna_flags; + int senna_initial_n_segments; +#endif /* ENABLE_SENNA */ +#ifdef ENABLE_SENNA + Key(enum Keytype type_par, const char *name_arg, enum ha_key_alg alg_par, + bool generated_arg, List &cols, int sen_flags=1, int sen_nsegs=0) + :type(type_par), algorithm(alg_par), columns(cols), name(name_arg), + generated(generated_arg), senna_flags(sen_flags), senna_initial_n_segments(sen_nsegs) +#else /* ENABLE_SENNA */ Key(enum Keytype type_par, const char *name_arg, enum ha_key_alg alg_par, bool generated_arg, List &cols) :type(type_par), algorithm(alg_par), columns(cols), name(name_arg), generated(generated_arg) +#endif /* ENABLE_SENNA */ {} ~Key() {} /* Equality comparison of keys (ignoring name) */ @@ -600,6 +611,10 @@ struct system_variables DATE_TIME_FORMAT *datetime_format; DATE_TIME_FORMAT *time_format; my_bool sysdate_is_now; + +#ifdef ENABLE_SENNA + my_bool senna_2ind; +#endif }; @@ -664,6 +679,9 @@ typedef struct system_status_var global status variable counter */ double last_query_cost; +#ifdef ENABLE_SENNA + ulong senna_2ind_count; +#endif } STATUS_VAR; /* --- orig/sql/sql_db.cc 2007-07-04 22:06:25.000000000 +0900 +++ new/sql/sql_db.cc 2007-10-29 10:14:21.000000000 +0900 @@ -874,6 +874,11 @@ static long mysql_rm_known_files(THD *th (file->name[1] == '.' && !file->name[2]))) continue; +#ifdef ENABLE_SENNA + /* senna files is skip */ + /* ".SEN",".SEN.i",".SEN.i.c",".SEN.l", ".SEN.i.c.001",.. and so on */ + if (strstr(file->name, ".SEN")) { continue; } +#endif /* ENABLE_SENNA */ /* Check if file is a raid directory */ if ((my_isdigit(system_charset_info, file->name[0]) || (file->name[0] >= 'a' && file->name[0] <= 'f')) && --- orig/sql/sql_delete.cc 2007-07-04 22:06:58.000000000 +0900 +++ new/sql/sql_delete.cc 2007-10-29 10:14:21.000000000 +0900 @@ -876,6 +876,9 @@ bool mysql_truncate(THD *thd, TABLE_LIST if (thd->slave_thread) --slave_open_temp_tables; *fn_ext(path)=0; // Remove the .frm extension +#ifdef ENABLE_SENNA + create_info.key_info=table->key_info; +#endif /* ENABLE_SENNA */ ha_create_table(path, &create_info,1); // We don't need to call invalidate() because this table is not in cache if ((error= (int) !(open_temporary_table(thd, path, table_list->db, @@ -908,6 +911,10 @@ bool mysql_truncate(THD *thd, TABLE_LIST DBUG_RETURN(TRUE); } +#ifdef ENABLE_SENNA + create_info.query_type = SENNA_TRUNCATE_TABLE; +#endif + *fn_ext(path)=0; // Remove the .frm extension error= ha_create_table(path,&create_info,1); query_cache_invalidate3(thd, table_list, 0); --- orig/sql/sql_insert.cc 2007-07-04 22:05:32.000000000 +0900 +++ new/sql/sql_insert.cc 2007-10-29 10:14:21.000000000 +0900 @@ -1788,6 +1788,9 @@ bool delayed_get_table(THD *thd, TABLE_L tmp->table_list= *table_list; // Needed to open table tmp->table_list.alias= tmp->table_list.table_name= tmp->thd.query; tmp->lock(); +#ifdef ENABLE_SENNA /* nkjm SFID:10294 */ + tmp->thd.thread_id= thd->thread_id; +#endif /* nkjm SFID:10294 */ pthread_mutex_lock(&tmp->mutex); if ((error=pthread_create(&tmp->thd.real_id,&connection_attrib, handle_delayed_insert,(void*) tmp))) @@ -2109,6 +2112,9 @@ pthread_handler_t handle_delayed_insert( { Delayed_insert *di=(Delayed_insert*) arg; THD *thd= &di->thd; +#ifdef ENABLE_SENNA + uint sen_thread_id = thd->thread_id; +#endif pthread_detach_this_thread(); /* Add thread to THD list so that's it's visible in 'show processlist' */ @@ -2134,6 +2140,12 @@ pthread_handler_t handle_delayed_insert( strmov(thd->net.last_error,ER(thd->net.last_errno=ER_OUT_OF_RESOURCES)); goto end; } +#ifdef ENABLE_SENNA /* nkjm SFID:10294 */ + struct st_my_thread_var *sen_tmp; + extern pthread_key_t THR_KEY_mysys; + sen_tmp= (struct st_my_thread_var *)pthread_getspecific(THR_KEY_mysys); + sen_tmp->sen_connection_id= sen_thread_id; +#endif /* nkjm SFID:10294 */ #endif DBUG_ENTER("handle_delayed_insert"); --- orig/sql/sql_lex.h 2007-07-04 22:05:47.000000000 +0900 +++ new/sql/sql_lex.h 2007-10-29 10:14:21.000000000 +0900 @@ -44,6 +44,10 @@ class sp_pcontext; #endif #endif +#ifdef ENABLE_SENNA +#include "senna.h" +#endif + /* When a command is added here, be sure it's also added in mysqld.cc in "struct show_var_st status_vars[]= {" ... @@ -95,6 +99,9 @@ enum enum_sql_command { SQLCOM_XA_COMMIT, SQLCOM_XA_ROLLBACK, SQLCOM_XA_RECOVER, SQLCOM_SHOW_PROC_CODE, SQLCOM_SHOW_FUNC_CODE, SQLCOM_SHOW_PROFILE, SQLCOM_SHOW_PROFILES, +#ifdef ENABLE_SENNA + SQLCOM_SHOW_SENNA_STATUS, +#endif /* When a command is added here, be sure it's also added in mysqld.cc @@ -1170,6 +1177,15 @@ typedef struct st_lex : public Query_tab bool escape_used; +#ifdef ENABLE_SENNA + int senna_flags; + int senna_initial_n_segments; + inline void senna_clear() { + senna_flags= senna_default_flags; + senna_initial_n_segments=0; + } +#endif /* ENABLE_SENNA */ + st_lex(); virtual ~st_lex() --- orig/sql/sql_parse.cc 2007-07-04 22:06:41.000000000 +0900 +++ new/sql/sql_parse.cc 2007-10-29 10:14:21.000000000 +0900 @@ -1106,6 +1106,12 @@ pthread_handler_t handle_one_connection( end_thread(thd,0); return 0; } +#ifdef ENABLE_SENNA /* nkjm SFID:10294 */ + struct st_my_thread_var *sen_tmp; + extern pthread_key_t THR_KEY_mysys; + sen_tmp= (struct st_my_thread_var *)pthread_getspecific(THR_KEY_mysys); + sen_tmp->sen_connection_id= thd->thread_id; +#endif /* nkjm SFID:10294 */ #endif /* @@ -1185,6 +1191,9 @@ pthread_handler_t handle_one_connection( thd_proc_info(thd, 0); thd->init_for_queries(); } +#ifdef ENABLE_SENNA + my_thread_var->sen_flags = (thd->variables.senna_2ind ? SENNA_USE_2IND : 0); +#endif /* Connect completed, set read/write timeouts back to tdefault */ my_net_set_read_timeout(net, thd->variables.net_read_timeout); @@ -2911,6 +2920,13 @@ mysql_execute_command(THD *thd) break; } #endif +#ifdef ENABLE_SENNA + case SQLCOM_SHOW_SENNA_STATUS: + { + res = senna_show_status(thd, lex); + break; + } +#endif #ifdef HAVE_REPLICATION case SQLCOM_LOAD_MASTER_TABLE: { --- orig/sql/sql_select.cc 2007-07-04 22:05:44.000000000 +0900 +++ new/sql/sql_select.cc 2007-10-29 10:14:21.000000000 +0900 @@ -1458,6 +1458,10 @@ JOIN::optimize() DBUG_RETURN(-1); /* purecov: inspected */ } +#ifdef ENABLE_SENNA + my_thread_var->sen_flags |= SENNA_FIRST_CALL; +#endif /* ENABLE_SENNA */ + error= 0; DBUG_RETURN(0); } @@ -2059,6 +2063,10 @@ JOIN::exec() curr_join->fields= curr_fields_list; curr_join->procedure= procedure; +#ifdef ENABLE_SENNA + my_thread_var->sen_flags &= ~SENNA_FIRST_CALL; +#endif /* ENABLE_SENNA */ + if (is_top_level_join() && thd->cursor && tables != const_tables) { /* @@ -2248,7 +2256,10 @@ mysql_select(THD *thd, Item ***rref_poin goto err; } } - +#ifdef ENABLE_SENNA + my_thread_var->sen_flags = select_lex->ftfunc_list->elements ? SENNA_MATCH : 0; + if (join->select_distinct) { my_thread_var->sen_flags |= SENNA_DISTINCT; } +#endif /* ENABLE_SENNA */ if ((err= join->optimize())) { goto err; // 1 @@ -3629,7 +3640,11 @@ update_ref_and_keys(THD *thd, DYNAMIC_AR for ( ; field != end ; field++) add_key_part(keyuse,field); - if (select_lex->ftfunc_list->elements) + if (select_lex->ftfunc_list->elements +#ifdef ENABLE_SENNA + && !join_tab->table->force_index +#endif /* ENABLE_SENNA */ + ) { add_ft_keys(keyuse,join_tab,cond,normal_tables); } @@ -6129,6 +6144,9 @@ make_join_readinfo(JOIN *join, ulonglong table->status=STATUS_NO_RECORD; tab->read_first_record= join_ft_read_first; tab->read_record.read_record= join_ft_read_next; +#ifdef ENABLE_SENNA + my_thread_var->sen_flags |= SENNA_DO_READ_RECORD; +#endif /* ENABLE_SENNA */ break; case JT_ALL: /* @@ -10399,6 +10417,20 @@ do_select(JOIN *join,List *fields, DBUG_RETURN(join->thd->net.report_error ? -1 : rc); } +#ifdef ENABLE_SENNA +static void +decide_read_or_skip(JOIN *join,JOIN_TAB *join_tab,bool needs_record) +{ + if (needs_record || (my_thread_var->sen_flags & (SENNA_DISTINCT | SENNA_FIRST_CALL)) || + (join_tab->next_select != end_send_group && + !join->unit->offset_limit_cnt && + join->send_records < join->unit->select_limit_cnt)) { + my_thread_var->sen_flags |= SENNA_IF_READ_RECORD; + } else { + my_thread_var->sen_flags &= ~SENNA_IF_READ_RECORD; + } +} +#endif /* ENABLE_SENNA */ enum_nested_loop_state sub_select_cache(JOIN *join,JOIN_TAB *join_tab,bool end_of_records) @@ -10544,6 +10576,9 @@ sub_select_cache(JOIN *join,JOIN_TAB *jo enum_nested_loop_state sub_select(JOIN *join,JOIN_TAB *join_tab,bool end_of_records) { +#ifdef ENABLE_SENNA + if (join_tab->next_select == end_update) { my_thread_var->sen_flags &= ~SENNA_DO_READ_RECORD; } +#endif /* ENABLE_SENNA */ join_tab->table->null_row=0; if (end_of_records) return (*join_tab->next_select)(join,join_tab+1,end_of_records); @@ -10552,6 +10587,10 @@ sub_select(JOIN *join,JOIN_TAB *join_tab enum_nested_loop_state rc; my_bool *report_error= &(join->thd->net.report_error); READ_RECORD *info= &join_tab->read_record; +#ifdef ENABLE_SENNA + COND *select_cond = join_tab->select_cond; + bool needs_record = select_cond ? select_cond->needs_record() : false; +#endif /* ENABLE_SENNA */ if (join->resume_nested_loop) { @@ -10581,12 +10620,18 @@ sub_select(JOIN *join,JOIN_TAB *join_tab } join->thd->row_count= 0; +#ifdef ENABLE_SENNA + decide_read_or_skip(join, join_tab, needs_record); +#endif /* ENABLE_SENNA */ error= (*join_tab->read_first_record)(join_tab); rc= evaluate_join_record(join, join_tab, error, report_error); } while (rc == NESTED_LOOP_OK) { +#ifdef ENABLE_SENNA + decide_read_or_skip(join, join_tab, needs_record); +#endif /* ENABLE_SENNA */ error= info->read_record(info); rc= evaluate_join_record(join, join_tab, error, report_error); } @@ -11245,7 +11290,19 @@ join_read_first(JOIN_TAB *tab) tab->read_record.record=table->record[0]; if (!table->file->inited) table->file->ha_index_init(tab->index); - if ((error=tab->table->file->index_first(tab->table->record[0]))) +#ifdef ENABLE_SENNA + if (my_thread_var->sen_flags & SENNA_MATCH) { my_thread_var->sen_flags |= SENNA_DO_READ_RECORD; } + if ((my_thread_var->sen_flags & SENNA_USE_2IND) && + (my_thread_var->sen_flags & + (SENNA_MATCH | SENNA_DO_READ_RECORD | SENNA_IF_READ_RECORD)) + == (SENNA_MATCH | SENNA_DO_READ_RECORD)) { + //error=tab->table->file->index_first(NULL); + statistic_increment(tab->table->in_use->status_var.senna_2ind_count, &LOCK_status); + return 0; + } else +#endif /* ENABLE_SENNA */ + error=tab->table->file->index_first(tab->table->record[0]); + if (error) { if (error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE) report_error(table, error); @@ -11259,7 +11316,18 @@ static int join_read_next(READ_RECORD *info) { int error; - if ((error=info->file->index_next(info->record))) +#ifdef ENABLE_SENNA + if ((my_thread_var->sen_flags & SENNA_USE_2IND) && + (my_thread_var->sen_flags & + (SENNA_MATCH | SENNA_DO_READ_RECORD | SENNA_IF_READ_RECORD)) + == (SENNA_MATCH | SENNA_DO_READ_RECORD)) { + //error=info->file->index_next(NULL); + statistic_increment(info->thd->status_var.senna_2ind_count, &LOCK_status); + return 0; + } else +#endif /* ENABLE_SENNA */ + error=info->file->index_next(info->record); + if (error) return report_error(info->table, error); return 0; } @@ -11284,7 +11352,19 @@ join_read_last(JOIN_TAB *tab) tab->read_record.record=table->record[0]; if (!table->file->inited) table->file->ha_index_init(tab->index); - if ((error= tab->table->file->index_last(tab->table->record[0]))) +#ifdef ENABLE_SENNA + if (my_thread_var->sen_flags & SENNA_MATCH) { my_thread_var->sen_flags |= SENNA_DO_READ_RECORD; } + if ((my_thread_var->sen_flags & SENNA_USE_2IND) && + (my_thread_var->sen_flags & + (SENNA_MATCH | SENNA_DO_READ_RECORD | SENNA_IF_READ_RECORD)) + == (SENNA_MATCH | SENNA_DO_READ_RECORD)) { + //error=tab->table->file->index_last(NULL); + statistic_increment(tab->table->in_use->status_var.senna_2ind_count, &LOCK_status); + return 0; + } else +#endif /* ENABLE_SENNA */ + error=tab->table->file->index_last(tab->table->record[0]); + if (error) return report_error(table, error); return 0; } @@ -11294,7 +11374,18 @@ static int join_read_prev(READ_RECORD *info) { int error; - if ((error= info->file->index_prev(info->record))) +#ifdef ENABLE_SENNA + if ((my_thread_var->sen_flags & SENNA_USE_2IND) && + (my_thread_var->sen_flags & + (SENNA_MATCH | SENNA_DO_READ_RECORD | SENNA_IF_READ_RECORD)) + == (SENNA_MATCH | SENNA_DO_READ_RECORD)) { + //error=info->file->index_prev(NULL); + statistic_increment(info->thd->status_var.senna_2ind_count, &LOCK_status); + return 0; + } else +#endif /* ENABLE_SENNA */ + error=info->file->index_prev(info->record); + if (error) return report_error(info->table, error); return 0; } @@ -11308,6 +11399,9 @@ join_ft_read_first(JOIN_TAB *tab) if (!table->file->inited) table->file->ha_index_init(tab->ref.key); +#ifdef ENABLE_SENNA + if (my_thread_var->sen_flags & SENNA_MATCH) { my_thread_var->sen_flags |= SENNA_DO_READ_RECORD; } +#endif /* ENABLE_SENNA */ #if NOT_USED_YET if (cp_buffer_from_ref(tab->join->thd, &tab->ref)) // as ft-key doesn't use store_key's return -1; // see also FT_SELECT::init() @@ -12569,6 +12663,12 @@ create_sort_index(THD *thd, JOIN *join, table= tab->table; select= tab->select; +#ifdef ENABLE_SENNA + if (tab->select_cond && tab->select_cond->needs_record()) { + my_thread_var->sen_flags |= SENNA_IF_READ_RECORD; + } +#endif /* ENABLE_SENNA */ + /* When there is SQL_BIG_RESULT do not sort using index for GROUP BY, and thus force sorting on disk. --- orig/sql/sql_show.cc 2007-07-04 22:06:15.000000000 +0900 +++ new/sql/sql_show.cc 2007-10-29 10:14:21.000000000 +0900 @@ -28,6 +28,12 @@ #include "ha_berkeley.h" // For berkeley_show_logs #endif +#ifdef ENABLE_SENNA +#ifdef HAVE_ISAM +#include "ha_myisam.h" // For isam +#endif +#endif /* ENABLE_SENNA */ + #ifndef NO_EMBEDDED_ACCESS_CHECKS static const char *grant_names[]={ "select","insert","update","delete","create","drop","reload","shutdown", @@ -1879,6 +1885,9 @@ void get_index_field_values(LEX *lex, IN case SQLCOM_SHOW_TABLES: case SQLCOM_SHOW_TABLE_STATUS: case SQLCOM_SHOW_TRIGGERS: +#ifdef ENABLE_SENNA + case SQLCOM_SHOW_SENNA_STATUS: +#endif index_field_values->db_value= lex->select_lex.db; index_field_values->table_value= wild; break; @@ -4432,3 +4441,113 @@ ST_SCHEMA_TABLE schema_tables[]= template class List_iterator_fast; template class List; #endif + +#ifdef ENABLE_SENNA +#define SECTIONALIZE 0x00080000 +bool senna_show_status(THD *thd, LEX *lex) +{ + List files; + List field_list; + char path[FN_LEN]; + char *file_name; + DBUG_ENTER("senna_show_status"); + Protocol* protocol = thd->protocol; + char *db = lex->select_lex.db ? lex->select_lex.db : thd->db; + if (!db) { + my_error(ER_NO_DB_ERROR, MYF(0)); + DBUG_RETURN(TRUE); + } + + const char *wild = lex->wild ? lex->wild->ptr() : "%"; + + (void) my_snprintf(path, FN_LEN, "%s/%s", mysql_data_home, db); + (void) unpack_dirname(path, path); + + field_list.push_back(new Item_empty_string("Table", 20)); + field_list.push_back(new Item_empty_string("Key_name", 20)); + field_list.push_back(new Item_empty_string("Column_name", 20)); + field_list.push_back(new Item_empty_string("Encoding", 20)); + field_list.push_back(new Item_empty_string("Index_type", 20)); + field_list.push_back(new Item_empty_string("Sectionalize", 20)); + field_list.push_back(new Item_empty_string("Normalize", 20)); + field_list.push_back(new Item_empty_string("Split_alpha", 20)); + field_list.push_back(new Item_empty_string("Split_digit", 20)); + field_list.push_back(new Item_empty_string("Split_symbol", 20)); + field_list.push_back(new Item_int("Initial_n_segments", 20)); + field_list.push_back(new Item_int("Senna_keys_size", 20)); + field_list.push_back(new Item_int("Senna_keys_file_size", 20)); + field_list.push_back(new Item_int("Senna_lexicon_size", 20)); + field_list.push_back(new Item_int("Senna_lexicon_file_size", 20)); + field_list.push_back(new Item_int("Senna_inv_seg_size", 20)); + field_list.push_back(new Item_int("Senna_inv_chunk_size", 20)); + if (protocol->send_fields(&field_list, + Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF)) + DBUG_RETURN(TRUE); + + if (find_files(thd, &files, db, path, wild, 0)) + DBUG_RETURN(-1); + List_iterator_fast it(files); + while (file_name = it++) + { + TABLE_LIST table_list; + bzero((char*) &table_list, sizeof(table_list)); + table_list.db = db; + table_list.table_name = file_name; + table_list.alias = file_name; + TABLE *table = open_ltable(thd, &table_list, TL_READ); + if (!strcmp(table->file->table_type(), "MyISAM")) + { + uint nkeys = table->s->keys; + int i = 0; + table->file->info(HA_STATUS_VARIABLE | HA_STATUS_SENNA); + for (; i < nkeys; i++) + { + const char* tkey; + KEY *key = &table->key_info[i]; + + if (key->algorithm == HA_KEY_ALG_FULLTEXT + &&!(key->senna_flags & SEN_DISABLE_SENNA)) + { + uint nkey_parts = key->key_parts; + int j = 0; + for (; j < nkey_parts; j++) + { + KEY_PART_INFO *key_part = &key->key_part[j]; + uint16 fieldnr = key_part->fieldnr; + Field *field = table->field[fieldnr-1]; + const char *field_name = field->field_name; + + protocol->prepare_for_resend(); + protocol->store(key->table->s->table_name, system_charset_info); + protocol->store(key->name, system_charset_info); + protocol->store(field_name, system_charset_info); + protocol->store(key->senna_encoding, system_charset_info); + if (key->senna_flags & SEN_INDEX_NGRAM) + protocol->store("NGRAM", system_charset_info); + else if (key->senna_flags & SEN_INDEX_DELIMITED) + protocol->store("DELIMITED", system_charset_info); + else + protocol->store("MECAB", system_charset_info); + protocol->store(key->senna_flags & SECTIONALIZE ? "ON" : "OFF", system_charset_info); + protocol->store(key->senna_flags & SEN_INDEX_NORMALIZE ? "ON" : "OFF", system_charset_info); + protocol->store(key->senna_flags & SEN_INDEX_SPLIT_ALPHA ? "ON" : "OFF", system_charset_info); + protocol->store(key->senna_flags & SEN_INDEX_SPLIT_DIGIT ? "ON" : "OFF", system_charset_info); + protocol->store(key->senna_flags & SEN_INDEX_SPLIT_SYMBOL ? "ON" : "OFF", system_charset_info); + protocol->store((uint32) key->senna_initial_n_segments); + protocol->store((uint32) key->senna_keys_size); + protocol->store((uint32) key->senna_keys_file_size); + protocol->store((uint32) key->senna_lexicon_size); + protocol->store((uint32) key->senna_lexicon_file_size); + protocol->store((uint32) key->senna_inv_seg_size); + protocol->store((uint32) key->senna_inv_chunk_size); + if (protocol->write()) DBUG_RETURN(TRUE); + } + } + } + } + close_thread_tables(thd, 0); + } + send_eof(thd); + DBUG_RETURN(TRUE); +} +#endif --- orig/sql/sql_table.cc 2007-07-04 22:06:22.000000000 +0900 +++ new/sql/sql_table.cc 2007-10-29 10:14:21.000000000 +0900 @@ -1121,6 +1121,9 @@ static int mysql_prepare_table(THD *thd, if (!*key_info_buffer || ! key_part_info) DBUG_RETURN(-1); // Out of memory +#ifdef ENABLE_SENNA + create_info->key_info=*key_info_buffer; +#endif /* ENABLE_SENNA */ key_iterator.rewind(); key_number=0; for (; (key=key_iterator++) ; key_number++) @@ -1164,6 +1167,10 @@ static int mysql_prepare_table(THD *thd, if (key->generated) key_info->flags|= HA_GENERATED_KEY; +#ifdef ENABLE_SENNA + key_info->senna_flags=key->senna_flags; + key_info->senna_initial_n_segments=key->senna_initial_n_segments; +#endif /* ENABLE_SENNA */ key_info->key_parts=(uint8) key->columns.elements; key_info->key_part=key_part_info; key_info->usable_key_parts= key_number; @@ -1263,6 +1270,9 @@ static int mysql_prepare_table(THD *thd, DBUG_RETURN(-1); } ft_key_charset=sql_field->charset; +#ifdef ENABLE_SENNA + key_info->senna_encoding=ft_key_charset->csname; +#endif /* for fulltext keys keyseg length is 1 for blobs (it's ignored in ft code anyway, and 0 (set to column width later) for char's. it has @@ -2822,6 +2832,10 @@ bool mysql_create_like_table(THD* thd, T DBUG_EXECUTE_IF("sleep_create_like_before_copy", my_sleep(6000000);); +#ifdef ENABLE_SENNA + create_info->query_type = SENNA_CREATE_TABLE_LIKE; +#endif + /* Create a new table by copying from source table */ @@ -3147,6 +3161,10 @@ view_err: if (!(table=open_ltable(thd,table_list,TL_WRITE_ALLOW_READ))) DBUG_RETURN(TRUE); +#ifdef ENABLE_SENNA + table->file->info(HA_STATUS_VARIABLE | HA_STATUS_SENNA); +#endif + /* Check that we are not trying to rename to an existing table */ if (new_name) { @@ -3593,10 +3611,19 @@ view_err: else key_type= Key::MULTIPLE; +#ifdef ENABLE_SENNA + key= new Key(key_type, key_name, + key_info->algorithm, + test(key_info->flags & HA_GENERATED_KEY), + key_parts, + key_info->senna_flags, + key_info->senna_initial_n_segments); +#else /* ENABLE_SENNA */ key= new Key(key_type, key_name, key_info->algorithm, test(key_info->flags & HA_GENERATED_KEY), key_parts); +#endif /* ENABLE_SENNA */ new_info.key_list.push_back(key); } } --- orig/sql/sql_yacc.yy 2007-07-04 22:06:26.000000000 +0900 +++ new/sql/sql_yacc.yy 2007-10-29 10:14:20.000000000 +0900 @@ -892,6 +892,16 @@ bool my_yyoverflow(short **a, YYSTYPE ** %token SECOND_SYM %token SECURITY_SYM %token SELECT_SYM +%token SENNA_DELIMITED_SYM +%token SENNA_KWIC_SYM +%token SENNA_MECAB_SYM +%token SENNA_NGRAM_SYM +%token SENNA_NORMALIZE_SYM +%token SENNA_SECTIONALIZE_SYM +%token SENNA_SPLIT_ALPHA_SYM +%token SENNA_SPLIT_DIGIT_SYM +%token SENNA_SPLIT_SYMBOL_SYM +%token SENNA_SYM %token SENSITIVE_SYM %token SEPARATOR_SYM %token SERIALIZABLE_SYM @@ -1195,6 +1205,7 @@ bool my_yyoverflow(short **a, YYSTYPE ** view_suid view_tail view_list_opt view_list view_select view_check_option trigger_tail sp_tail case_stmt_specification simple_case_stmt searched_case_stmt + opt_senna_list opt_senna_item END_OF_INPUT %type call sp_proc_stmts sp_proc_stmts1 sp_proc_stmt @@ -1490,6 +1501,9 @@ create: TL_WRITE)) MYSQL_YYABORT; lex->alter_info.reset(); +#ifdef ENABLE_SENNA + lex->senna_clear(); +#endif lex->col_list.empty(); lex->change=NullS; bzero((char*) &lex->create_info,sizeof(lex->create_info)); @@ -1514,9 +1528,15 @@ create: '(' key_list ')' { LEX *lex=Lex; +#ifdef ENABLE_SENNA + Key *key= new Key($2,$4.str, $5, 0, lex->col_list, + lex->senna_flags, lex->senna_initial_n_segments); + lex->alter_info.key_list.push_back(key); + lex->senna_clear(); +#else /* ENABLE_SENNA */ Key *key= new Key($2, $4.str, $5, 0, lex->col_list); - lex->alter_info.key_list.push_back(key); +#endif /* ENABLE_SENNA */ lex->col_list.empty(); } | CREATE DATABASE opt_if_not_exists ident @@ -3035,6 +3055,9 @@ column_def: field_spec opt_check_constraint | field_spec references { +#ifdef ENABLE_SENNA + Lex->senna_clear(); +#endif /* ENABLE_SENNA */ Lex->col_list.empty(); /* Alloced by sql_alloc */ } ; @@ -3042,18 +3065,31 @@ column_def: key_def: key_type opt_ident key_alg '(' key_list ')' { - LEX *lex=Lex; + LEX *lex=Lex; +#ifdef ENABLE_SENNA + Key *key= new Key($1,$2, $3, 0, lex->col_list, + lex->senna_flags, lex->senna_initial_n_segments); + lex->alter_info.key_list.push_back(key); + lex->senna_clear(); +#else /* ENABLE_SENNA */ Key *key= new Key($1, $2, $3, 0, lex->col_list); lex->alter_info.key_list.push_back(key); - - lex->col_list.empty(); /* Alloced by sql_alloc */ +#endif /* ENABLE_SENNA */ + lex->col_list.empty(); /* Alloced by sql_alloc */ } | opt_constraint constraint_key_type opt_ident key_alg '(' key_list ')' { LEX *lex=Lex; const char *key_name= $3 ? $3:$1; +#ifdef ENABLE_SENNA + Key *key= new Key($2, key_name, $4, 0, lex->col_list, + lex->senna_flags, lex->senna_initial_n_segments); + lex->alter_info.key_list.push_back(key); + lex->senna_clear(); +#else /* ENABLE_SENNA */ Key *key= new Key($2, key_name, $4, 0, lex->col_list); lex->alter_info.key_list.push_back(key); +#endif /* ENABLE_SENNA */ lex->col_list.empty(); /* Alloced by sql_alloc */ } | opt_constraint FOREIGN KEY_SYM opt_ident '(' key_list ')' references @@ -3071,14 +3107,23 @@ key_def: HA_KEY_ALG_UNDEF, 1, lex->col_list); lex->alter_info.key_list.push_back(key); +#ifdef ENABLE_SENNA + lex->senna_clear(); +#endif /* ENABLE_SENNA */ lex->col_list.empty(); /* Alloced by sql_alloc */ } | constraint opt_check_constraint { +#ifdef ENABLE_SENNA + Lex->senna_clear(); +#endif /* ENABLE_SENNA */ Lex->col_list.empty(); /* Alloced by sql_alloc */ } | opt_constraint check_constraint { +#ifdef ENABLE_SENNA + Lex->senna_clear(); +#endif /* ENABLE_SENNA */ Lex->col_list.empty(); /* Alloced by sql_alloc */ } ; @@ -3571,7 +3616,78 @@ opt_btree_or_rtree: { $$= HA_KEY_ALG_RTREE; } - | HASH_SYM { $$= HA_KEY_ALG_HASH; }; + | HASH_SYM { $$= HA_KEY_ALG_HASH; } + | opt_senna_list { $$= HA_KEY_ALG_UNDEF; }; + +opt_senna_list: + opt_senna_item + | opt_senna_item ',' opt_senna_list ; + +opt_senna_item: + SENNA_SYM { +#ifdef ENABLE_SENNA + Lex->senna_flags &= ~SEN_DISABLE_SENNA; +#endif /* ENABLE_SENNA */ + } + | NO_SYM SENNA_SYM { +#ifdef ENABLE_SENNA + Lex->senna_flags |= SEN_DISABLE_SENNA; +#endif /* ENABLE_SENNA */ + } + | SENNA_NORMALIZE_SYM { +#ifdef ENABLE_SENNA + Lex->senna_flags |= SEN_INDEX_NORMALIZE; +#endif /* ENABLE_SENNA */ + } + | NO_SYM SENNA_NORMALIZE_SYM { +#ifdef ENABLE_SENNA + Lex->senna_flags &= ~SEN_INDEX_NORMALIZE; +#endif /* ENABLE_SENNA */ + } + | SENNA_SPLIT_ALPHA_SYM { +#ifdef ENABLE_SENNA + Lex->senna_flags |= SEN_INDEX_SPLIT_ALPHA; +#endif /* ENABLE_SENNA */ + } + | SENNA_SPLIT_DIGIT_SYM { +#ifdef ENABLE_SENNA + Lex->senna_flags |= SEN_INDEX_SPLIT_DIGIT; +#endif /* ENABLE_SENNA */ + } + | SENNA_SPLIT_SYMBOL_SYM { +#ifdef ENABLE_SENNA + Lex->senna_flags |= SEN_INDEX_SPLIT_SYMBOL; +#endif /* ENABLE_SENNA */ + } + | SENNA_DELIMITED_SYM { +#ifdef ENABLE_SENNA + Lex->senna_flags |= SEN_INDEX_DELIMITED; +#endif /* ENABLE_SENNA */ + } + | SENNA_MECAB_SYM { +#ifdef ENABLE_SENNA + Lex->senna_flags &= ~SEN_INDEX_NGRAM; +#endif /* ENABLE_SENNA */ + } + | SENNA_NGRAM_SYM { +#ifdef ENABLE_SENNA + Lex->senna_flags |= SEN_INDEX_NGRAM; +#endif /* ENABLE_SENNA */ + } + | SENNA_SECTIONALIZE_SYM { +#ifdef ENABLE_SENNA + Lex->senna_flags |= 0x00080000; +#endif /* ENABLE_SENNA */ + } + | ulong_num { +#ifdef ENABLE_SENNA + if ($1 < 65536) { + Lex->senna_initial_n_segments=$1; + } else { + Lex->senna_flags |= $1; + } +#endif /* ENABLE_SENNA */ + }; key_list: key_list ',' key_part order_dir { Lex->col_list.push_back($3); } @@ -3616,6 +3732,9 @@ alter: if (!lex->select_lex.add_table_to_list(thd, $4, NULL, TL_OPTION_UPDATING)) MYSQL_YYABORT; +#ifdef ENABLE_SENNA + lex->senna_clear(); +#endif /* ENABLE_SENNA */ lex->col_list.empty(); lex->select_lex.init_order(); lex->select_lex.db= @@ -4977,6 +5096,12 @@ simple_expr: { $$= new Item_func_row_count(); Lex->safe_to_cache_query= 0; +#ifdef ENABLE_SENNA + } + | SENNA_KWIC_SYM '(' expr_list ')' + { + $$= new Item_func_senna_kwic(* $3); +#endif } | SUBDATE_SYM '(' expr ',' expr ')' { $$= new Item_date_add_interval($3, $5, INTERVAL_DAY, 1);} @@ -7186,6 +7311,13 @@ show_param: Lex->sql_command= SQLCOM_SHOW_FUNC_CODE; Lex->spname= $3; #endif +#ifdef ENABLE_SENNA + } + | SENNA_SYM STATUS_SYM opt_db wild_and_where + { + Lex->sql_command= SQLCOM_SHOW_SENNA_STATUS; + Lex->select_lex.db = $3; +#endif } ; @@ -8308,6 +8440,11 @@ keyword_sp: | ROW_SYM {} | RTREE_SYM {} | SECOND_SYM {} + | SENNA_DELIMITED_SYM {} + | SENNA_MECAB_SYM {} + | SENNA_NGRAM_SYM {} + | SENNA_NORMALIZE_SYM {} + | SENNA_SYM {} | SERIAL_SYM {} | SERIALIZABLE_SYM {} | SESSION_SYM {} --- orig/sql/structs.h 2007-07-04 22:06:16.000000000 +0900 +++ new/sql/structs.h 2007-10-29 10:14:21.000000000 +0900 @@ -104,6 +104,17 @@ typedef struct st_key { int bdb_return_if_eq; } handler; struct st_table *table; +#ifdef ENABLE_SENNA + int senna_flags; + int senna_initial_n_segments; + uint senna_keys_size; + uint senna_keys_file_size; + uint senna_lexicon_size; + uint senna_lexicon_file_size; + uint senna_inv_seg_size; + uint senna_inv_chunk_size; + const char *senna_encoding; +#endif /* ENABLE_SENNA */ } KEY;