Merge abotchkov@work.mysql.com:/home/bk/mysql-4.1

into deer.mysql.r18.ru:/home/hf/work/mysql-default


sql/item.cc:
  Auto merged
sql/sql_yacc.yy:
  Auto merged
This commit is contained in:
unknown 2003-01-22 20:51:54 +04:00
commit c95a77c24f
198 changed files with 3577 additions and 2158 deletions

View File

@ -3,9 +3,9 @@
path=`dirname $0` path=`dirname $0`
. "$path/SETUP.sh" . "$path/SETUP.sh"
extra_flags="$pentium_cflags $fast_cflags" extra_flags="$pentium_cflags $fast_cflags -g"
extra_configs="$pentium_configs" extra_configs="$pentium_configs"
strip=yes #strip=yes
extra_configs="$extra_configs --with-innodb --with-berkeley-db \ extra_configs="$extra_configs --with-innodb --with-berkeley-db \
--with-embedded-server --enable-thread-safe-client \ --with-embedded-server --enable-thread-safe-client \

View File

@ -21,7 +21,8 @@ AUTOMAKE_OPTIONS = foreign
# These are built from source in the Docs directory # These are built from source in the Docs directory
EXTRA_DIST = INSTALL-SOURCE README \ EXTRA_DIST = INSTALL-SOURCE README \
COPYING COPYING.LIB COPYING COPYING.LIB
SUBDIRS = . include @docs_dirs@ @readline_dir@ \ SUBDIRS = . include @docs_dirs@ \
@readline_topdir@ @readline_dir@ \
@thread_dirs@ pstack @sql_client_dirs@ \ @thread_dirs@ pstack @sql_client_dirs@ \
@sql_server_dirs@ scripts man tests \ @sql_server_dirs@ scripts man tests \
BUILD os2 libmysql_r @libmysqld_dirs@ \ BUILD os2 libmysql_r @libmysqld_dirs@ \

View File

@ -25,7 +25,7 @@ CFG=bdb - Win32 Max
# PROP AllowPerConfigDependencies 0 # PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName "" # PROP Scc_ProjName ""
# PROP Scc_LocalPath "" # PROP Scc_LocalPath ""
CPP=cl.exe CPP=xicl6.exe
RSC=rc.exe RSC=rc.exe
!IF "$(CFG)" == "bdb - Win32 Debug" !IF "$(CFG)" == "bdb - Win32 Debug"
@ -41,14 +41,13 @@ RSC=rc.exe
# PROP Intermediate_Dir "Debug" # PROP Intermediate_Dir "Debug"
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
# ADD CPP /nologo /G6 /MTd /W3 /Z7 /Od /Gf /I "../bdb/build_win32" /I "../bdb/include" /D "__WIN32__" /D "_DEBUG" /D "SAFEMALLOC" /D "SAFE_MUTEX" /D "_WINDOWS" /FD /c # ADD CPP /nologo /G6 /MTd /W3 /Z7 /Od /Gf /I "../bdb/build_win32" /I "../bdb" /I "../bdb/dbinc" /D "__WIN32__" /D "_DEBUG" /D "SAFEMALLOC" /D "SAFE_MUTEX" /D "_WINDOWS" /FD /c
# SUBTRACT CPP /Fr
# ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LIB32=link.exe -lib LIB32=xilink6.exe -lib
# ADD BASE LIB32 /nologo # ADD BASE LIB32 /nologo
# ADD LIB32 /nologo /out:"..\lib_debug\bdb.lib" # ADD LIB32 /nologo /out:"..\lib_debug\bdb.lib"
@ -66,13 +65,13 @@ LIB32=link.exe -lib
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /G6 /MTd /W3 /Z7 /Od /Gf /I "../bdb/build_win32" /I "../bdb/include" /D "__WIN32__" /D "_DEBUG" /D "SAFEMALLOC" /D "SAFE_MUTEX" /D "_WINDOWS" /FD /c # ADD BASE CPP /nologo /G6 /MTd /W3 /Z7 /Od /Gf /I "../bdb/build_win32" /I "../bdb/include" /D "__WIN32__" /D "_DEBUG" /D "SAFEMALLOC" /D "SAFE_MUTEX" /D "_WINDOWS" /FD /c
# SUBTRACT BASE CPP /Fr # SUBTRACT BASE CPP /Fr
# ADD CPP /nologo /G6 /MT /W3 /O2 /I "../bdb/build_win32" /I "../bdb/include" /D "NDEBUG" /D "DBUG_OFF" /D "_WINDOWS" /Fo"mysys___Win32_Max/" /Fd"mysys___Win32_Max/" /FD /c # ADD CPP /nologo /G6 /MT /W3 /O2 /I "../bdb/build_win32" /I "../bdb" /D "NDEBUG" /D "DBUG_OFF" /D "_WINDOWS" /Fo"mysys___Win32_Max/" /Fd"mysys___Win32_Max/" /FD /c
# ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LIB32=link.exe -lib LIB32=xilink6.exe -lib
# ADD BASE LIB32 /nologo /out:"..\lib_debug\bdb.lib" # ADD BASE LIB32 /nologo /out:"..\lib_debug\bdb.lib"
# ADD LIB32 /nologo /out:"..\lib_release\bdb.lib" # ADD LIB32 /nologo /out:"..\lib_release\bdb.lib"
@ -167,34 +166,6 @@ SOURCE=.\db\crdel_rec.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\cxx\cxx_app.cpp
# End Source File
# Begin Source File
SOURCE=.\cxx\cxx_except.cpp
# End Source File
# Begin Source File
SOURCE=.\cxx\cxx_lock.cpp
# End Source File
# Begin Source File
SOURCE=.\cxx\cxx_log.cpp
# End Source File
# Begin Source File
SOURCE=.\cxx\cxx_mpool.cpp
# End Source File
# Begin Source File
SOURCE=.\cxx\cxx_table.cpp
# End Source File
# Begin Source File
SOURCE=.\cxx\cxx_txn.cpp
# End Source File
# Begin Source File
SOURCE=.\db\db.c SOURCE=.\db\db.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -235,6 +206,10 @@ SOURCE=.\common\db_getlong.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\common\db_idspace.c
# End Source File
# Begin Source File
SOURCE=.\db\db_iface.c SOURCE=.\db\db_iface.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -255,6 +230,10 @@ SOURCE=.\db\db_method.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\db\db_open.c
# End Source File
# Begin Source File
SOURCE=.\db\db_overflow.c SOURCE=.\db\db_overflow.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -271,6 +250,14 @@ SOURCE=.\db\db_reclaim.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\db\db_remove.c
# End Source File
# Begin Source File
SOURCE=.\db\db_rename.c
# End Source File
# Begin Source File
SOURCE=.\db\db_ret.c SOURCE=.\db\db_ret.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -283,6 +270,10 @@ SOURCE=.\env\db_shash.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\db\db_truncate.c
# End Source File
# Begin Source File
SOURCE=.\db\db_upg.c SOURCE=.\db\db_upg.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -303,6 +294,26 @@ SOURCE=.\dbm\dbm.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\dbreg\dbreg.c
# End Source File
# Begin Source File
SOURCE=.\dbreg\dbreg_auto.c
# End Source File
# Begin Source File
SOURCE=.\dbreg\dbreg_rec.c
# End Source File
# Begin Source File
SOURCE=.\dbreg\dbreg_util.c
# End Source File
# Begin Source File
SOURCE=.\env\env_file.c
# End Source File
# Begin Source File
SOURCE=.\env\env_method.c SOURCE=.\env\env_method.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -319,6 +330,22 @@ SOURCE=.\env\env_region.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\fileops\fileops_auto.c
# End Source File
# Begin Source File
SOURCE=.\fileops\fop_basic.c
# End Source File
# Begin Source File
SOURCE=.\fileops\fop_rec.c
# End Source File
# Begin Source File
SOURCE=.\fileops\fop_util.c
# End Source File
# Begin Source File
SOURCE=.\hash\hash.c SOURCE=.\hash\hash.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -347,6 +374,10 @@ SOURCE=.\hash\hash_method.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\hash\hash_open.c
# End Source File
# Begin Source File
SOURCE=.\hash\hash_page.c SOURCE=.\hash\hash_page.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -371,6 +402,10 @@ SOURCE=.\hash\hash_verify.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\hmac\hmac.c
# End Source File
# Begin Source File
SOURCE=.\hsearch\hsearch.c SOURCE=.\hsearch\hsearch.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -379,10 +414,6 @@ SOURCE=.\lock\lock.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\lock\lock_conflict.c
# End Source File
# Begin Source File
SOURCE=.\lock\lock_deadlock.c SOURCE=.\lock\lock_deadlock.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -411,18 +442,10 @@ SOURCE=.\log\log_archive.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\log\log_auto.c
# End Source File
# Begin Source File
SOURCE=.\log\log_compare.c SOURCE=.\log\log_compare.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\log\log_findckp.c
# End Source File
# Begin Source File
SOURCE=.\log\log_get.c SOURCE=.\log\log_get.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -435,14 +458,6 @@ SOURCE=.\log\log_put.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\log\log_rec.c
# End Source File
# Begin Source File
SOURCE=.\log\log_register.c
# End Source File
# Begin Source File
SOURCE=.\mp\mp_alloc.c SOURCE=.\mp\mp_alloc.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -495,6 +510,10 @@ SOURCE=.\mutex\mut_tas.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\mutex\mut_win32.c
# End Source File
# Begin Source File
SOURCE=.\mutex\mutex.c SOURCE=.\mutex\mutex.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -507,6 +526,14 @@ SOURCE=.\os\os_alloc.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\os_win32\os_clock.c
# End Source File
# Begin Source File
SOURCE=.\os_win32\os_config.c
# End Source File
# Begin Source File
SOURCE=.\os_win32\os_dir.c SOURCE=.\os_win32\os_dir.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -519,15 +546,15 @@ SOURCE=.\os_win32\os_fid.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\os_win32\os_finit.c SOURCE=.\os_win32\os_fsync.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\os\os_fsync.c SOURCE=.\os_win32\os_handle.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\os\os_handle.c SOURCE=.\os\os_id.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -563,7 +590,7 @@ SOURCE=.\os\os_rpath.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\os\os_rw.c SOURCE=.\os_win32\os_rw.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -579,7 +606,7 @@ SOURCE=.\os_win32\os_spin.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\os\os_stat.c SOURCE=.\os_win32\os_stat.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -635,6 +662,26 @@ SOURCE=.\qam\qam_verify.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\rep\rep_method.c
# End Source File
# Begin Source File
SOURCE=.\rep\rep_record.c
# End Source File
# Begin Source File
SOURCE=.\rep\rep_region.c
# End Source File
# Begin Source File
SOURCE=.\rep\rep_util.c
# End Source File
# Begin Source File
SOURCE=.\hmac\sha1.c
# End Source File
# Begin Source File
SOURCE=.\clib\strcasecmp.c SOURCE=.\clib\strcasecmp.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -647,14 +694,30 @@ SOURCE=.\txn\txn_auto.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\txn\txn_method.c
# End Source File
# Begin Source File
SOURCE=.\txn\txn_rec.c SOURCE=.\txn\txn_rec.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\txn\txn_recover.c
# End Source File
# Begin Source File
SOURCE=.\txn\txn_region.c SOURCE=.\txn\txn_region.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\txn\txn_stat.c
# End Source File
# Begin Source File
SOURCE=.\txn\txn_util.c
# End Source File
# Begin Source File
SOURCE=.\common\util_log.c SOURCE=.\common\util_log.c
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@ -566,4 +566,3 @@ Package=<3>
}}} }}}
############################################################################### ###############################################################################

View File

@ -25,7 +25,7 @@ CFG=mysqlclient - Win32 Debug
# PROP AllowPerConfigDependencies 0 # PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName "" # PROP Scc_ProjName ""
# PROP Scc_LocalPath "" # PROP Scc_LocalPath ""
CPP=cl.exe CPP=xicl6.exe
RSC=rc.exe RSC=rc.exe
!IF "$(CFG)" == "mysqlclient - Win32 Release" !IF "$(CFG)" == "mysqlclient - Win32 Release"
@ -48,7 +48,7 @@ RSC=rc.exe
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LIB32=link.exe -lib LIB32=xilink6.exe -lib
# ADD BASE LIB32 /nologo # ADD BASE LIB32 /nologo
# ADD LIB32 /nologo /out:"..\lib_release\mysqlclient.lib" # ADD LIB32 /nologo /out:"..\lib_release\mysqlclient.lib"
@ -72,7 +72,7 @@ LIB32=link.exe -lib
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LIB32=link.exe -lib LIB32=xilink6.exe -lib
# ADD BASE LIB32 /nologo # ADD BASE LIB32 /nologo
# ADD LIB32 /nologo /out:"..\lib_debug\mysqlclient.lib" # ADD LIB32 /nologo /out:"..\lib_debug\mysqlclient.lib"
@ -382,7 +382,7 @@ SOURCE=..\mysys\my_thr_init.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\mysys\my_vsnprintf.c SOURCE=..\strings\my_vsnprintf.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -490,6 +490,10 @@ SOURCE=..\strings\strxmov.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\strings\strxnmov.c
# End Source File
# Begin Source File
SOURCE=..\mysys\thr_mutex.c SOURCE=..\mysys\thr_mutex.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -512,5 +516,9 @@ SOURCE=..\vio\viossl.c
SOURCE=..\vio\viosslfactories.c SOURCE=..\vio\viosslfactories.c
# End Source File # End Source File
# Begin Source File
SOURCE=..\strings\xml.c
# End Source File
# End Target # End Target
# End Project # End Project

View File

@ -26,4 +26,3 @@ Package=<3>
}}} }}}
############################################################################### ###############################################################################

View File

@ -38,4 +38,3 @@ Package=<3>
}}} }}}
############################################################################### ###############################################################################

View File

@ -38,4 +38,3 @@ Package=<3>
}}} }}}
############################################################################### ###############################################################################

View File

@ -26,4 +26,3 @@ Package=<3>
}}} }}}
############################################################################### ###############################################################################

View File

@ -27,7 +27,7 @@ CFG=INNOBASE - WIN32 RELEASE
# PROP AllowPerConfigDependencies 0 # PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName "" # PROP Scc_ProjName ""
# PROP Scc_LocalPath "" # PROP Scc_LocalPath ""
CPP=cl.exe CPP=xicl6.exe
RSC=rc.exe RSC=rc.exe
!IF "$(CFG)" == "innobase - Win32 Debug" !IF "$(CFG)" == "innobase - Win32 Debug"
@ -43,14 +43,14 @@ RSC=rc.exe
# PROP Intermediate_Dir "debug" # PROP Intermediate_Dir "debug"
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /G6 /MT /W3 /GX /O2 /I "../innobase/include" /D "NDEBUG" /D "_LIB" /D "_WIN32" /D "__NT__" /D "WIN32" /D "_MBCS" /YX /FD /c # ADD BASE CPP /nologo /G6 /MT /W3 /GX /O2 /I "../innobase/include" /D "NDEBUG" /D "_LIB" /D "_WIN32" /D "__NT__" /D "WIN32" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /G6 /MTd /W3 /GX /Z7 /O2 /I "../innobase/include" /I "../include" /D "NDEBUG" /D "_LIB" /D "_WIN32" /D "__NT__" /D "WIN32" /D "_MBCS" /D "MYSQL_SERVER" /FD /c # ADD CPP /nologo /G6 /MTd /W3 /GX /Z7 /O2 /I "../innobase/include" /I "../include" /D "NDEBUG" /D "_LIB" /D "_WIN32" /D "WIN32" /D "_MBCS" /D "MYSQL_SERVER" /FD /c
# SUBTRACT CPP /YX # SUBTRACT CPP /YX
# ADD BASE RSC /l 0x416 /d "NDEBUG" # ADD BASE RSC /l 0x416 /d "NDEBUG"
# ADD RSC /l 0x416 /d "NDEBUG" # ADD RSC /l 0x416 /d "NDEBUG"
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LIB32=link.exe -lib LIB32=xilink6.exe -lib
# ADD BASE LIB32 /nologo /out:"..\lib_release\innobase-nt.lib" # ADD BASE LIB32 /nologo /out:"..\lib_release\innobase-nt.lib"
# ADD LIB32 /nologo /out:"..\lib_debug\innodb.lib" # ADD LIB32 /nologo /out:"..\lib_debug\innodb.lib"
@ -74,7 +74,7 @@ LIB32=link.exe -lib
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LIB32=link.exe -lib LIB32=xilink6.exe -lib
# ADD BASE LIB32 /nologo /out:"..\lib_release\innodb.lib" # ADD BASE LIB32 /nologo /out:"..\lib_release\innodb.lib"
# ADD LIB32 /nologo /out:"..\lib_release\innodb.lib" # ADD LIB32 /nologo /out:"..\lib_release\innodb.lib"
@ -98,7 +98,7 @@ LIB32=link.exe -lib
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LIB32=link.exe -lib LIB32=xilink6.exe -lib
# ADD BASE LIB32 /nologo /out:"..\lib_release\innodb.lib" # ADD BASE LIB32 /nologo /out:"..\lib_release\innodb.lib"
# ADD LIB32 /nologo /out:"..\lib_release\innodb.lib" # ADD LIB32 /nologo /out:"..\lib_release\innodb.lib"
@ -122,7 +122,7 @@ LIB32=link.exe -lib
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LIB32=link.exe -lib LIB32=xilink6.exe -lib
# ADD BASE LIB32 /nologo /out:"..\lib_release\innodb.lib" # ADD BASE LIB32 /nologo /out:"..\lib_release\innodb.lib"
# ADD LIB32 /nologo /out:"..\lib_release\innodb.lib" # ADD LIB32 /nologo /out:"..\lib_release\innodb.lib"

View File

@ -26,4 +26,3 @@ Package=<3>
}}} }}}
############################################################################### ###############################################################################

View File

@ -26,4 +26,3 @@ Package=<3>
}}} }}}
############################################################################### ###############################################################################

View File

@ -26,4 +26,3 @@ Package=<3>
}}} }}}
############################################################################### ###############################################################################

View File

@ -26,4 +26,3 @@ Package=<3>
}}} }}}
############################################################################### ###############################################################################

View File

@ -797,4 +797,3 @@ Package=<3>
}}} }}}
############################################################################### ###############################################################################

View File

@ -25,7 +25,7 @@ CFG=mysqldemb - Win32 Debug
# PROP AllowPerConfigDependencies 0 # PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName "" # PROP Scc_ProjName ""
# PROP Scc_LocalPath "" # PROP Scc_LocalPath ""
CPP=cl.exe CPP=xicl6.exe
RSC=rc.exe RSC=rc.exe
!IF "$(CFG)" == "mysqldemb - Win32 Release" !IF "$(CFG)" == "mysqldemb - Win32 Release"
@ -41,14 +41,14 @@ RSC=rc.exe
# PROP Intermediate_Dir "Release" # PROP Intermediate_Dir "Release"
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
# ADD CPP /nologo /MT /W3 /O2 /I "../include" /I "../regex" /I "../sql" /I "../bdb/build_win32" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "USE_SYMDIR" /D "SIGNAL_WITH_VIO_CLOSE" /D "HAVE_DLOPEN" /D "EMBEDDED_LIBRARY" /D "MYSQL_SERVER" /D "HAVE_INNOBASE_DB" /D "DBUG_OFF" /D "USE_TLS" /D "__WIN__" /FD /c # ADD CPP /nologo /MT /W3 /O2 /I "../include" /I "../regex" /I "../sql" /I "../bdb/build_win32" /I "../zlib" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "USE_SYMDIR" /D "SIGNAL_WITH_VIO_CLOSE" /D "HAVE_DLOPEN" /D "EMBEDDED_LIBRARY" /D "MYSQL_SERVER" /D "HAVE_INNOBASE_DB" /D "DBUG_OFF" /D "USE_TLS" /D "__WIN__" /FD /c
# SUBTRACT CPP /YX # SUBTRACT CPP /YX
# ADD BASE RSC /l 0x416 /d "NDEBUG" # ADD BASE RSC /l 0x416 /d "NDEBUG"
# ADD RSC /l 0x416 /d "NDEBUG" # ADD RSC /l 0x416 /d "NDEBUG"
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LIB32=link.exe -lib LIB32=xilink6.exe -lib
# ADD BASE LIB32 /nologo # ADD BASE LIB32 /nologo
# ADD LIB32 /nologo # ADD LIB32 /nologo
@ -65,14 +65,14 @@ LIB32=link.exe -lib
# PROP Intermediate_Dir "Debug" # PROP Intermediate_Dir "Debug"
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /Zi /Od /I "../include" /I "../regex" /I "../sql" /I "../bdb/build_win32" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "USE_SYMDIR" /D "SIGNAL_WITH_VIO_CLOSE" /D "HAVE_DLOPEN" /D "EMBEDDED_LIBRARY" /D "MYSQL_SERVER" /D "HAVE_INNOBASE_DB" /D "USE_TLS" /D "__WIN__" /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /Zi /Od /I "../zlib" /I "../include" /I "../regex" /I "../sql" /I "../bdb/build_win32" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "USE_SYMDIR" /D "SIGNAL_WITH_VIO_CLOSE" /D "HAVE_DLOPEN" /D "EMBEDDED_LIBRARY" /D "MYSQL_SERVER" /D "HAVE_INNOBASE_DB" /D "USE_TLS" /D "__WIN__" /FD /GZ /c
# SUBTRACT CPP /YX # SUBTRACT CPP /YX
# ADD BASE RSC /l 0x416 /d "_DEBUG" # ADD BASE RSC /l 0x416 /d "_DEBUG"
# ADD RSC /l 0x416 /d "_DEBUG" # ADD RSC /l 0x416 /d "_DEBUG"
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LIB32=link.exe -lib LIB32=xilink6.exe -lib
# ADD BASE LIB32 /nologo # ADD BASE LIB32 /nologo
# ADD LIB32 /nologo # ADD LIB32 /nologo
@ -168,10 +168,18 @@ SOURCE=..\sql\item_func.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\sql\item_row.cpp
# End Source File
# Begin Source File
SOURCE=..\sql\item_strfunc.cpp SOURCE=..\sql\item_strfunc.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\sql\item_subselect.cpp
# End Source File
# Begin Source File
SOURCE=..\sql\item_sum.cpp SOURCE=..\sql\item_sum.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -216,10 +224,6 @@ SOURCE=..\sql\mini_client.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\sql\net_pkg.cpp
# End Source File
# Begin Source File
SOURCE=..\sql\net_serv.cpp SOURCE=..\sql\net_serv.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -244,6 +248,10 @@ SOURCE=..\sql\procedure.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\sql\protocol.cpp
# End Source File
# Begin Source File
SOURCE=..\sql\records.cpp SOURCE=..\sql\records.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -288,10 +296,18 @@ SOURCE=..\sql\sql_delete.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\sql\sql_derived.cpp
# End Source File
# Begin Source File
SOURCE=..\sql\sql_do.cpp SOURCE=..\sql\sql_do.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\sql\sql_error.cpp
# End Source File
# Begin Source File
SOURCE=..\sql\sql_handler.cpp SOURCE=..\sql\sql_handler.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -320,6 +336,10 @@ SOURCE=..\sql\sql_parse.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\sql\sql_prepare.cpp
# End Source File
# Begin Source File
SOURCE=..\sql\sql_rename.cpp SOURCE=..\sql\sql_rename.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@ -26,4 +26,3 @@ Package=<3>
}}} }}}
############################################################################### ###############################################################################

View File

@ -26,7 +26,7 @@ CFG=mysys - Win32 Debug
# PROP AllowPerConfigDependencies 0 # PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName "" # PROP Scc_ProjName ""
# PROP Scc_LocalPath "" # PROP Scc_LocalPath ""
CPP=cl.exe CPP=xicl6.exe
RSC=rc.exe RSC=rc.exe
!IF "$(CFG)" == "mysys - Win32 Release" !IF "$(CFG)" == "mysys - Win32 Release"
@ -49,7 +49,7 @@ RSC=rc.exe
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LIB32=link.exe -lib LIB32=xilink6.exe -lib
# ADD BASE LIB32 /nologo # ADD BASE LIB32 /nologo
# ADD LIB32 /nologo /out:"..\lib_release\mysys.lib" # ADD LIB32 /nologo /out:"..\lib_release\mysys.lib"
@ -73,7 +73,7 @@ LIB32=link.exe -lib
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LIB32=link.exe -lib LIB32=xilink6.exe -lib
# ADD BASE LIB32 /nologo # ADD BASE LIB32 /nologo
# ADD LIB32 /nologo /out:"..\lib_debug\mysys.lib" # ADD LIB32 /nologo /out:"..\lib_debug\mysys.lib"
@ -98,7 +98,7 @@ LIB32=link.exe -lib
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LIB32=link.exe -lib LIB32=xilink6.exe -lib
# ADD BASE LIB32 /nologo /out:"..\lib_release\mysys.lib" # ADD BASE LIB32 /nologo /out:"..\lib_release\mysys.lib"
# ADD LIB32 /nologo /out:"..\lib_release\mysys-max.lib" # ADD LIB32 /nologo /out:"..\lib_release\mysys-max.lib"
@ -434,10 +434,6 @@ SOURCE=.\my_thr_init.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\my_vsnprintf.c
# End Source File
# Begin Source File
SOURCE=.\my_wincond.c SOURCE=.\my_wincond.c
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@ -26,4 +26,3 @@ Package=<3>
}}} }}}
############################################################################### ###############################################################################

View File

@ -26,4 +26,3 @@ Package=<3>
}}} }}}
############################################################################### ###############################################################################

View File

@ -28,7 +28,7 @@ CFG=mysqld - Win32 Release
# PROP AllowPerConfigDependencies 0 # PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName "" # PROP Scc_ProjName ""
# PROP Scc_LocalPath "" # PROP Scc_LocalPath ""
CPP=cl.exe CPP=xicl6.exe
RSC=rc.exe RSC=rc.exe
!IF "$(CFG)" == "mysqld - Win32 Release" !IF "$(CFG)" == "mysqld - Win32 Release"
@ -52,7 +52,7 @@ RSC=rc.exe
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LINK32=link.exe LINK32=xilink6.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\vio.lib ..\lib_release\isam.lib ..\lib_release\merge.lib ..\lib_release\mysys.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../client_release/mysqld-opt.exe" # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\vio.lib ..\lib_release\isam.lib ..\lib_release\merge.lib ..\lib_release\mysys.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../client_release/mysqld-opt.exe"
# SUBTRACT LINK32 /debug # SUBTRACT LINK32 /debug
@ -78,7 +78,7 @@ LINK32=link.exe
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LINK32=link.exe LINK32=xilink6.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_debug\dbug.lib ..\lib_debug\vio.lib ..\lib_debug\isam.lib ..\lib_debug\merge.lib ..\lib_debug\mysys.lib ..\lib_debug\strings.lib ..\lib_debug\regex.lib ..\lib_debug\heap.lib ..\lib_debug\bdb.lib ..\lib_debug\innodb.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../client_debug/mysqld.exe" /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_debug\dbug.lib ..\lib_debug\vio.lib ..\lib_debug\isam.lib ..\lib_debug\merge.lib ..\lib_debug\mysys.lib ..\lib_debug\strings.lib ..\lib_debug\regex.lib ..\lib_debug\heap.lib ..\lib_debug\bdb.lib ..\lib_debug\innodb.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../client_debug/mysqld.exe" /pdbtype:sept
@ -105,7 +105,7 @@ LINK32=link.exe
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LINK32=link.exe LINK32=xilink6.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\dbug.lib ..\lib_release\isam.lib ..\lib_release\merge.lib ..\lib_release\mysys.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib /nologo /subsystem:console /debug /machine:I386 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\dbug.lib ..\lib_release\isam.lib ..\lib_release\merge.lib ..\lib_release\mysys.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib /nologo /subsystem:console /debug /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\vio.lib ..\lib_release\isam.lib ..\lib_release\merge.lib ..\lib_release\myisam.lib ..\lib_release\myisammrg.lib ..\lib_release\mysys.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib ..\lib_release\innodb.lib ..\lib_release\zlib.lib /nologo /subsystem:console /map /machine:I386 /out:"../client_release/mysqld-nt.exe" # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\vio.lib ..\lib_release\isam.lib ..\lib_release\merge.lib ..\lib_release\myisam.lib ..\lib_release\myisammrg.lib ..\lib_release\mysys.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib ..\lib_release\innodb.lib ..\lib_release\zlib.lib /nologo /subsystem:console /map /machine:I386 /out:"../client_release/mysqld-nt.exe"
# SUBTRACT LINK32 /pdb:none /debug # SUBTRACT LINK32 /pdb:none /debug
@ -133,7 +133,7 @@ LINK32=link.exe
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LINK32=link.exe LINK32=xilink6.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\isam.lib ..\lib_release\merge.lib ..\lib_release\myisam.lib ..\lib_release\myisammrg.lib ..\lib_release\mysys.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib ..\lib_release\zlib.lib /nologo /subsystem:console /map /machine:I386 /out:"../client_release/mysqld-nt.exe" # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\isam.lib ..\lib_release\merge.lib ..\lib_release\myisam.lib ..\lib_release\myisammrg.lib ..\lib_release\mysys.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib ..\lib_release\zlib.lib /nologo /subsystem:console /map /machine:I386 /out:"../client_release/mysqld-nt.exe"
# SUBTRACT BASE LINK32 /pdb:none /debug # SUBTRACT BASE LINK32 /pdb:none /debug
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\vio.lib ..\lib_release\isam.lib ..\lib_release\merge.lib ..\lib_release\myisam.lib ..\lib_release\myisammrg.lib ..\lib_release\mysys-max.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib ..\lib_release\zlib.lib ..\lib_release\innodb.lib ..\lib_release\bdb.lib /nologo /subsystem:console /map /machine:I386 /out:"../client_release/mysqld-max-nt.exe" # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\vio.lib ..\lib_release\isam.lib ..\lib_release\merge.lib ..\lib_release\myisam.lib ..\lib_release\myisammrg.lib ..\lib_release\mysys-max.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib ..\lib_release\zlib.lib ..\lib_release\innodb.lib ..\lib_release\bdb.lib /nologo /subsystem:console /map /machine:I386 /out:"../client_release/mysqld-max-nt.exe"
@ -162,7 +162,7 @@ LINK32=link.exe
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LINK32=link.exe LINK32=xilink6.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\isam.lib ..\lib_release\merge.lib ..\lib_release\mysys.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib /nologo /subsystem:console /pdb:none /debug /machine:I386 /out:"../client_release/mysqld-opt.exe" # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\isam.lib ..\lib_release\merge.lib ..\lib_release\mysys.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib /nologo /subsystem:console /pdb:none /debug /machine:I386 /out:"../client_release/mysqld-opt.exe"
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\vio.lib ..\lib_release\isam.lib ..\lib_release\merge.lib ..\lib_release\myisam.lib ..\lib_release\myisammrg.lib ..\lib_release\mysys-max.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib ..\lib_release\innodb.lib ..\lib_release\bdb.lib ..\lib_release\zlib.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../client_release/mysqld-max.exe" # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\vio.lib ..\lib_release\isam.lib ..\lib_release\merge.lib ..\lib_release\myisam.lib ..\lib_release\myisammrg.lib ..\lib_release\mysys-max.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib ..\lib_release\innodb.lib ..\lib_release\bdb.lib ..\lib_release\zlib.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../client_release/mysqld-max.exe"
# SUBTRACT LINK32 /debug # SUBTRACT LINK32 /debug
@ -464,8 +464,6 @@ SOURCE=.\item_func.cpp
!IF "$(CFG)" == "mysqld - Win32 Release" !IF "$(CFG)" == "mysqld - Win32 Release"
# ADD CPP /I "../zlib"
!ELSEIF "$(CFG)" == "mysqld - Win32 Debug" !ELSEIF "$(CFG)" == "mysqld - Win32 Debug"
# ADD CPP /G5 /I "../zlib" # ADD CPP /G5 /I "../zlib"
@ -662,6 +660,10 @@ SOURCE=.\mini_client.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\myisammrg\myrg_rnext_same.c
# End Source File
# Begin Source File
SOURCE=.\mysqld.cpp SOURCE=.\mysqld.cpp
!IF "$(CFG)" == "mysqld - Win32 Release" !IF "$(CFG)" == "mysqld - Win32 Release"
@ -779,6 +781,10 @@ SOURCE=.\procedure.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\protocol.cpp
# End Source File
# Begin Source File
SOURCE=.\records.cpp SOURCE=.\records.cpp
!IF "$(CFG)" == "mysqld - Win32 Release" !IF "$(CFG)" == "mysqld - Win32 Release"

View File

@ -26,4 +26,3 @@ Package=<3>
}}} }}}
############################################################################### ###############################################################################

View File

@ -26,4 +26,3 @@ Package=<3>
}}} }}}
############################################################################### ###############################################################################

View File

@ -26,4 +26,3 @@ Package=<3>
}}} }}}
############################################################################### ###############################################################################

View File

@ -26,4 +26,3 @@ Package=<3>
}}} }}}
############################################################################### ###############################################################################

View File

@ -26,4 +26,3 @@ Package=<3>
}}} }}}
############################################################################### ###############################################################################

View File

@ -25,7 +25,7 @@ CFG=strings - Win32 Debug
# PROP AllowPerConfigDependencies 0 # PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName "" # PROP Scc_ProjName ""
# PROP Scc_LocalPath "" # PROP Scc_LocalPath ""
CPP=cl.exe CPP=xicl6.exe
RSC=rc.exe RSC=rc.exe
!IF "$(CFG)" == "strings - Win32 Release" !IF "$(CFG)" == "strings - Win32 Release"
@ -48,7 +48,7 @@ RSC=rc.exe
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LIB32=link.exe -lib LIB32=xilink6.exe -lib
# ADD BASE LIB32 /nologo # ADD BASE LIB32 /nologo
# ADD LIB32 /nologo /out:"..\lib_release\strings.lib" # ADD LIB32 /nologo /out:"..\lib_release\strings.lib"
@ -72,7 +72,7 @@ LIB32=link.exe -lib
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LIB32=link.exe -lib LIB32=xilink6.exe -lib
# ADD BASE LIB32 /nologo # ADD BASE LIB32 /nologo
# ADD LIB32 /nologo /out:"..\lib_debug\strings.lib" # ADD LIB32 /nologo /out:"..\lib_debug\strings.lib"
@ -104,11 +104,11 @@ SOURCE=.\bmove512.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=".\ctype-bin.c" SOURCE=".\ctype-big5.c"
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=".\ctype-big5.c" SOURCE=".\ctype-bin.c"
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -132,6 +132,10 @@ SOURCE=".\ctype-latin1_de.c"
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=".\ctype-mb.c"
# End Source File
# Begin Source File
SOURCE=".\ctype-simple.c" SOURCE=".\ctype-simple.c"
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -148,6 +152,14 @@ SOURCE=".\ctype-ujis.c"
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=".\ctype-utf8.c"
# End Source File
# Begin Source File
SOURCE=".\ctype-win1250ch.c"
# End Source File
# Begin Source File
SOURCE=.\ctype.c SOURCE=.\ctype.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -164,6 +176,10 @@ SOURCE=.\longlong2str.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\my_vsnprintf.c
# End Source File
# Begin Source File
SOURCE=.\r_strinstr.c SOURCE=.\r_strinstr.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -172,18 +188,6 @@ SOURCE=.\str2int.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\strcend.c
# End Source File
# Begin Source File
SOURCE=.\strend.c
# End Source File
# Begin Source File
SOURCE=.\strfill.c
# End Source File
# Begin Source File
SOURCE=.\Strings.asm SOURCE=.\Strings.asm
!IF "$(CFG)" == "strings - Win32 Release" !IF "$(CFG)" == "strings - Win32 Release"
@ -215,19 +219,6 @@ InputName=Strings
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\strmake.c
# End Source File
# Begin Source File
SOURCE=.\strmov.c
# End Source File
# Begin Source File
SOURCE=.\strnmov.c
# End Source File
# Begin Source File
SOURCE=.\strtol.c SOURCE=.\strtol.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -277,5 +268,9 @@ InputName=Strxmov
SOURCE=.\strxnmov.c SOURCE=.\strxnmov.c
# End Source File # End Source File
# Begin Source File
SOURCE=.\xml.c
# End Source File
# End Target # End Target
# End Project # End Project

View File

@ -26,4 +26,3 @@ Package=<3>
}}} }}}
############################################################################### ###############################################################################

View File

@ -1,9 +1,51 @@
Microsoft Developer Studio Workspace File, Format Version 6.00 Microsoft Developer Studio Workspace File, Format Version 5.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
############################################################################### ###############################################################################
Project: "build_all"=.\build_all.dsp - Package Owner=<4> Project: "DB_DLL"=.\db_dll.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Project: "DB_Static"=.\db_static.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Project: "db_archive"=.\db_archive.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name DB_DLL
End Project Dependency
Begin Project Dependency
Project_Dep_Name DB_Static
End Project Dependency
}}}
###############################################################################
Project: "db_buildall"=.\db_buildall.dsp - Package Owner=<4>
Package=<5> Package=<5>
{{{ {{{
@ -83,25 +125,6 @@ Package=<4>
Begin Project Dependency Begin Project Dependency
Project_Dep_Name excxx_tpcb Project_Dep_Name excxx_tpcb
End Project Dependency End Project Dependency
Begin Project Dependency
Project_Dep_Name db_lib
End Project Dependency
Begin Project Dependency
}}}
###############################################################################
Project: "db_archive"=.\db_archive.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name db_lib
End Project Dependency
}}} }}}
############################################################################### ###############################################################################
@ -115,7 +138,10 @@ Package=<5>
Package=<4> Package=<4>
{{{ {{{
Begin Project Dependency Begin Project Dependency
Project_Dep_Name db_lib Project_Dep_Name DB_DLL
End Project Dependency
Begin Project Dependency
Project_Dep_Name DB_Static
End Project Dependency End Project Dependency
}}} }}}
@ -132,18 +158,9 @@ Package=<4>
Begin Project Dependency Begin Project Dependency
Project_Dep_Name DB_DLL Project_Dep_Name DB_DLL
End Project Dependency End Project Dependency
}}} Begin Project Dependency
Project_Dep_Name DB_Static
############################################################################### End Project Dependency
Project: "db_dll"=.\db_dll.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}} }}}
############################################################################### ###############################################################################
@ -157,7 +174,10 @@ Package=<5>
Package=<4> Package=<4>
{{{ {{{
Begin Project Dependency Begin Project Dependency
Project_Dep_Name db_lib Project_Dep_Name DB_DLL
End Project Dependency
Begin Project Dependency
Project_Dep_Name DB_Static
End Project Dependency End Project Dependency
}}} }}}
@ -178,24 +198,6 @@ Package=<4>
############################################################################### ###############################################################################
Project: "db_lib"=.\db_lib.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name db_dll
End Project Dependency
Begin Project Dependency
Project_Dep_Name db_static
End Project Dependency
}}}
###############################################################################
Project: "db_load"=.\db_load.dsp - Package Owner=<4> Project: "db_load"=.\db_load.dsp - Package Owner=<4>
Package=<5> Package=<5>
@ -205,22 +207,10 @@ Package=<5>
Package=<4> Package=<4>
{{{ {{{
Begin Project Dependency Begin Project Dependency
Project_Dep_Name db_lib Project_Dep_Name DB_DLL
End Project Dependency End Project Dependency
}}}
###############################################################################
Project: "db_perf"=.\db_perf.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency Begin Project Dependency
Project_Dep_Name db_lib Project_Dep_Name DB_Static
End Project Dependency End Project Dependency
}}} }}}
@ -235,7 +225,10 @@ Package=<5>
Package=<4> Package=<4>
{{{ {{{
Begin Project Dependency Begin Project Dependency
Project_Dep_Name db_lib Project_Dep_Name DB_DLL
End Project Dependency
Begin Project Dependency
Project_Dep_Name DB_Static
End Project Dependency End Project Dependency
}}} }}}
@ -250,7 +243,10 @@ Package=<5>
Package=<4> Package=<4>
{{{ {{{
Begin Project Dependency Begin Project Dependency
Project_Dep_Name db_lib Project_Dep_Name DB_DLL
End Project Dependency
Begin Project Dependency
Project_Dep_Name DB_Static
End Project Dependency End Project Dependency
}}} }}}
@ -265,20 +261,11 @@ Package=<5>
Package=<4> Package=<4>
{{{ {{{
Begin Project Dependency Begin Project Dependency
Project_Dep_Name db_lib Project_Dep_Name DB_DLL
End Project Dependency
Begin Project Dependency
Project_Dep_Name DB_Static
End Project Dependency End Project Dependency
}}}
###############################################################################
Project: "db_static"=.\db_static.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}} }}}
############################################################################### ###############################################################################
@ -307,7 +294,7 @@ Package=<5>
Package=<4> Package=<4>
{{{ {{{
Begin Project Dependency Begin Project Dependency
Project_Dep_Name build_all Project_Dep_Name db_buildall
End Project Dependency End Project Dependency
Begin Project Dependency Begin Project Dependency
Project_Dep_Name db_tcl Project_Dep_Name db_tcl
@ -325,7 +312,10 @@ Package=<5>
Package=<4> Package=<4>
{{{ {{{
Begin Project Dependency Begin Project Dependency
Project_Dep_Name db_lib Project_Dep_Name DB_DLL
End Project Dependency
Begin Project Dependency
Project_Dep_Name DB_Static
End Project Dependency End Project Dependency
}}} }}}
@ -340,7 +330,10 @@ Package=<5>
Package=<4> Package=<4>
{{{ {{{
Begin Project Dependency Begin Project Dependency
Project_Dep_Name db_lib Project_Dep_Name DB_DLL
End Project Dependency
Begin Project Dependency
Project_Dep_Name DB_Static
End Project Dependency End Project Dependency
}}} }}}
@ -355,7 +348,10 @@ Package=<5>
Package=<4> Package=<4>
{{{ {{{
Begin Project Dependency Begin Project Dependency
Project_Dep_Name db_lib Project_Dep_Name DB_DLL
End Project Dependency
Begin Project Dependency
Project_Dep_Name DB_Static
End Project Dependency End Project Dependency
}}} }}}
@ -370,7 +366,10 @@ Package=<5>
Package=<4> Package=<4>
{{{ {{{
Begin Project Dependency Begin Project Dependency
Project_Dep_Name db_lib Project_Dep_Name DB_Static
End Project Dependency
Begin Project Dependency
Project_Dep_Name DB_DLL
End Project Dependency End Project Dependency
}}} }}}
@ -385,7 +384,10 @@ Package=<5>
Package=<4> Package=<4>
{{{ {{{
Begin Project Dependency Begin Project Dependency
Project_Dep_Name db_lib Project_Dep_Name DB_DLL
End Project Dependency
Begin Project Dependency
Project_Dep_Name DB_Static
End Project Dependency End Project Dependency
}}} }}}
@ -400,7 +402,10 @@ Package=<5>
Package=<4> Package=<4>
{{{ {{{
Begin Project Dependency Begin Project Dependency
Project_Dep_Name db_lib Project_Dep_Name DB_DLL
End Project Dependency
Begin Project Dependency
Project_Dep_Name DB_Static
End Project Dependency End Project Dependency
}}} }}}
@ -415,7 +420,10 @@ Package=<5>
Package=<4> Package=<4>
{{{ {{{
Begin Project Dependency Begin Project Dependency
Project_Dep_Name db_lib Project_Dep_Name DB_DLL
End Project Dependency
Begin Project Dependency
Project_Dep_Name DB_Static
End Project Dependency End Project Dependency
}}} }}}
@ -430,7 +438,10 @@ Package=<5>
Package=<4> Package=<4>
{{{ {{{
Begin Project Dependency Begin Project Dependency
Project_Dep_Name db_lib Project_Dep_Name DB_DLL
End Project Dependency
Begin Project Dependency
Project_Dep_Name DB_Static
End Project Dependency End Project Dependency
}}} }}}
@ -445,7 +456,10 @@ Package=<5>
Package=<4> Package=<4>
{{{ {{{
Begin Project Dependency Begin Project Dependency
Project_Dep_Name db_lib Project_Dep_Name DB_DLL
End Project Dependency
Begin Project Dependency
Project_Dep_Name DB_Static
End Project Dependency End Project Dependency
}}} }}}
@ -460,7 +474,10 @@ Package=<5>
Package=<4> Package=<4>
{{{ {{{
Begin Project Dependency Begin Project Dependency
Project_Dep_Name db_lib Project_Dep_Name DB_DLL
End Project Dependency
Begin Project Dependency
Project_Dep_Name DB_Static
End Project Dependency End Project Dependency
}}} }}}
@ -475,7 +492,10 @@ Package=<5>
Package=<4> Package=<4>
{{{ {{{
Begin Project Dependency Begin Project Dependency
Project_Dep_Name db_lib Project_Dep_Name DB_DLL
End Project Dependency
Begin Project Dependency
Project_Dep_Name DB_Static
End Project Dependency End Project Dependency
}}} }}}
@ -490,7 +510,10 @@ Package=<5>
Package=<4> Package=<4>
{{{ {{{
Begin Project Dependency Begin Project Dependency
Project_Dep_Name db_lib Project_Dep_Name DB_DLL
End Project Dependency
Begin Project Dependency
Project_Dep_Name DB_Static
End Project Dependency End Project Dependency
}}} }}}
@ -505,7 +528,10 @@ Package=<5>
Package=<4> Package=<4>
{{{ {{{
Begin Project Dependency Begin Project Dependency
Project_Dep_Name db_lib Project_Dep_Name DB_DLL
End Project Dependency
Begin Project Dependency
Project_Dep_Name DB_Static
End Project Dependency End Project Dependency
}}} }}}
@ -520,7 +546,10 @@ Package=<5>
Package=<4> Package=<4>
{{{ {{{
Begin Project Dependency Begin Project Dependency
Project_Dep_Name db_lib Project_Dep_Name DB_DLL
End Project Dependency
Begin Project Dependency
Project_Dep_Name DB_Static
End Project Dependency End Project Dependency
}}} }}}
@ -537,4 +566,3 @@ Package=<3>
}}} }}}
############################################################################### ###############################################################################

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2000-2002 MySQL AB /* Copyright (C) 2000-2003 MySQL AB
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
@ -80,8 +80,6 @@ extern "C" {
#if defined( __WIN__) || defined(OS2) #if defined( __WIN__) || defined(OS2)
#include <conio.h> #include <conio.h>
#else #else
// readline 4.2 has own __P
#undef __P
#include <readline/readline.h> #include <readline/readline.h>
#define HAVE_READLINE #define HAVE_READLINE
#endif #endif
@ -1443,7 +1441,7 @@ static int com_server_help(String *buffer __attribute__((unused)),
if (result) if (result)
{ {
int num_rows= mysql_num_rows(result); ulonglong num_rows= mysql_num_rows(result);
if (num_rows == 1) if (num_rows == 1)
{ {
if (!(cur= mysql_fetch_row(result))) if (!(cur= mysql_fetch_row(result)))

View File

@ -67,7 +67,8 @@ static void dump_remote_table(NET* net, const char* db, const char* table);
static void die(const char* fmt, ...); static void die(const char* fmt, ...);
static MYSQL* safe_connect(); static MYSQL* safe_connect();
class Load_log_processor { class Load_log_processor
{
char target_dir_name[MY_NFILE]; char target_dir_name[MY_NFILE];
int target_dir_name_len; int target_dir_name_len;
DYNAMIC_ARRAY file_names; DYNAMIC_ARRAY file_names;
@ -103,12 +104,10 @@ class Load_log_processor {
void append_to_file(const char* fname, int flags, void append_to_file(const char* fname, int flags,
gptr data, uint size) gptr data, uint size)
{ {
FILE *file; File file;
if(!(file= my_fopen(fname,flags,MYF(MY_WME)))) if ((file= my_open(fname,flags,MYF(MY_WME)) < 0) ||
exit(1); my_write(file,(byte*) data,size,MYF(MY_WME|MY_NABP)) ||
if (my_fwrite(file,data,size,MYF(MY_WME|MY_NABP))) my_close(file,MYF(MY_WME)))
exit(1);
if (my_fclose(file,MYF(MY_WME)))
exit(1); exit(1);
} }

View File

@ -0,0 +1,6 @@
## Process this file with automake to create Makefile.in
SUBDIRS= @readline_basedir@
# Don't update the files from bitkeeper
%::SCCS/s.%

View File

@ -2039,14 +2039,18 @@ mkdir include/readline
if [test "$with_libedit" = "yes"] || [test "$with_libedit" = "undefined"] && [test "$with_readline" = "undefined"] if [test "$with_libedit" = "yes"] || [test "$with_libedit" = "undefined"] && [test "$with_readline" = "undefined"]
then then
readline_dir="cmd-line-utils/libedit" readline_topdir="cmd-line-utils"
readline_basedir="libedit"
readline_dir="$readline_topdir/$readline_basedir"
readline_link="\$(top_builddir)/cmd-line-utils/libedit/liblibedit.a" readline_link="\$(top_builddir)/cmd-line-utils/libedit/liblibedit.a"
readline_h_ln_cmd="\$(LN) \$(top_builddir)/cmd-line-utils/libedit/readline/*.h readline/" readline_h_ln_cmd="\$(LN) \$(top_builddir)/cmd-line-utils/libedit/readline/*.h readline/"
compile_libedit=yes compile_libedit=yes
AC_DEFINE_UNQUOTED(USE_LIBEDIT_INTERFACE) AC_DEFINE_UNQUOTED(USE_LIBEDIT_INTERFACE)
elif test "$with_readline" = "yes" elif test "$with_readline" = "yes"
then then
readline_dir="cmd-line-utils/readline" readline_topdir="cmd-line-utils"
readline_basedir="readline"
readline_dir="$readline_topdir/$readline_basedir"
readline_link="\$(top_builddir)/cmd-line-utils/readline/libreadline.a" readline_link="\$(top_builddir)/cmd-line-utils/readline/libreadline.a"
readline_h_ln_cmd="\$(LN) \$(top_builddir)/cmd-line-utils/readline/*.h readline/" readline_h_ln_cmd="\$(LN) \$(top_builddir)/cmd-line-utils/readline/*.h readline/"
compile_readline=yes compile_readline=yes
@ -2056,16 +2060,19 @@ else
MYSQL_CHECK_NEW_RL_INTERFACE MYSQL_CHECK_NEW_RL_INTERFACE
if ["$mysql_cv_new_rl_interface"="yes"] || [test "$mysql_cv_libedit_interface"="no"] if ["$mysql_cv_new_rl_interface"="yes"] || [test "$mysql_cv_libedit_interface"="no"]
then then
readline_dir=""
readline_link="-lreadline" readline_link="-lreadline"
else else
readline_dir=""
readline_link="-ledit" readline_link="-ledit"
fi fi
readline_topdir=""
readline_basedir=""
readline_dir=""
readline_h_ln_cmd="" readline_h_ln_cmd=""
fi fi
AC_SUBST(readline_dir) AC_SUBST(readline_dir)
AC_SUBST(readline_topdir)
AC_SUBST(readline_basedir)
AC_SUBST(readline_link) AC_SUBST(readline_link)
AC_SUBST(readline_h_ln_cmd) AC_SUBST(readline_h_ln_cmd)
@ -2462,6 +2469,11 @@ then
AC_OUTPUT(cmd-line-utils/libedit/Makefile) AC_OUTPUT(cmd-line-utils/libedit/Makefile)
fi fi
if [test "$compile_libedit" = "yes"] || [test "$compile_readline" = "yes"]
then
AC_OUTPUT(cmd-line-utils/Makefile)
fi
AC_OUTPUT(Makefile extra/Makefile mysys/Makefile isam/Makefile \ AC_OUTPUT(Makefile extra/Makefile mysys/Makefile isam/Makefile \
strings/Makefile regex/Makefile heap/Makefile \ strings/Makefile regex/Makefile heap/Makefile \
bdb/Makefile \ bdb/Makefile \

View File

@ -20,6 +20,8 @@
static int check_one_key(HP_KEYDEF *keydef, uint keynr, ulong records, static int check_one_key(HP_KEYDEF *keydef, uint keynr, ulong records,
ulong blength, my_bool print_status); ulong blength, my_bool print_status);
static int check_one_rb_key(HP_INFO *info, uint keynr, ulong records,
my_bool print_status);
/* /*

View File

@ -262,6 +262,7 @@ inline double ulonglong2double(ulonglong value)
#define HAVE_ISAM /* We want to have support for ISAM in 4.0 */ #define HAVE_ISAM /* We want to have support for ISAM in 4.0 */
#define HAVE_QUERY_CACHE #define HAVE_QUERY_CACHE
#define SPRINTF_RETURNS_INT #define SPRINTF_RETURNS_INT
#define HAVE_VIO
#ifdef NOT_USED #ifdef NOT_USED
#define HAVE_SNPRINTF /* Gave link error */ #define HAVE_SNPRINTF /* Gave link error */

View File

@ -26,7 +26,6 @@
extern "C" { extern "C" {
#endif #endif
#define MY_CS_NAME_SIZE 32 #define MY_CS_NAME_SIZE 32
#define MY_CS_CTYPE_TABLE_SIZE 257 #define MY_CS_CTYPE_TABLE_SIZE 257
#define MY_CS_TO_LOWER_TABLE_SIZE 256 #define MY_CS_TO_LOWER_TABLE_SIZE 256
@ -38,7 +37,8 @@ extern "C" {
#define my_wc_t ulong #define my_wc_t ulong
typedef struct unicase_info_st { typedef struct unicase_info_st
{
uint16 toupper; uint16 toupper;
uint16 tolower; uint16 tolower;
uint16 sort; uint16 sort;
@ -66,7 +66,8 @@ typedef struct unicase_info_st {
#define MY_CHARSET_CURRENT (default_charset_info->number) #define MY_CHARSET_CURRENT (default_charset_info->number)
typedef struct my_uni_idx_st { typedef struct my_uni_idx_st
{
uint16 from; uint16 from;
uint16 to; uint16 to;
uchar *tab; uchar *tab;
@ -136,18 +137,27 @@ typedef struct charset_info_st
char max_sort_char; /* For LIKE optimization */ char max_sort_char; /* For LIKE optimization */
/* Charset dependant snprintf() */ /* Charset dependant snprintf() */
int (*snprintf)(struct charset_info_st *, char *to, uint n, const char *fmt, ...); int (*snprintf)(struct charset_info_st *, char *to, uint n, const char *fmt,
int (*long10_to_str)(struct charset_info_st *, char *to, uint n, int radix, long int val); ...);
int (*longlong10_to_str)(struct charset_info_st *, char *to, uint n, int radix, longlong val); int (*long10_to_str)(struct charset_info_st *, char *to, uint n, int radix,
long int val);
int (*longlong10_to_str)(struct charset_info_st *, char *to, uint n,
int radix, longlong val);
/* String-to-number convertion routines */ /* String-to-number convertion routines */
long (*strntol)(struct charset_info_st *, const char *s, uint l, int base, char **e, int *err); long (*strntol)(struct charset_info_st *, const char *s, uint l,
ulong (*strntoul)(struct charset_info_st *, const char *s, uint l, int base, char **e, int *err); int base, char **e, int *err);
longlong (*strntoll)(struct charset_info_st *, const char *s, uint l, int base, char **e, int *err); ulong (*strntoul)(struct charset_info_st *, const char *s, uint l,
ulonglong (*strntoull)(struct charset_info_st *, const char *s, uint l, int base, char **e, int *err); int base, char **e, int *err);
double (*strntod)(struct charset_info_st *, char *s, uint l, char **e, int *err); longlong (*strntoll)(struct charset_info_st *, const char *s, uint l,
int base, char **e, int *err);
ulonglong (*strntoull)(struct charset_info_st *, const char *s, uint l,
int base, char **e, int *err);
double (*strntod)(struct charset_info_st *, char *s, uint l, char **e,
int *err);
ulong (*scan)(struct charset_info_st *, const char *b, const char *e, int sq); ulong (*scan)(struct charset_info_st *, const char *b, const char *e,
int sq);
} CHARSET_INFO; } CHARSET_INFO;
@ -162,8 +172,10 @@ extern my_bool my_parse_charset_xml(const char *bug, uint len,
int (*add)(CHARSET_INFO *cs)); int (*add)(CHARSET_INFO *cs));
/* declarations for simple charsets */ /* declarations for simple charsets */
extern int my_strnxfrm_simple(CHARSET_INFO *, uchar *, uint, const uchar *, uint); extern int my_strnxfrm_simple(CHARSET_INFO *, uchar *, uint, const uchar *,
extern int my_strnncoll_simple(CHARSET_INFO *, const uchar *, uint, const uchar *, uint); uint);
extern int my_strnncoll_simple(CHARSET_INFO *, const uchar *, uint,
const uchar *, uint);
extern uint my_hash_caseup_simple(CHARSET_INFO *cs, extern uint my_hash_caseup_simple(CHARSET_INFO *cs,
const byte *key, uint len); const byte *key, uint len);
@ -181,23 +193,32 @@ extern void my_casedn_8bit(CHARSET_INFO *, char *, uint);
extern void my_tosort_8bit(CHARSET_INFO *, char *, uint); extern void my_tosort_8bit(CHARSET_INFO *, char *, uint);
extern int my_strcasecmp_8bit(CHARSET_INFO * cs, const char *, const char *); extern int my_strcasecmp_8bit(CHARSET_INFO * cs, const char *, const char *);
extern int my_strncasecmp_8bit(CHARSET_INFO * cs, const char *, const char *, uint); extern int my_strncasecmp_8bit(CHARSET_INFO * cs, const char *, const char *,
uint);
int my_mb_wc_8bit(CHARSET_INFO *cs,my_wc_t *wc, const uchar *s,const uchar *e); int my_mb_wc_8bit(CHARSET_INFO *cs,my_wc_t *wc, const uchar *s,const uchar *e);
int my_wc_mb_8bit(CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e); int my_wc_mb_8bit(CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e);
ulong my_scan_8bit(CHARSET_INFO *cs, const char *b, const char *e, int sq); ulong my_scan_8bit(CHARSET_INFO *cs, const char *b, const char *e, int sq);
int my_snprintf_8bit(struct charset_info_st *, char *to, uint n, const char *fmt, ...); int my_snprintf_8bit(struct charset_info_st *, char *to, uint n,
const char *fmt, ...);
long my_strntol_8bit(CHARSET_INFO *, const char *s, uint l, int base, char **e, int *err); long my_strntol_8bit(CHARSET_INFO *, const char *s, uint l, int base,
ulong my_strntoul_8bit(CHARSET_INFO *, const char *s, uint l, int base, char **e, int *err); char **e, int *err);
longlong my_strntoll_8bit(CHARSET_INFO *, const char *s, uint l, int base, char **e, int *err); ulong my_strntoul_8bit(CHARSET_INFO *, const char *s, uint l, int base,
ulonglong my_strntoull_8bit(CHARSET_INFO *, const char *s, uint l, int base, char **e, int *err); char **e, int *err);
double my_strntod_8bit(CHARSET_INFO *, char *s, uint l,char **e, int *err); longlong my_strntoll_8bit(CHARSET_INFO *, const char *s, uint l, int base,
char **e, int *err);
ulonglong my_strntoull_8bit(CHARSET_INFO *, const char *s, uint l, int base,
char **e, int *err);
double my_strntod_8bit(CHARSET_INFO *, char *s, uint l,char **e,
int *err);
int my_long10_to_str_8bit(CHARSET_INFO *, char *to, uint l, int radix, long int val); int my_long10_to_str_8bit(CHARSET_INFO *, char *to, uint l, int radix,
int my_longlong10_to_str_8bit(CHARSET_INFO *, char *to, uint l, int radix, longlong val); long int val);
int my_longlong10_to_str_8bit(CHARSET_INFO *, char *to, uint l, int radix,
longlong val);
my_bool my_like_range_simple(CHARSET_INFO *cs, my_bool my_like_range_simple(CHARSET_INFO *cs,
const char *ptr, uint ptr_length, const char *ptr, uint ptr_length,
@ -220,15 +241,14 @@ extern void my_casedn_str_mb(CHARSET_INFO *, char *);
extern void my_caseup_mb(CHARSET_INFO *, char *, uint); extern void my_caseup_mb(CHARSET_INFO *, char *, uint);
extern void my_casedn_mb(CHARSET_INFO *, char *, uint); extern void my_casedn_mb(CHARSET_INFO *, char *, uint);
extern int my_strcasecmp_mb(CHARSET_INFO * cs,const char *, const char *); extern int my_strcasecmp_mb(CHARSET_INFO * cs,const char *, const char *);
extern int my_strncasecmp_mb(CHARSET_INFO * cs,const char *, const char *t, uint); extern int my_strncasecmp_mb(CHARSET_INFO * cs,const char *, const char *t,
uint);
int my_wildcmp_mb(CHARSET_INFO *, int my_wildcmp_mb(CHARSET_INFO *,
const char *str,const char *str_end, const char *str,const char *str_end,
const char *wildstr,const char *wildend, const char *wildstr,const char *wildend,
int escape, int w_one, int w_many); int escape, int w_one, int w_many);
#endif #endif
#define _U 01 /* Upper case */ #define _U 01 /* Upper case */
#define _L 02 /* Lower case */ #define _L 02 /* Lower case */
#define _NMR 04 /* Numeral (digit) */ #define _NMR 04 /* Numeral (digit) */

View File

@ -43,6 +43,13 @@ typedef struct st_HA_KEYSEG /* Key-portion */
{ length=mi_uint2korr((key)+1); (key)+=3; } \ { length=mi_uint2korr((key)+1); (key)+=3; } \
} }
#define get_key_length_rdonly(length,key) \
{ if ((uchar) *(key) != 255) \
length= ((uint) (uchar) *((key))); \
else \
{ length=mi_uint2korr((key)+1); } \
}
#define get_key_pack_length(length,length_pack,key) \ #define get_key_pack_length(length,length_pack,key) \
{ if ((uchar) *(key) != 255) \ { if ((uchar) *(key) != 255) \
{ length= (uint) (uchar) *((key)++); length_pack=1; }\ { length= (uint) (uchar) *((key)++); length_pack=1; }\

View File

@ -32,8 +32,8 @@ extern LIST *list_add(LIST *root,LIST *element);
extern LIST *list_delete(LIST *root,LIST *element); extern LIST *list_delete(LIST *root,LIST *element);
extern LIST *list_cons(void *data,LIST *root); extern LIST *list_cons(void *data,LIST *root);
extern LIST *list_reverse(LIST *root); extern LIST *list_reverse(LIST *root);
extern void list_free(LIST *root,uint free_data); extern void list_free(LIST *root,unsigned int free_data);
extern uint list_length(LIST *list); extern unsigned int list_length(LIST *list);
extern int list_walk(LIST *list,list_walk_action action,gptr argument); extern int list_walk(LIST *list,list_walk_action action,gptr argument);
#define rest(a) ((a)->next) #define rest(a) ((a)->next)

View File

@ -342,6 +342,12 @@ typedef struct st_mi_check_param
char *op_name; char *op_name;
} MI_CHECK; } MI_CHECK;
typedef struct st_sort_ft_buf
{
uchar *buf, *end;
int count;
uchar lastkey[MI_MAX_KEY_BUFF];
} SORT_FT_BUF;
typedef struct st_sort_info typedef struct st_sort_info
{ {
@ -354,6 +360,7 @@ typedef struct st_sort_info
MI_CHECK *param; MI_CHECK *param;
char *buff; char *buff;
SORT_KEY_BLOCKS *key_block,*key_block_end; SORT_KEY_BLOCKS *key_block,*key_block_end;
SORT_FT_BUF *ft_buf;
/* sync things */ /* sync things */
uint got_error, threads_running; uint got_error, threads_running;
pthread_mutex_t mutex; pthread_mutex_t mutex;

View File

@ -473,17 +473,17 @@ enum PREP_STMT_STATE { MY_ST_UNKNOWN, MY_ST_PREPARE, MY_ST_EXECUTE };
/* bind structure */ /* bind structure */
typedef struct st_mysql_bind typedef struct st_mysql_bind
{ {
long *length; /* output length pointer */ unsigned long *length; /* output length pointer */
gptr buffer; /* buffer */ my_bool *is_null; /* Pointer to null indicators */
char *buffer; /* buffer to get/put data */
enum enum_field_types buffer_type; /* buffer type */ enum enum_field_types buffer_type; /* buffer type */
my_bool is_null; /* NULL indicator */ /* Must be set for string/blob data */
my_bool is_long_data; /* long data indicator */ unsigned long buffer_length; /* buffer length */
/* The following are for internal use. Set by mysql_bind_param */ /* The following are for internal use. Set by mysql_bind_param */
unsigned long buffer_length; /* buffer length */ unsigned long bind_length; /* Default length of data */
long bind_length; /* Default length of data */
my_bool long_ended; /* All data supplied for long */
unsigned int param_number; /* For null count and error messages */ unsigned int param_number; /* For null count and error messages */
my_bool long_data_used; /* If used with mysql_send_long_data */
void (*store_param_func)(NET *net, struct st_mysql_bind *param); void (*store_param_func)(NET *net, struct st_mysql_bind *param);
void (*fetch_result)(struct st_mysql_bind *, unsigned char **row); void (*fetch_result)(struct st_mysql_bind *, unsigned char **row);
} MYSQL_BIND; } MYSQL_BIND;
@ -499,20 +499,21 @@ typedef struct st_mysql_stmt
MYSQL_FIELD *fields; /* prepare meta info */ MYSQL_FIELD *fields; /* prepare meta info */
LIST list; /* list to keep track of all stmts */ LIST list; /* list to keep track of all stmts */
char *query; /* query buffer */ char *query; /* query buffer */
char *buffer; /* buffer to hold results */
MEM_ROOT mem_root; /* root allocations */ MEM_ROOT mem_root; /* root allocations */
MYSQL_RES tmp_result; /* Used by mysql_prepare_result */ MYSQL_RES tmp_result; /* Used by mysql_prepare_result */
unsigned long param_count; /* parameters count */ unsigned long param_count; /* parameters count */
unsigned long field_count; /* fields count */ unsigned long field_count; /* fields count */
unsigned long long_length; /* long buffer alloced length */ unsigned long buffer_length; /* long buffer alloced length */
unsigned long stmt_id; /* Id for prepared statement */ unsigned long stmt_id; /* Id for prepared statement */
unsigned int last_errno; /* error code */ unsigned int last_errno; /* error code */
enum PREP_STMT_STATE state; /* statement state */ enum PREP_STMT_STATE state; /* statement state */
char last_error[MYSQL_ERRMSG_SIZE]; /* error message */ char last_error[MYSQL_ERRMSG_SIZE]; /* error message */
my_bool long_alloced; /* flag to indicate long alloced */ my_bool long_alloced; /* flag to indicate long alloced */
my_bool send_types_to_server; /* to indicate types supply to server */ my_bool send_types_to_server; /* Types sent to server */
my_bool param_buffers; /* to indicate the param bound buffers */ my_bool param_buffers; /* param bound buffers */
my_bool res_buffers; /* to indicate the output bound buffers */ my_bool res_buffers; /* output bound buffers */
my_bool result_buffered; /* to indicate the results buffered */ my_bool result_buffered; /* Results buffered */
} MYSQL_STMT; } MYSQL_STMT;
@ -532,10 +533,7 @@ int STDCALL mysql_fetch(MYSQL_STMT *stmt);
my_bool STDCALL mysql_send_long_data(MYSQL_STMT *stmt, my_bool STDCALL mysql_send_long_data(MYSQL_STMT *stmt,
unsigned int param_number, unsigned int param_number,
const char *data, const char *data,
unsigned long length, unsigned long length);
my_bool last_data);
int STDCALL mysql_multi_query(MYSQL *mysql,const char *query,
unsigned long len);
MYSQL_RES *STDCALL mysql_prepare_result(MYSQL_STMT *stmt); MYSQL_RES *STDCALL mysql_prepare_result(MYSQL_STMT *stmt);
my_ulonglong STDCALL mysql_stmt_affected_rows(MYSQL_STMT *stmt); my_ulonglong STDCALL mysql_stmt_affected_rows(MYSQL_STMT *stmt);
int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt); int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt);
@ -549,8 +547,6 @@ my_bool STDCALL mysql_next_result(MYSQL *mysql);
#define MYSQL_STATUS_ERROR 1 #define MYSQL_STATUS_ERROR 1
#define MYSQL_NO_DATA 100 #define MYSQL_NO_DATA 100
#define MYSQL_NEED_DATA 99 #define MYSQL_NEED_DATA 99
#define MYSQL_NULL_DATA (-1)
#define MYSQL_LONG_DATA (-2)
#define mysql_reload(mysql) mysql_refresh((mysql),REFRESH_GRANT) #define mysql_reload(mysql) mysql_refresh((mysql),REFRESH_GRANT)

View File

@ -216,6 +216,7 @@ enum SSL_type
SSL_TYPE_SPECIFIED SSL_TYPE_SPECIFIED
}; };
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
/* This structure is for every connection on both sides */ /* This structure is for every connection on both sides */
struct st_vio struct st_vio
@ -233,7 +234,7 @@ struct st_vio
void (*viodelete)(Vio*); void (*viodelete)(Vio*);
int (*vioerrno)(Vio*); int (*vioerrno)(Vio*);
int (*read)(Vio*, gptr, int); int (*read)(Vio*, gptr, int);
int (*write)(Vio*, gptr, int); int (*write)(Vio*, const gptr, int);
int (*vioblocking)(Vio*, my_bool, my_bool *); int (*vioblocking)(Vio*, my_bool, my_bool *);
my_bool (*is_blocking)(Vio*); my_bool (*is_blocking)(Vio*);
int (*viokeepalive)(Vio*, my_bool); int (*viokeepalive)(Vio*, my_bool);

View File

@ -2181,6 +2181,7 @@ dict_skip_word(
/************************************************************************* /*************************************************************************
Returns the number of opening brackets '(' subtracted by the number Returns the number of opening brackets '(' subtracted by the number
of closing brackets ')' between string and ptr. */ of closing brackets ')' between string and ptr. */
#ifdef NOT_USED
static static
int int
dict_bracket_count( dict_bracket_count(
@ -2204,7 +2205,7 @@ dict_bracket_count(
return(count); return(count);
} }
#endif
/************************************************************************* /*************************************************************************
Scans a table create SQL string and adds to the data dictionary the foreign Scans a table create SQL string and adds to the data dictionary the foreign
key constraints declared in the string. This function should be called after key constraints declared in the string. This function should be called after

View File

@ -456,7 +456,7 @@ dict_load_indexes(
ut_ad(len == 8); ut_ad(len == 8);
id = mach_read_from_8(field); id = mach_read_from_8(field);
ut_a(0 == ut_strcmp("NAME", ut_a(0 == ut_strcmp((void*) "NAME",
dict_field_get_col( dict_field_get_col(
dict_index_get_nth_field( dict_index_get_nth_field(
dict_table_get_first_index(sys_indexes), 4))->name)); dict_table_get_first_index(sys_indexes), 4))->name));
@ -515,7 +515,7 @@ dict_load_indexes(
&& ((type & DICT_CLUSTERED) && ((type & DICT_CLUSTERED)
|| ((table == dict_sys->sys_tables) || ((table == dict_sys->sys_tables)
&& (name_len == ut_strlen("ID_IND")) && (name_len == ut_strlen("ID_IND"))
&& (0 == ut_memcmp(name_buf, "ID_IND", && (0 == ut_memcmp(name_buf, (void*) "ID_IND",
name_len))))) { name_len))))) {
/* The index was created in memory already in /* The index was created in memory already in

View File

@ -16,7 +16,7 @@ typedef void* os_process_t;
typedef unsigned long int os_process_id_t; typedef unsigned long int os_process_id_t;
/* The cell type in os_awe_allocate_mem page info */ /* The cell type in os_awe_allocate_mem page info */
#ifdef __NT__ #if defined(__NT__) && defined(ULONG_PTR)
typedef ULONG_PTR os_awe_t; typedef ULONG_PTR os_awe_t;
#else #else
typedef ulint os_awe_t; typedef ulint os_awe_t;

View File

@ -189,12 +189,12 @@ os_awe_allocate_physical_mem(
#elif defined(__NT__) #elif defined(__NT__)
BOOL bResult; BOOL bResult;
ULONG_PTR NumberOfPages; /* Question: why does Windows os_awe_t NumberOfPages; /* Question: why does Windows
use the name ULONG_PTR for use the name ULONG_PTR for
a scalar integer type? Maybe a scalar integer type? Maybe
because we may also refer to because we may also refer to
&NumberOfPages? */ &NumberOfPages? */
ULONG_PTR NumberOfPagesInitial; os_awe_t NumberOfPagesInitial;
SYSTEM_INFO sSysInfo; SYSTEM_INFO sSysInfo;
int PFNArraySize; int PFNArraySize;
@ -224,9 +224,9 @@ os_awe_allocate_physical_mem(
/* Calculate the size of page_info for allocated physical pages */ /* Calculate the size of page_info for allocated physical pages */
PFNArraySize = NumberOfPages * sizeof(ULONG_PTR); PFNArraySize = NumberOfPages * sizeof(os_awe_t);
*page_info = (ULONG_PTR*)HeapAlloc(GetProcessHeap(), 0, PFNArraySize); *page_info = (os_awe_t*)HeapAlloc(GetProcessHeap(), 0, PFNArraySize);
if (*page_info == NULL) { if (*page_info == NULL) {
fprintf(stderr, fprintf(stderr,
@ -426,9 +426,9 @@ os_awe_map_physical_mem_to_window(
#elif defined(__NT__) #elif defined(__NT__)
BOOL bResult; BOOL bResult;
ULONG_PTR n_pages; os_awe_t n_pages;
n_pages = (ULONG_PTR)n_mem_pages; n_pages = (os_awe_t)n_mem_pages;
if (!(ptr >= os_awe_window)) { if (!(ptr >= os_awe_window)) {
fprintf(stderr, fprintf(stderr,

View File

@ -13,6 +13,7 @@ Created 5/11/1994 Heikki Tuuri
#endif #endif
#include <stdarg.h> #include <stdarg.h>
#include <string.h>
#include "ut0sort.h" #include "ut0sort.h"

View File

@ -46,22 +46,6 @@
#define OLD_EXT ".OLD" #define OLD_EXT ".OLD"
#define WRITE_COUNT MY_HOW_OFTEN_TO_WRITE #define WRITE_COUNT MY_HOW_OFTEN_TO_WRITE
#ifdef __WIN__
static double ulonglong2double(ulonglong value)
{
longlong nr=(longlong) value;
if (nr >= 0)
return (double) nr;
return (18446744073709551616.0 + (double) nr);
}
#if SIZEOF_OFF_T > 4
#define my_off_t2double(A) ulonglong2double(A)
#else
#define my_off_t2double(A) ((double) (A))
#endif /* SIZEOF_OFF_T > 4 */
#endif
struct st_file_buffer { struct st_file_buffer {
File file; File file;
char *buffer,*pos,*end; char *buffer,*pos,*end;

View File

@ -452,14 +452,16 @@ HANDLE create_shared_memory(MYSQL *mysql,NET *net, uint connect_timeout)
unique_part is uniquel value for each object (events and file-mapping) unique_part is uniquel value for each object (events and file-mapping)
number_of_connection is number of connection between server and client number_of_connection is number of connection between server and client
*/ */
suffix_pos = strxmov(tmp,shared_memory_base_name,"_",connect_number_char,"_",NullS); suffix_pos = strxmov(tmp,shared_memory_base_name,"_",connect_number_char,
"_",NullS);
strmov(suffix_pos, "DATA"); strmov(suffix_pos, "DATA");
if ((handle_file_map = OpenFileMapping(FILE_MAP_WRITE,FALSE,tmp)) == NULL) if ((handle_file_map = OpenFileMapping(FILE_MAP_WRITE,FALSE,tmp)) == NULL)
{ {
error_allow = CR_SHARED_MEMORY_FILE_MAP_ERROR; error_allow = CR_SHARED_MEMORY_FILE_MAP_ERROR;
goto err2; goto err2;
} }
if ((handle_map = MapViewOfFile(handle_file_map,FILE_MAP_WRITE,0,0,smem_buffer_length)) == NULL) if ((handle_map = MapViewOfFile(handle_file_map,FILE_MAP_WRITE,0,0,
smem_buffer_length)) == NULL)
{ {
error_allow = CR_SHARED_MEMORY_MAP_ERROR; error_allow = CR_SHARED_MEMORY_MAP_ERROR;
goto err2; goto err2;
@ -2330,8 +2332,8 @@ Try also with PIPE or TCP/IP
/* Create password to decode scramble */ /* Create password to decode scramble */
create_key_from_old_password(passwd,password_hash); create_key_from_old_password(passwd,password_hash);
/* Decypt and store scramble 4 = hash for stage2 */ /* Decypt and store scramble 4 = hash for stage2 */
password_crypt(net->read_pos+4,mysql->scramble_buff,password_hash, password_crypt((const char*) net->read_pos+4,mysql->scramble_buff,
SCRAMBLE41_LENGTH); password_hash, SCRAMBLE41_LENGTH);
mysql->scramble_buff[SCRAMBLE41_LENGTH]=0; mysql->scramble_buff[SCRAMBLE41_LENGTH]=0;
/* Finally scramble decoded scramble with password */ /* Finally scramble decoded scramble with password */
scramble(buff, mysql->scramble_buff, passwd,0); scramble(buff, mysql->scramble_buff, passwd,0);
@ -4088,37 +4090,33 @@ static void store_param_null(NET *net, MYSQL_BIND *param)
client application client application
*/ */
static my_bool store_param(MYSQL_STMT *stmt, MYSQL_BIND *param) static my_bool store_param(MYSQL_STMT *stmt, MYSQL_BIND *param)
{ {
MYSQL *mysql= stmt->mysql; MYSQL *mysql= stmt->mysql;
NET *net = &mysql->net; NET *net = &mysql->net;
DBUG_ENTER("store_param"); DBUG_ENTER("store_param");
DBUG_PRINT("enter",("type: %d, buffer:%lx, length: %d", param->buffer_type, DBUG_PRINT("enter",("type: %d, buffer:%lx, length: %lu is_null: %d",
param->buffer ? param->buffer : "0", *param->length)); param->buffer_type,
param->buffer ? param->buffer : "0", *param->length,
*param->is_null));
if (param->buffer_type == MYSQL_TYPE_NULL || if (*param->is_null)
*param->length == MYSQL_NULL_DATA)
store_param_null(net, param); store_param_null(net, param);
else else
{ {
unsigned int length;
/* /*
Allocate for worst case (long string), ignore the length Param->length should ALWAYS point to the correct length for the type
buffer for numeric/double types by assigning the default Either to the length pointer given by the user or param->bind_length
length using get_binary_length
*/ */
if ((my_realloc_str(net, 9 + *param->length)))
if (!(length= get_binary_length(param->buffer_type)))
length= *param->length;
if ((my_realloc_str(net, 9 + length)))
DBUG_RETURN(1); DBUG_RETURN(1);
(*param->store_param_func)(net, param); (*param->store_param_func)(net, param);
} }
DBUG_RETURN(0); DBUG_RETURN(0);
} }
/* /*
Send the prepare query to server for execution Send the prepare query to server for execution
*/ */
@ -4200,12 +4198,9 @@ int STDCALL mysql_execute(MYSQL_STMT *stmt)
for (param= stmt->params; param < param_end; param++) for (param= stmt->params; param < param_end; param++)
{ {
/* Check for long data which has not been propery given/terminated */ /* check if mysql_long_data() was used */
if (*param->length == MYSQL_LONG_DATA) if (param->long_data_used)
{ param->long_data_used= 0; /* Clear for next execute call */
if (!param->long_ended)
DBUG_RETURN(MYSQL_NEED_DATA);
}
else if (store_param(stmt, param)) else if (store_param(stmt, param))
DBUG_RETURN(1); DBUG_RETURN(1);
} }
@ -4245,6 +4240,11 @@ my_ulonglong STDCALL mysql_stmt_affected_rows(MYSQL_STMT *stmt)
return stmt->mysql->last_used_con->affected_rows; return stmt->mysql->last_used_con->affected_rows;
} }
static my_bool int_is_null_true= 1; /* Used for MYSQL_TYPE_NULL */
static my_bool int_is_null_false= 0;
static my_bool int_is_null_dummy;
/* /*
Setup the parameter data buffers from application Setup the parameter data buffers from application
*/ */
@ -4277,19 +4277,6 @@ my_bool STDCALL mysql_bind_param(MYSQL_STMT *stmt, MYSQL_BIND * bind)
param++) param++)
{ {
param->param_number= count++; param->param_number= count++;
if (param->length && *param->length == MYSQL_LONG_DATA &&
(param->buffer_type < MYSQL_TYPE_TINY_BLOB ||
param->buffer_type > MYSQL_TYPE_STRING))
{
/*
Long data handling should be used only for string/binary
types only
*/
sprintf(stmt->last_error, ER(stmt->last_errno= CR_INVALID_BUFFER_USE),
param->param_number);
DBUG_RETURN(1);
}
/* /*
If param->length is not given, change it to point to bind_length. If param->length is not given, change it to point to bind_length.
This way we can always use *param->length to get the length of data This way we can always use *param->length to get the length of data
@ -4297,33 +4284,44 @@ my_bool STDCALL mysql_bind_param(MYSQL_STMT *stmt, MYSQL_BIND * bind)
if (!param->length) if (!param->length)
param->length= &param->bind_length; param->length= &param->bind_length;
/* If param->is_null is not set, then the value can never be NULL */
if (!param->is_null)
param->is_null= &int_is_null_false;
/* Setup data copy functions for the different supported types */ /* Setup data copy functions for the different supported types */
switch (param->buffer_type) { switch (param->buffer_type) {
case MYSQL_TYPE_NULL: case MYSQL_TYPE_NULL:
param->bind_length= MYSQL_NULL_DATA; param->is_null= &int_is_null_true;
break; break;
case MYSQL_TYPE_TINY: case MYSQL_TYPE_TINY:
param->bind_length= 1; /* Force param->length as this is fixed for this type */
param->length= &param->bind_length;
param->bind_length= param->buffer_length= 1;
param->store_param_func= store_param_tinyint; param->store_param_func= store_param_tinyint;
break; break;
case MYSQL_TYPE_SHORT: case MYSQL_TYPE_SHORT:
param->bind_length= 2; param->length= &param->bind_length;
param->bind_length= param->buffer_length= 2;
param->store_param_func= store_param_short; param->store_param_func= store_param_short;
break; break;
case MYSQL_TYPE_LONG: case MYSQL_TYPE_LONG:
param->bind_length= 4; param->length= &param->bind_length;
param->bind_length= param->buffer_length= 4;
param->store_param_func= store_param_int32; param->store_param_func= store_param_int32;
break; break;
case MYSQL_TYPE_LONGLONG: case MYSQL_TYPE_LONGLONG:
param->bind_length= 8; param->length= &param->bind_length;
param->bind_length= param->buffer_length= 8;
param->store_param_func= store_param_int64; param->store_param_func= store_param_int64;
break; break;
case MYSQL_TYPE_FLOAT: case MYSQL_TYPE_FLOAT:
param->bind_length= 4; param->length= &param->bind_length;
param->bind_length= param->buffer_length= 4;
param->store_param_func= store_param_float; param->store_param_func= store_param_float;
break; break;
case MYSQL_TYPE_DOUBLE: case MYSQL_TYPE_DOUBLE:
param->bind_length= 8; param->length= &param->bind_length;
param->bind_length= param->buffer_length= 8;
param->store_param_func= store_param_double; param->store_param_func= store_param_double;
break; break;
case MYSQL_TYPE_TINY_BLOB: case MYSQL_TYPE_TINY_BLOB:
@ -4336,7 +4334,8 @@ my_bool STDCALL mysql_bind_param(MYSQL_STMT *stmt, MYSQL_BIND * bind)
param->store_param_func= store_param_str; param->store_param_func= store_param_str;
break; break;
default: default:
sprintf(stmt->last_error, ER(stmt->last_errno= CR_UNSUPPORTED_PARAM_TYPE), sprintf(stmt->last_error,
ER(stmt->last_errno= CR_UNSUPPORTED_PARAM_TYPE),
param->buffer_type, param->param_number); param->buffer_type, param->param_number);
DBUG_RETURN(1); DBUG_RETURN(1);
} }
@ -4361,8 +4360,7 @@ my_bool STDCALL mysql_bind_param(MYSQL_STMT *stmt, MYSQL_BIND * bind)
param_number Parameter number (0 - N-1) param_number Parameter number (0 - N-1)
data Data to send to server data Data to send to server
length Length of data to send (may be 0) length Length of data to send (may be 0)
last_data If != 0 then this is the last data to the
server.
RETURN VALUES RETURN VALUES
0 ok 0 ok
1 error 1 error
@ -4371,8 +4369,7 @@ my_bool STDCALL mysql_bind_param(MYSQL_STMT *stmt, MYSQL_BIND * bind)
my_bool STDCALL my_bool STDCALL
mysql_send_long_data(MYSQL_STMT *stmt, uint param_number, mysql_send_long_data(MYSQL_STMT *stmt, uint param_number,
const char *data, ulong length, const char *data, ulong length)
my_bool last_data)
{ {
MYSQL_BIND *param; MYSQL_BIND *param;
DBUG_ENTER("mysql_send_long_data"); DBUG_ENTER("mysql_send_long_data");
@ -4386,6 +4383,19 @@ mysql_send_long_data(MYSQL_STMT *stmt, uint param_number,
DBUG_RETURN(1); DBUG_RETURN(1);
} }
param= stmt->params+param_number; param= stmt->params+param_number;
if (param->buffer_type < MYSQL_TYPE_TINY_BLOB ||
param->buffer_type > MYSQL_TYPE_STRING)
{
/*
Long data handling should be used only for string/binary
types only
*/
sprintf(stmt->last_error, ER(stmt->last_errno= CR_INVALID_BUFFER_USE),
param->param_number);
DBUG_RETURN(1);
}
/* Mark for execute that the result is already sent */
param->long_data_used= 1;
if (length) if (length)
{ {
MYSQL *mysql= stmt->mysql; MYSQL *mysql= stmt->mysql;
@ -4407,7 +4417,6 @@ mysql_send_long_data(MYSQL_STMT *stmt, uint param_number,
DBUG_RETURN(1); DBUG_RETURN(1);
} }
} }
param->long_ended= last_data;
DBUG_RETURN(0); DBUG_RETURN(0);
} }
@ -4582,6 +4591,7 @@ static void send_data_str(MYSQL_BIND *param, char *value, uint length)
} }
} }
/* Fetch data to buffers */ /* Fetch data to buffers */
static my_bool fetch_results(MYSQL_STMT *stmt, MYSQL_BIND *param, static my_bool fetch_results(MYSQL_STMT *stmt, MYSQL_BIND *param,
uint field_type, uchar **row) uint field_type, uchar **row)
@ -4829,6 +4839,13 @@ my_bool STDCALL mysql_bind_result(MYSQL_STMT *stmt, MYSQL_BIND *bind)
for (param= stmt->bind, end= param+bind_count; param < end ; param++) for (param= stmt->bind, end= param+bind_count; param < end ; param++)
{ {
/*
Set param->is_null to point to a dummy variable if it's not set.
This is to make the excute code easier
*/
if (!param->is_null)
param->is_null= &int_is_null_dummy;
/* Setup data copy functions for the different supported types */ /* Setup data copy functions for the different supported types */
switch (param->buffer_type) { switch (param->buffer_type) {
case MYSQL_TYPE_TINY: case MYSQL_TYPE_TINY:
@ -4855,10 +4872,12 @@ my_bool STDCALL mysql_bind_result(MYSQL_STMT *stmt, MYSQL_BIND *bind)
case MYSQL_TYPE_BLOB: case MYSQL_TYPE_BLOB:
case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_VAR_STRING:
case MYSQL_TYPE_STRING: case MYSQL_TYPE_STRING:
DBUG_ASSERT(param->buffer_length != 0);
param->fetch_result= fetch_result_str; param->fetch_result= fetch_result_str;
break; break;
default: default:
sprintf(stmt->last_error, ER(stmt->last_errno= CR_UNSUPPORTED_PARAM_TYPE), sprintf(stmt->last_error,
ER(stmt->last_errno= CR_UNSUPPORTED_PARAM_TYPE),
param->buffer_type, param->param_number); param->buffer_type, param->param_number);
DBUG_RETURN(1); DBUG_RETURN(1);
} }
@ -4895,15 +4914,16 @@ static int stmt_fetch_row(MYSQL_STMT *stmt, uchar *row)
bind++, field++) bind++, field++)
{ {
if (*null_ptr & bit) if (*null_ptr & bit)
*bind->length= MYSQL_NULL_DATA; *bind->is_null= 1;
else else
{ {
*bind->is_null= 0;
if (field->type == bind->buffer_type) if (field->type == bind->buffer_type)
(*bind->fetch_result)(bind, &row); (*bind->fetch_result)(bind, &row);
else if (fetch_results(stmt, bind, field->type, &row)) else if (fetch_results(stmt, bind, field->type, &row))
return 1; return 1;
} }
if (! (bit<<=1) & 255) if (! ((bit<<=1) & 255))
{ {
bit= 1; /* To next byte */ bit= 1; /* To next byte */
null_ptr++; null_ptr++;

View File

@ -107,7 +107,6 @@ EXPORTS
getopt_ull_limit_value getopt_ull_limit_value
getopt_compare_strings getopt_compare_strings
mysql_warning_count mysql_warning_count
mysql_warnings
mysql_prepare mysql_prepare
mysql_execute mysql_execute
mysql_param_count mysql_param_count
@ -119,7 +118,6 @@ EXPORTS
mysql_stmt_errno mysql_stmt_errno
mysql_fetch mysql_fetch
mysql_send_long_data mysql_send_long_data
mysql_multi_query
mysql_next_result mysql_next_result
mysql_commit mysql_commit
mysql_rollback mysql_rollback

View File

@ -88,7 +88,6 @@ void THD::clear_error()
static bool check_user(THD *thd,enum_server_command command, const char *user, static bool check_user(THD *thd,enum_server_command command, const char *user,
const char *passwd, const char *db, bool check_count) const char *passwd, const char *db, bool check_count)
{ {
USER_RESOURCES ur;
thd->db=0; thd->db=0;
if (!(thd->user = my_strdup(user, MYF(0)))) if (!(thd->user = my_strdup(user, MYF(0))))

View File

@ -21,6 +21,7 @@
#define FT_CORE #define FT_CORE
#include "ftdefs.h" #include "ftdefs.h"
#include <queues.h> #include <queues.h>
#include <assert.h> /* for DBUG_ASSERT() */
/* search with boolean queries */ /* search with boolean queries */
@ -63,25 +64,27 @@ struct st_ftb_expr
{ {
FTB_EXPR *up; FTB_EXPR *up;
byte *quot, *qend; byte *quot, *qend;
float weight;
uint flags;
my_off_t docid[2]; /* for index search and for scan */ my_off_t docid[2]; /* for index search and for scan */
float weight;
float cur_weight; float cur_weight;
int yesses; /* number of "yes" words matched */ uint flags;
int nos; /* number of "no" words matched */ uint yesses; /* number of "yes" words matched */
int ythresh; /* number of "yes" words in expr */ uint nos; /* number of "no" words matched */
int yweaks; /* number of "yes" words for scan only */ uint ythresh; /* number of "yes" words in expr */
uint yweaks; /* number of "yes" words for scan only */
}; };
typedef struct st_ftb_word typedef struct st_ftb_word
{ {
FTB_EXPR *up; FTB_EXPR *up;
float weight; MI_KEYDEF *keyinfo;
uint flags;
my_off_t docid[2]; /* for index search and for scan */ my_off_t docid[2]; /* for index search and for scan */
my_off_t key_root;
float weight;
uint ndepth; uint ndepth;
int len; uint flags;
/* ... docid cache can be added here. SerG */ uint len;
uchar off;
byte word[1]; byte word[1];
} FTB_WORD; } FTB_WORD;
@ -89,16 +92,16 @@ typedef struct st_ft_info
{ {
struct _ft_vft *please; struct _ft_vft *please;
MI_INFO *info; MI_INFO *info;
uint keynr;
CHARSET_INFO *charset; CHARSET_INFO *charset;
enum { UNINITIALIZED, READY, INDEX_SEARCH, INDEX_DONE /*, SCAN*/ } state;
uint with_scan;
my_off_t lastpos;
FTB_EXPR *root; FTB_EXPR *root;
QUEUE queue;
TREE no_dupes;
FTB_WORD **list; FTB_WORD **list;
MEM_ROOT mem_root; MEM_ROOT mem_root;
QUEUE queue;
TREE no_dupes;
my_off_t lastpos;
uint keynr;
uchar with_scan;
enum { UNINITIALIZED, READY, INDEX_SEARCH, INDEX_DONE } state;
} FTB; } FTB;
static int FTB_WORD_cmp(my_off_t *v, FTB_WORD *a, FTB_WORD *b) static int FTB_WORD_cmp(my_off_t *v, FTB_WORD *a, FTB_WORD *b)
@ -160,6 +163,7 @@ static void _ftb_parse_query(FTB *ftb, byte **start, byte *end,
ftbw->up=up; ftbw->up=up;
ftbw->docid[0]=ftbw->docid[1]=HA_POS_ERROR; ftbw->docid[0]=ftbw->docid[1]=HA_POS_ERROR;
ftbw->ndepth= (param.yesno<0) + depth; ftbw->ndepth= (param.yesno<0) + depth;
ftbw->key_root=HA_POS_ERROR;
memcpy(ftbw->word+1, w.pos, w.len); memcpy(ftbw->word+1, w.pos, w.len);
ftbw->word[0]=w.len; ftbw->word[0]=w.len;
if (param.yesno > 0) up->ythresh++; if (param.yesno > 0) up->ythresh++;
@ -194,22 +198,98 @@ static int _ftb_no_dupes_cmp(void* not_used __attribute__((unused)),
return CMP_NUM((*((my_off_t*)a)), (*((my_off_t*)b))); return CMP_NUM((*((my_off_t*)a)), (*((my_off_t*)b)));
} }
/* returns 1 if the search was finished (must-word wasn't found) */
static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search)
{
int r;
uint off;
int subkeys;
MI_INFO *info=ftb->info;
if (init_search)
{
ftbw->key_root=info->s->state.key_root[ftb->keynr];
ftbw->keyinfo=info->s->keyinfo+ftb->keynr;
ftbw->off=0;
r=_mi_search(info, ftbw->keyinfo, (uchar*) ftbw->word, ftbw->len,
SEARCH_FIND | SEARCH_BIGGER, ftbw->key_root);
}
else
{
r=_mi_search(info, ftbw->keyinfo, (uchar*) ftbw->word+ftbw->off,
USE_WHOLE_KEY, SEARCH_BIGGER, ftbw->key_root);
}
if (!r && !ftbw->off)
{
r= mi_compare_text(ftb->charset,
info->lastkey + (ftbw->flags & FTB_FLAG_TRUNC),
ftbw->len - (ftbw->flags & FTB_FLAG_TRUNC),
(uchar*) ftbw->word + (ftbw->flags & FTB_FLAG_TRUNC),
ftbw->len - (ftbw->flags & FTB_FLAG_TRUNC),
0);
}
if (r) /* not found */
{
if (!ftbw->off || !(ftbw->flags & FTB_FLAG_TRUNC))
{
ftbw->docid[0]=HA_POS_ERROR;
if ((ftbw->flags & FTB_FLAG_YES) && ftbw->up->up==0)
{
/*
This word MUST BE present in every document returned,
so we can stop the search right now
*/
ftb->state=INDEX_DONE;
return 1; /* search is done */
}
else
return 0;
}
/* going up to the first-level tree to continue search there */
_mi_dpointer(info, ftbw->word+ftbw->off+HA_FT_WLEN, ftbw->key_root);
ftbw->key_root=info->s->state.key_root[ftb->keynr];
ftbw->keyinfo=info->s->keyinfo+ftb->keynr;
ftbw->off=0;
return _ft2_search(ftb, ftbw, 0);
}
/* matching key found */
memcpy(ftbw->word+ftbw->off, info->lastkey, info->lastkey_length);
if (!ftbw->off && (init_search || (ftbw->flags & FTB_FLAG_TRUNC)))
{
/* going down ? */
get_key_full_length_rdonly(off, info->lastkey);
subkeys=ft_sintXkorr(info->lastkey+off);
if (subkeys<0)
{
/* yep, going down, to the second-level tree */
/* TODO here: subkey-based optimization */
ftbw->off=off;
ftbw->key_root=info->lastpos;
ftbw->keyinfo=& info->s->ft2_keyinfo;
r=_mi_search_first(info, ftbw->keyinfo, ftbw->key_root);
DBUG_ASSERT(r==0); /* found something */
memcpy(ftbw->word+off, info->lastkey, info->lastkey_length);
}
}
ftbw->docid[0]=info->lastpos;
return 0;
}
static void _ftb_init_index_search(FT_INFO *ftb) static void _ftb_init_index_search(FT_INFO *ftb)
{ {
int i, r; int i;
FTB_WORD *ftbw; FTB_WORD *ftbw;
MI_INFO *info=ftb->info; MI_INFO *info=ftb->info;
MI_KEYDEF *keyinfo;
my_off_t keyroot;
if ((ftb->state != READY && ftb->state !=INDEX_DONE) || if ((ftb->state != READY && ftb->state !=INDEX_DONE) ||
ftb->keynr == NO_SUCH_KEY) ftb->keynr == NO_SUCH_KEY)
return; return;
ftb->state=INDEX_SEARCH; ftb->state=INDEX_SEARCH;
keyinfo=info->s->keyinfo+ftb->keynr;
keyroot=info->s->state.key_root[ftb->keynr];
for (i=ftb->queue.elements; i; i--) for (i=ftb->queue.elements; i; i--)
{ {
ftbw=(FTB_WORD *)(ftb->queue.root[i]); ftbw=(FTB_WORD *)(ftb->queue.root[i]);
@ -248,35 +328,10 @@ static void _ftb_init_index_search(FT_INFO *ftb)
} }
} }
} }
r=_mi_search(info, keyinfo, (uchar*) ftbw->word, ftbw->len,
SEARCH_FIND | SEARCH_BIGGER, keyroot); if (_ft2_search(ftb, ftbw, 1))
if (!r)
{
r= mi_compare_text(ftb->charset,
info->lastkey + (ftbw->flags&FTB_FLAG_TRUNC),
ftbw->len - (ftbw->flags&FTB_FLAG_TRUNC),
(uchar*) ftbw->word + (ftbw->flags&FTB_FLAG_TRUNC),
ftbw->len - (ftbw->flags&FTB_FLAG_TRUNC),
0);
}
if (r) /* not found */
{
if (ftbw->flags&FTB_FLAG_YES && ftbw->up->up==0)
{
/*
This word MUST BE present in every document returned,
so we can abort the search right now
*/
ftb->state=INDEX_DONE;
return; return;
} }
}
else
{
memcpy(ftbw->word, info->lastkey, info->lastkey_length);
ftbw->docid[0]=info->lastpos;
}
}
queue_fix(& ftb->queue); queue_fix(& ftb->queue);
} }
@ -436,10 +491,7 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record)
FTB_EXPR *ftbe; FTB_EXPR *ftbe;
FTB_WORD *ftbw; FTB_WORD *ftbw;
MI_INFO *info=ftb->info; MI_INFO *info=ftb->info;
MI_KEYDEF *keyinfo=info->s->keyinfo+ftb->keynr;
my_off_t keyroot=info->s->state.key_root[ftb->keynr];
my_off_t curdoc; my_off_t curdoc;
int r;
if (ftb->state != INDEX_SEARCH && ftb->state != INDEX_DONE) if (ftb->state != INDEX_SEARCH && ftb->state != INDEX_DONE)
return -1; return -1;
@ -466,34 +518,7 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record)
_ftb_climb_the_tree(ftb, ftbw, 0); _ftb_climb_the_tree(ftb, ftbw, 0);
/* update queue */ /* update queue */
r=_mi_search(info, keyinfo, (uchar*) ftbw->word, USE_WHOLE_KEY, _ft2_search(ftb, ftbw, 0);
SEARCH_BIGGER , keyroot);
if (!r)
{
r= mi_compare_text(ftb->charset,
info->lastkey + (ftbw->flags&FTB_FLAG_TRUNC),
ftbw->len - (ftbw->flags&FTB_FLAG_TRUNC),
(uchar*) ftbw->word + (ftbw->flags&FTB_FLAG_TRUNC),
ftbw->len - (ftbw->flags&FTB_FLAG_TRUNC),
0);
}
if (r) /* not found */
{
ftbw->docid[0]=HA_POS_ERROR;
if (ftbw->flags&FTB_FLAG_YES && ftbw->up->up==0)
{
/*
This word MUST BE present in every document returned,
so we can stop the search right now
*/
ftb->state=INDEX_DONE;
}
}
else
{
memcpy(ftbw->word, info->lastkey, info->lastkey_length);
ftbw->docid[0]=info->lastpos;
}
queue_replaced(& ftb->queue); queue_replaced(& ftb->queue);
} }
@ -505,7 +530,7 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record)
if (is_tree_inited(&ftb->no_dupes) && if (is_tree_inited(&ftb->no_dupes) &&
tree_insert(&ftb->no_dupes, &curdoc, 0, tree_insert(&ftb->no_dupes, &curdoc, 0,
ftb->no_dupes.custom_arg)->count >1) ftb->no_dupes.custom_arg)->count >1)
/* but it managed to get past this line once */ /* but it managed already to get past this line once */
continue; continue;
info->lastpos=curdoc; info->lastpos=curdoc;

View File

@ -56,7 +56,7 @@ static struct my_option my_long_options[] =
int main(int argc,char *argv[]) int main(int argc,char *argv[])
{ {
int error=0; int error=0, subkeys;
uint keylen, keylen2=0, inx, doc_cnt=0; uint keylen, keylen2=0, inx, doc_cnt=0;
float weight; float weight;
double gws, min_gws=0, avg_gws=0; double gws, min_gws=0, avg_gws=0;
@ -125,7 +125,9 @@ int main(int argc,char *argv[])
keylen=*(info->lastkey); keylen=*(info->lastkey);
#if HA_FT_WTYPE == HA_KEYTYPE_FLOAT #if HA_FT_WTYPE == HA_KEYTYPE_FLOAT
mi_float4get(weight,info->lastkey+keylen+1); subkeys=mi_sint4korr(info->lastkey+keylen+1);
if (subkeys >= 0)
weight=*(float*)&subkeys;
#else #else
#error #error
#endif #endif
@ -164,7 +166,10 @@ int main(int argc,char *argv[])
} }
} }
if (dump) if (dump)
if (subkeys>=0)
printf("%9qx %20.7f %s\n",info->lastpos,weight,buf); printf("%9qx %20.7f %s\n",info->lastpos,weight,buf);
else
printf("%9qx => %17d %s\n",info->lastpos,-subkeys,buf);
if(verbose && (total%HOW_OFTEN_TO_WRITE)==0) if(verbose && (total%HOW_OFTEN_TO_WRITE)==0)
printf("%10ld\r",total); printf("%10ld\r",total);

View File

@ -42,8 +42,6 @@ typedef struct st_all_in_one
uint keynr; uint keynr;
CHARSET_INFO *charset; CHARSET_INFO *charset;
uchar *keybuff; uchar *keybuff;
MI_KEYDEF *keyinfo;
my_off_t key_root;
TREE dtree; TREE dtree;
} ALL_IN_ONE; } ALL_IN_ONE;
@ -66,13 +64,14 @@ static int FT_SUPERDOC_cmp(void* cmp_arg __attribute__((unused)),
static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio) static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio)
{ {
int subkeys;
uint keylen, r, doc_cnt; uint keylen, r, doc_cnt;
#ifdef EVAL_RUN
uint cnt;
double sum, sum2, suml;
#endif /* EVAL_RUN */
FT_SUPERDOC sdoc, *sptr; FT_SUPERDOC sdoc, *sptr;
TREE_ELEMENT *selem; TREE_ELEMENT *selem;
MI_INFO *info=aio->info;
uchar *keybuff=aio->keybuff;
MI_KEYDEF *keyinfo=info->s->keyinfo+aio->keynr;
my_off_t key_root=info->s->state.key_root[aio->keynr];
#if HA_FT_WTYPE == HA_KEYTYPE_FLOAT #if HA_FT_WTYPE == HA_KEYTYPE_FLOAT
float tmp_weight; float tmp_weight;
#else #else
@ -83,45 +82,45 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio)
word->weight=LWS_FOR_QUERY; word->weight=LWS_FOR_QUERY;
keylen=_ft_make_key(aio->info,aio->keynr,(char*) aio->keybuff,word,0); keylen=_ft_make_key(info,aio->keynr,(char*) keybuff,word,0);
#ifdef EVAL_RUN
keylen-=1+HA_FT_WLEN;
#else /* EVAL_RUN */
keylen-=HA_FT_WLEN; keylen-=HA_FT_WLEN;
#endif /* EVAL_RUN */
#ifdef EVAL_RUN
sum=sum2=suml=
#endif /* EVAL_RUN */
doc_cnt=0; doc_cnt=0;
r=_mi_search(aio->info, aio->keyinfo, aio->keybuff, keylen, r=_mi_search(info, keyinfo, keybuff, keylen, SEARCH_FIND, key_root);
SEARCH_FIND | SEARCH_PREFIX, aio->key_root); info->update|= HA_STATE_AKTIV; /* for _mi_test_if_changed() */
aio->info->update|= HA_STATE_AKTIV; /* for _mi_test_if_changed() */
while (!r) while (!r)
{ {
if (mi_compare_text(aio->charset,
aio->info->lastkey,keylen, if (keylen &&
aio->keybuff,keylen,0)) mi_compare_text(aio->charset,info->lastkey,keylen, keybuff,keylen,0))
break; break;
subkeys=ft_sintXkorr(info->lastkey+keylen);
if (subkeys<0)
{
if (doc_cnt)
DBUG_RETURN(1); /* index is corrupted */
/*
TODO here: unsafe optimization, should this word
be skipped (based on subkeys) ?
*/
keybuff+=keylen;
keyinfo=& info->s->ft2_keyinfo;
key_root=info->lastpos;
keylen=0;
r=_mi_search_first(info, keyinfo, key_root);
continue;
}
#if HA_FT_WTYPE == HA_KEYTYPE_FLOAT #if HA_FT_WTYPE == HA_KEYTYPE_FLOAT
#ifdef EVAL_RUN tmp_weight=*(float*)&subkeys;
mi_float4get(tmp_weight,aio->info->lastkey+keylen+1);
#else /* EVAL_RUN */
mi_float4get(tmp_weight,aio->info->lastkey+keylen);
#endif /* EVAL_RUN */
#else #else
#error #error
#endif #endif
if(tmp_weight==0) DBUG_RETURN(doc_cnt); /* stopword, doc_cnt should be 0 */ if (tmp_weight==0)
DBUG_RETURN(doc_cnt); /* stopword, doc_cnt should be 0 */
#ifdef EVAL_RUN sdoc.doc.dpos=info->lastpos;
cnt=*(byte *)(aio->info->lastkey+keylen);
#endif /* EVAL_RUN */
sdoc.doc.dpos=aio->info->lastpos;
/* saving document matched into dtree */ /* saving document matched into dtree */
if (!(selem=tree_insert(&aio->dtree, &sdoc, 0, aio->dtree.custom_arg))) if (!(selem=tree_insert(&aio->dtree, &sdoc, 0, aio->dtree.custom_arg)))
@ -138,20 +137,13 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio)
sptr->tmp_weight=tmp_weight; sptr->tmp_weight=tmp_weight;
doc_cnt++; doc_cnt++;
#ifdef EVAL_RUN
sum +=cnt;
sum2+=cnt*cnt;
suml+=cnt*log(cnt);
#endif /* EVAL_RUN */
if (_mi_test_if_changed(aio->info) == 0) if (_mi_test_if_changed(info) == 0)
r=_mi_search_next(aio->info, aio->keyinfo, aio->info->lastkey, r=_mi_search_next(info, keyinfo, info->lastkey, info->lastkey_length,
aio->info->lastkey_length, SEARCH_BIGGER, SEARCH_BIGGER, key_root);
aio->key_root);
else else
r=_mi_search(aio->info, aio->keyinfo, aio->info->lastkey, r=_mi_search(info, keyinfo, info->lastkey, info->lastkey_length,
aio->info->lastkey_length, SEARCH_BIGGER, SEARCH_BIGGER, key_root);
aio->key_root);
} }
if (doc_cnt) if (doc_cnt)
{ {
@ -201,10 +193,8 @@ FT_INFO *ft_init_nlq_search(MI_INFO *info, uint keynr, byte *query,
aio.info=info; aio.info=info;
aio.keynr=keynr; aio.keynr=keynr;
aio.keyinfo=info->s->keyinfo+keynr; aio.charset=info->s->keyinfo[keynr].seg->charset;
aio.charset=aio.keyinfo->seg->charset;
aio.keybuff=info->lastkey+info->s->base.max_key_length; aio.keybuff=info->lastkey+info->s->base.max_key_length;
aio.key_root=info->s->state.key_root[keynr];
bzero(&allocated_wtree,sizeof(allocated_wtree)); bzero(&allocated_wtree,sizeof(allocated_wtree));

View File

@ -18,21 +18,10 @@
#include "ftdefs.h" #include "ftdefs.h"
#ifdef EVAL_RUN
#ifdef PIVOT_STAT
ulong collstat=0;
#endif
#endif /* EVAL_RUN */
typedef struct st_ft_docstat { typedef struct st_ft_docstat {
FT_WORD *list; FT_WORD *list;
uint uniq; uint uniq;
double sum; double sum;
#ifdef EVAL_RUN
uint words, totlen;
double max, nsum, nsum2;
#endif /* EVAL_RUN */
} FT_DOCSTAT; } FT_DOCSTAT;
static int FT_WORD_cmp(CHARSET_INFO* cs, FT_WORD *w1, FT_WORD *w2) static int FT_WORD_cmp(CHARSET_INFO* cs, FT_WORD *w1, FT_WORD *w2)
@ -44,15 +33,7 @@ static int FT_WORD_cmp(CHARSET_INFO* cs, FT_WORD *w1, FT_WORD *w2)
static int walk_and_copy(FT_WORD *word,uint32 count,FT_DOCSTAT *docstat) static int walk_and_copy(FT_WORD *word,uint32 count,FT_DOCSTAT *docstat)
{ {
word->weight=LWS_IN_USE; word->weight=LWS_IN_USE;
#ifdef EVAL_RUN
word->cnt= (uchar) count;
if(docstat->max < word->weight) docstat->max=word->weight;
docstat->words+=count;
docstat->totlen+=word->len;
#endif /* EVAL_RUN */
docstat->sum+=word->weight; docstat->sum+=word->weight;
memcpy_fixed((docstat->list)++,word,sizeof(FT_WORD)); memcpy_fixed((docstat->list)++,word,sizeof(FT_WORD));
return 0; return 0;
} }
@ -70,9 +51,6 @@ FT_WORD * ft_linearize(TREE *wtree)
{ {
docstat.list=wlist; docstat.list=wlist;
docstat.uniq=wtree->elements_in_tree; docstat.uniq=wtree->elements_in_tree;
#ifdef EVAL_RUN
docstat.nsum=docstat.nsum2=docstat.max=docstat.words=docstat.totlen=
#endif /* EVAL_RUN */
docstat.sum=0; docstat.sum=0;
tree_walk(wtree,(tree_walk_action)&walk_and_copy,&docstat,left_root_right); tree_walk(wtree,(tree_walk_action)&walk_and_copy,&docstat,left_root_right);
} }
@ -85,18 +63,8 @@ FT_WORD * ft_linearize(TREE *wtree)
for (p=wlist;p->pos;p++) for (p=wlist;p->pos;p++)
{ {
p->weight=PRENORM_IN_USE; p->weight=PRENORM_IN_USE;
#ifdef EVAL_RUN
docstat.nsum+=p->weight;
docstat.nsum2+=p->weight*p->weight;
#endif /* EVAL_RUN */
} }
#ifdef EVAL_RUN
#ifdef PIVOT_STAT
collstat+=PIVOT_STAT;
#endif
#endif /* EVAL_RUN */
for (p=wlist;p->pos;p++) for (p=wlist;p->pos;p++)
{ {
p->weight/=NORM_IN_USE; p->weight/=NORM_IN_USE;

View File

@ -26,25 +26,21 @@ const char *ft_boolean_syntax="+ -><()~*:\"\"&|";
const HA_KEYSEG ft_keysegs[FT_SEGS]={ const HA_KEYSEG ft_keysegs[FT_SEGS]={
{ {
HA_KEYTYPE_VARTEXT, /* type */ HA_KEYTYPE_VARTEXT, /* type */
7, /* language (will be overwritten) */ 63, /* language (will be overwritten) */
0, 0, 0, /* null_bit, bit_start, bit_end */ 0, 0, 0, /* null_bit, bit_start, bit_end */
HA_VAR_LENGTH | HA_PACK_KEY, /* flag */ HA_VAR_LENGTH | HA_PACK_KEY, /* flag */
HA_FT_MAXLEN, /* length */ HA_FT_MAXLEN, /* length */
#ifdef EVAL_RUN
HA_FT_WLEN+1, /* start */
#else /* EVAL_RUN */
HA_FT_WLEN, /* start */ HA_FT_WLEN, /* start */
#endif /* EVAL_RUN */
0, /* null_pos */ 0, /* null_pos */
NULL /* charset */ NULL /* charset */
}, },
#ifdef EVAL_RUN
{ {
HA_KEYTYPE_INT8, 7, 0, 0, 0, 0, 1, HA_FT_WLEN, 0, NULL /*
}, Note, this (and the last HA_KEYTYPE_END) segment should NOT
#endif /* EVAL_RUN */ be packed in any way, otherwise w_search() won't be able to
{ update key entry 'in vivo'
HA_FT_WTYPE, 7, 0, 0, 0, HA_NO_SORT, HA_FT_WLEN, 0, 0, NULL */
HA_FT_WTYPE, 63, 0, 0, 0, HA_NO_SORT, HA_FT_WLEN, 0, 0, NULL
} }
}; };

View File

@ -31,7 +31,7 @@
void _mi_ft_segiterator_init(MI_INFO *info, uint keynr, const byte *record, void _mi_ft_segiterator_init(MI_INFO *info, uint keynr, const byte *record,
FT_SEG_ITERATOR *ftsi) FT_SEG_ITERATOR *ftsi)
{ {
ftsi->num=info->s->keyinfo[keynr].keysegs-FT_SEGS; ftsi->num=info->s->keyinfo[keynr].keysegs;
ftsi->seg=info->s->keyinfo[keynr].seg; ftsi->seg=info->s->keyinfo[keynr].seg;
ftsi->rec=record; ftsi->rec=record;
} }
@ -113,7 +113,7 @@ FT_WORD * _mi_ft_parserecord(MI_INFO *info, uint keynr,
if (_mi_ft_parse(&ptree, info, keynr, record)) if (_mi_ft_parse(&ptree, info, keynr, record))
return NULL; return NULL;
return ft_linearize(/*info, keynr, keybuf, */ &ptree); return ft_linearize(&ptree);
} }
static int _mi_ft_store(MI_INFO *info, uint keynr, byte *keybuf, static int _mi_ft_store(MI_INFO *info, uint keynr, byte *keybuf,
@ -267,13 +267,7 @@ uint _ft_make_key(MI_INFO *info, uint keynr, byte *keybuf, FT_WORD *wptr,
#error #error
#endif #endif
#ifdef EVAL_RUN
*(buf+HA_FT_WLEN)=wptr->cnt;
int2store(buf+HA_FT_WLEN+1,wptr->len);
memcpy(buf+HA_FT_WLEN+3,wptr->pos,wptr->len);
#else /* EVAL_RUN */
int2store(buf+HA_FT_WLEN,wptr->len); int2store(buf+HA_FT_WLEN,wptr->len);
memcpy(buf+HA_FT_WLEN+2,wptr->pos,wptr->len); memcpy(buf+HA_FT_WLEN+2,wptr->pos,wptr->len);
#endif /* EVAL_RUN */
return _mi_make_key(info,keynr,(uchar*) keybuf,buf,filepos); return _mi_make_key(info,keynr,(uchar*) keybuf,buf,filepos);
} }

View File

@ -60,16 +60,6 @@
#define NORM_SUM (docstat.nsum) #define NORM_SUM (docstat.nsum)
#define NORM_COS (sqrt(docstat.nsum2)) #define NORM_COS (sqrt(docstat.nsum2))
#ifdef EVAL_RUN
/*
extern ulong collstat;
#define PIVOT_STAT (docstat.uniq)
#define PIVOT_SLOPE (0.69)
#define PIVOT_PIVOT ((double)collstat/(info->state->records+1))
#define NORM_PIVOT ((1-PIVOT_SLOPE)*PIVOT_PIVOT+PIVOT_SLOPE*docstat.uniq)
*/
#endif /* EVAL_RUN */
#define PIVOT_VAL (0.0115) #define PIVOT_VAL (0.0115)
#define NORM_PIVOT (1+PIVOT_VAL*docstat.uniq) #define NORM_PIVOT (1+PIVOT_VAL*docstat.uniq)
/*---------------------------------------------------------------*/ /*---------------------------------------------------------------*/
@ -102,9 +92,6 @@ typedef struct st_ft_word {
byte * pos; byte * pos;
uint len; uint len;
double weight; double weight;
#ifdef EVAL_RUN
byte cnt;
#endif /* EVAL_RUN */
} FT_WORD; } FT_WORD;
typedef struct st_ftb_param { typedef struct st_ftb_param {

View File

@ -21,19 +21,16 @@
#include "myisamdef.h" #include "myisamdef.h"
#include "ft_global.h" #include "ft_global.h"
/* shoudn't be def'ed when linking with mysql */
#undef EVAL_RUN
#define HA_FT_WTYPE HA_KEYTYPE_FLOAT #define HA_FT_WTYPE HA_KEYTYPE_FLOAT
#define HA_FT_WLEN 4 #define HA_FT_WLEN 4
#ifdef EVAL_RUN
#define FT_SEGS 3
#else /* EVAL_RUN */
#define FT_SEGS 2 #define FT_SEGS 2
#endif /* EVAL_RUN */
#define ft_sintXkorr(A) mi_sint4korr(A)
#define ft_intXstore(T,A) mi_int4store(T,A)
extern const HA_KEYSEG ft_keysegs[FT_SEGS]; extern const HA_KEYSEG ft_keysegs[FT_SEGS];
int _mi_ft_cmp(MI_INFO *, uint, const byte *, const byte *); int _mi_ft_cmp(MI_INFO *, uint, const byte *, const byte *);
int _mi_ft_add(MI_INFO *, uint, byte *, const byte *, my_off_t); int _mi_ft_add(MI_INFO *, uint, byte *, const byte *, my_off_t);
int _mi_ft_del(MI_INFO *, uint, byte *, const byte *, my_off_t); int _mi_ft_del(MI_INFO *, uint, byte *, const byte *, my_off_t);

View File

@ -49,6 +49,7 @@ static int sort_key_read(MI_SORT_PARAM *sort_param,void *key);
static int sort_ft_key_read(MI_SORT_PARAM *sort_param,void *key); static int sort_ft_key_read(MI_SORT_PARAM *sort_param,void *key);
static int sort_get_next_record(MI_SORT_PARAM *sort_param); static int sort_get_next_record(MI_SORT_PARAM *sort_param);
static int sort_key_cmp(MI_SORT_PARAM *sort_param, const void *a,const void *b); static int sort_key_cmp(MI_SORT_PARAM *sort_param, const void *a,const void *b);
static int sort_ft_key_write(MI_SORT_PARAM *sort_param, const void *a);
static int sort_key_write(MI_SORT_PARAM *sort_param, const void *a); static int sort_key_write(MI_SORT_PARAM *sort_param, const void *a);
static my_off_t get_record_for_key(MI_INFO *info,MI_KEYDEF *keyinfo, static my_off_t get_record_for_key(MI_INFO *info,MI_KEYDEF *keyinfo,
uchar *key); uchar *key);
@ -1875,7 +1876,6 @@ int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info,
((param->testflag & T_CREATE_MISSING_KEYS) ? info->state->records : ((param->testflag & T_CREATE_MISSING_KEYS) ? info->state->records :
(ha_rows) (sort_info.filelength/length+1)); (ha_rows) (sort_info.filelength/length+1));
sort_param.key_cmp=sort_key_cmp; sort_param.key_cmp=sort_key_cmp;
sort_param.key_write=sort_key_write;
sort_param.lock_in_memory=lock_memory; sort_param.lock_in_memory=lock_memory;
sort_param.tmpdir=param->tmpdir; sort_param.tmpdir=param->tmpdir;
sort_param.sort_info=&sort_info; sort_param.sort_info=&sort_info;
@ -1928,10 +1928,14 @@ int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info,
(ha_rows) (sort_info.filelength/ft_max_word_len_for_sort+1); (ha_rows) (sort_info.filelength/ft_max_word_len_for_sort+1);
sort_param.key_read=sort_ft_key_read; sort_param.key_read=sort_ft_key_read;
sort_param.key_write=sort_ft_key_write;
sort_param.key_length+=ft_max_word_len_for_sort-HA_FT_MAXLEN; sort_param.key_length+=ft_max_word_len_for_sort-HA_FT_MAXLEN;
} }
else else
{
sort_param.key_read=sort_key_read; sort_param.key_read=sort_key_read;
sort_param.key_write=sort_key_write;
}
if (_create_index_by_sort(&sort_param, if (_create_index_by_sort(&sort_param,
(my_bool) (!(param->testflag & T_VERBOSE)), (my_bool) (!(param->testflag & T_VERBOSE)),
@ -1977,9 +1981,6 @@ int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info,
else else
info->state->data_file_length=sort_param.max_pos; info->state->data_file_length=sort_param.max_pos;
/*if (flush_pending_blocks(param))
goto err;*/
param->read_cache.file=info->dfile; /* re-init read cache */ param->read_cache.file=info->dfile; /* re-init read cache */
reinit_io_cache(&param->read_cache,READ_CACHE,share->pack.header_length, reinit_io_cache(&param->read_cache,READ_CACHE,share->pack.header_length,
1,1); 1,1);
@ -2078,6 +2079,7 @@ err:
MYF(MY_ALLOW_ZERO_PTR)); MYF(MY_ALLOW_ZERO_PTR));
my_free(sort_param.record,MYF(MY_ALLOW_ZERO_PTR)); my_free(sort_param.record,MYF(MY_ALLOW_ZERO_PTR));
my_free((gptr) sort_info.key_block,MYF(MY_ALLOW_ZERO_PTR)); my_free((gptr) sort_info.key_block,MYF(MY_ALLOW_ZERO_PTR));
my_free((gptr) sort_info.ft_buf, MYF(MY_ALLOW_ZERO_PTR));
my_free(sort_info.buff,MYF(MY_ALLOW_ZERO_PTR)); my_free(sort_info.buff,MYF(MY_ALLOW_ZERO_PTR));
VOID(end_io_cache(&param->read_cache)); VOID(end_io_cache(&param->read_cache));
info->opt_flag&= ~(READ_CACHE_USED | WRITE_CACHE_USED); info->opt_flag&= ~(READ_CACHE_USED | WRITE_CACHE_USED);
@ -2093,7 +2095,7 @@ err:
Threaded repair of table using sorting Threaded repair of table using sorting
SYNOPSIS SYNOPSIS
mi_repair_by_sort_r() mi_repair_by_sort_parallel()
param Repair parameters param Repair parameters
info MyISAM handler to repair info MyISAM handler to repair
name Name of table (for warnings) name Name of table (for warnings)
@ -2265,10 +2267,17 @@ int mi_repair_parallel(MI_CHECK *param, register MI_INFO *info,
} }
if ((!(param->testflag & T_SILENT))) if ((!(param->testflag & T_SILENT)))
printf ("- Fixing index %d\n",key+1); printf ("- Fixing index %d\n",key+1);
sort_param[i].key_read= ((sort_param[i].keyinfo->flag & HA_FULLTEXT) ? if (sort_param[i].keyinfo->flag & HA_FULLTEXT)
sort_ft_key_read : sort_key_read); {
sort_param[i].key_cmp=sort_key_cmp; sort_param[i].key_read=sort_ft_key_read;
sort_param[i].key_write=sort_ft_key_write;
}
else
{
sort_param[i].key_read=sort_key_read;
sort_param[i].key_write=sort_key_write; sort_param[i].key_write=sort_key_write;
}
sort_param[i].key_cmp=sort_key_cmp;
sort_param[i].lock_in_memory=lock_memory; sort_param[i].lock_in_memory=lock_memory;
sort_param[i].tmpdir=param->tmpdir; sort_param[i].tmpdir=param->tmpdir;
sort_param[i].sort_info=&sort_info; sort_param[i].sort_info=&sort_info;
@ -2461,6 +2470,7 @@ err:
pthread_cond_destroy (&sort_info.cond); pthread_cond_destroy (&sort_info.cond);
pthread_mutex_destroy(&sort_info.mutex); pthread_mutex_destroy(&sort_info.mutex);
my_free((gptr) sort_info.ft_buf, MYF(MY_ALLOW_ZERO_PTR));
my_free((gptr) sort_info.key_block,MYF(MY_ALLOW_ZERO_PTR)); my_free((gptr) sort_info.key_block,MYF(MY_ALLOW_ZERO_PTR));
my_free((gptr) sort_param,MYF(MY_ALLOW_ZERO_PTR)); my_free((gptr) sort_param,MYF(MY_ALLOW_ZERO_PTR));
my_free(sort_info.buff,MYF(MY_ALLOW_ZERO_PTR)); my_free(sort_info.buff,MYF(MY_ALLOW_ZERO_PTR));
@ -3095,6 +3105,137 @@ static int sort_key_write(MI_SORT_PARAM *sort_param, const void *a)
(uchar*) a, HA_OFFSET_ERROR)); (uchar*) a, HA_OFFSET_ERROR));
} /* sort_key_write */ } /* sort_key_write */
int sort_ft_buf_flush(MI_SORT_PARAM *sort_param)
{
SORT_INFO *sort_info=sort_param->sort_info;
SORT_KEY_BLOCKS *key_block=sort_info->key_block;
MYISAM_SHARE *share=sort_info->info->s;
uint val_off, val_len, error;
SORT_FT_BUF *ft_buf=sort_info->ft_buf;
uchar *from, *to;
val_len=share->ft2_keyinfo.keylength;
get_key_full_length_rdonly(val_off, ft_buf->lastkey);
to=ft_buf->lastkey+val_off;
if (ft_buf->buf)
{ /* flushing first-level tree */
error=sort_insert_key(sort_param,key_block,ft_buf->lastkey,HA_OFFSET_ERROR);
for (from=to+val_len;
!error && from < ft_buf->buf;
from+= val_len)
{
memcpy(to, from, val_len);
error=sort_insert_key(sort_param,key_block,ft_buf->lastkey,HA_OFFSET_ERROR);
}
return error;
}
/* flushing second-level tree keyblocks */
error=flush_pending_blocks(sort_param);
/* updating lastkey with second-level tree info */
ft_intXstore(ft_buf->lastkey+val_off, -ft_buf->count);
_mi_dpointer(sort_info->info, ft_buf->lastkey+val_off+HA_FT_WLEN,
share->state.key_root[sort_param->key]);
/* restoring first level tree data in sort_info/sort_param */
sort_info->key_block=sort_info->key_block_end- sort_info->param->sort_key_blocks;
sort_param->keyinfo=share->keyinfo+sort_param->key;
share->state.key_root[sort_param->key]=HA_OFFSET_ERROR;
/* writing lastkey in first-level tree */
return error ? error :
sort_insert_key(sort_param,sort_info->key_block,
ft_buf->lastkey,HA_OFFSET_ERROR);
}
static int sort_ft_key_write(MI_SORT_PARAM *sort_param, const void *a)
{
uint a_len, val_off, val_len, error;
uchar *p;
SORT_INFO *sort_info=sort_param->sort_info;
SORT_FT_BUF *ft_buf=sort_info->ft_buf;
SORT_KEY_BLOCKS *key_block=sort_info->key_block;
val_len=HA_FT_WLEN+sort_info->info->s->base.rec_reflength;
get_key_full_length_rdonly(a_len, (uchar *)a);
if (!ft_buf)
{
/*
use two-level tree only if key_reflength fits in rec_reflength place
and row format is NOT static - for _mi_dpointer not to garble offsets
*/
if ((sort_info->info->s->base.key_reflength <=
sort_info->info->s->base.rec_reflength) &&
(sort_info->info->s->options &
(HA_OPTION_PACK_RECORD | HA_OPTION_COMPRESS_RECORD)))
ft_buf=(SORT_FT_BUF *)my_malloc(sort_param->keyinfo->block_length +
sizeof(SORT_FT_BUF), MYF(MY_WME));
if (!ft_buf)
{
sort_param->key_write=sort_key_write;
return sort_key_write(sort_param, a);
}
sort_info->ft_buf=ft_buf;
goto word_init_ft_buf; /* no need to duplicate the code */
}
get_key_full_length_rdonly(val_off, ft_buf->lastkey);
if (val_off == a_len &&
mi_compare_text(sort_param->keyinfo->seg->charset,
((uchar *)a)+1,a_len-1,
ft_buf->lastkey+1,val_off-1, 0)==0)
{
if (!ft_buf->buf) /* store in second-level tree */
{
ft_buf->count++;
return sort_insert_key(sort_param,key_block,
((uchar *)a)+val_off, HA_OFFSET_ERROR);
}
/* storing the key in the buffer. */
memcpy (ft_buf->buf, a+val_off, val_len);
ft_buf->buf+=val_len;
if (ft_buf->buf < ft_buf->end)
return 0;
/* converting to two-level tree */
p=ft_buf->lastkey+val_off;
while (key_block->inited)
key_block++;
sort_info->key_block=key_block;
sort_param->keyinfo=& sort_info->info->s->ft2_keyinfo;
ft_buf->count=(ft_buf->buf - p)/val_len;
/* flushing buffer to second-level tree */
for (error=0; !error && p < ft_buf->buf; p+= val_len)
error=sort_insert_key(sort_param,key_block,p,HA_OFFSET_ERROR);
ft_buf->buf=0;
return error;
}
else
{
/* flushing buffer */
if ((error=sort_ft_buf_flush(sort_param)))
return error;
word_init_ft_buf:
a_len+=val_len;
memcpy(ft_buf->lastkey, a, a_len);
ft_buf->buf=ft_buf->lastkey+a_len;
ft_buf->end=ft_buf->lastkey+ (sort_param->keyinfo->block_length-32);
/* 32 is just a safety margin here
(at least max(val_len, sizeof(nod_flag)) should be there).
May be better performance could be achieved if we'd put
(sort_info->keyinfo->block_length-32)/XXX
instead.
TODO: benchmark the best value for XXX.
*/
return 0;
}
return -1; /* impossible */
} /* sort_ft_key_write */
/* get pointer to record from a key */ /* get pointer to record from a key */
@ -3254,7 +3395,7 @@ int flush_pending_blocks(MI_SORT_PARAM *sort_param)
my_off_t filepos,key_file_length; my_off_t filepos,key_file_length;
SORT_KEY_BLOCKS *key_block; SORT_KEY_BLOCKS *key_block;
SORT_INFO *sort_info= sort_param->sort_info; SORT_INFO *sort_info= sort_param->sort_info;
MI_CHECK *param=sort_info->param; myf myf_rw=sort_info->param->myf_rw;
MI_INFO *info=sort_info->info; MI_INFO *info=sort_info->info;
MI_KEYDEF *keyinfo=sort_param->keyinfo; MI_KEYDEF *keyinfo=sort_param->keyinfo;
DBUG_ENTER("flush_pending_blocks"); DBUG_ENTER("flush_pending_blocks");
@ -3279,7 +3420,7 @@ int flush_pending_blocks(MI_SORT_PARAM *sort_param)
DBUG_RETURN(1); DBUG_RETURN(1);
} }
else if (my_pwrite(info->s->kfile,(byte*) key_block->buff, else if (my_pwrite(info->s->kfile,(byte*) key_block->buff,
(uint) keyinfo->block_length,filepos, param->myf_rw)) (uint) keyinfo->block_length,filepos, myf_rw))
DBUG_RETURN(1); DBUG_RETURN(1);
DBUG_DUMP("buff",(byte*) key_block->buff,length); DBUG_DUMP("buff",(byte*) key_block->buff,length);
nod_flag=1; nod_flag=1;

View File

@ -44,7 +44,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
uint fields,length,max_key_length,packed,pointer, uint fields,length,max_key_length,packed,pointer,
key_length,info_length,key_segs,options,min_key_length_skipp, key_length,info_length,key_segs,options,min_key_length_skipp,
base_pos,varchar_count,long_varchar_count,varchar_length, base_pos,varchar_count,long_varchar_count,varchar_length,
max_key_block_length,unique_key_parts,offset; max_key_block_length,unique_key_parts,fulltext_keys,offset;
ulong reclength, real_reclength,min_pack_length; ulong reclength, real_reclength,min_pack_length;
char filename[FN_REFLEN],linkname[FN_REFLEN], *linkname_ptr; char filename[FN_REFLEN],linkname[FN_REFLEN], *linkname_ptr;
ulong pack_reclength; ulong pack_reclength;
@ -223,6 +223,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
reclength+=long_varchar_count; /* We need space for this! */ reclength+=long_varchar_count; /* We need space for this! */
max_key_length=0; tot_length=0 ; key_segs=0; max_key_length=0; tot_length=0 ; key_segs=0;
fulltext_keys=0;
max_key_block_length=0; max_key_block_length=0;
share.state.rec_per_key_part=rec_per_key_part; share.state.rec_per_key_part=rec_per_key_part;
share.state.key_root=key_root; share.state.key_root=key_root;
@ -249,7 +250,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
{ {
/* /*
called by myisamchk - i.e. table structure was taken from called by myisamchk - i.e. table structure was taken from
MYI file and SPATIAL key *do has* additional sp_segs keysegs. MYI file and SPATIAL key *does have* additional sp_segs keysegs.
We'd better delete them now We'd better delete them now
*/ */
keydef->keysegs-=sp_segs; keydef->keysegs-=sp_segs;
@ -271,20 +272,11 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
min_key_length_skipp+=SPLEN*2*SPDIMS; min_key_length_skipp+=SPLEN*2*SPDIMS;
} }
else else
if (keydef->flag & HA_FULLTEXT) /* SerG */ if (keydef->flag & HA_FULLTEXT)
{ {
keydef->flag=HA_FULLTEXT | HA_PACK_KEY | HA_VAR_LENGTH_KEY; keydef->flag=HA_FULLTEXT | HA_PACK_KEY | HA_VAR_LENGTH_KEY;
options|=HA_OPTION_PACK_KEYS; /* Using packed keys */ options|=HA_OPTION_PACK_KEYS; /* Using packed keys */
if (flags & HA_DONT_TOUCH_DATA)
{
/* called by myisamchk - i.e. table structure was taken from
MYI file and FULLTEXT key *do has* additional FT_SEGS keysegs.
We'd better delete them now
*/
keydef->keysegs-=FT_SEGS;
}
for (j=0, keyseg=keydef->seg ; (int) j < keydef->keysegs ; for (j=0, keyseg=keydef->seg ; (int) j < keydef->keysegs ;
j++, keyseg++) j++, keyseg++)
{ {
@ -295,19 +287,11 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
goto err; goto err;
} }
} }
keydef->keysegs+=FT_SEGS;
fulltext_keys++;
key_length+= HA_FT_MAXLEN+HA_FT_WLEN; key_length+= HA_FT_MAXLEN+HA_FT_WLEN;
#ifdef EVAL_RUN
key_length++;
#endif
length++; /* At least one length byte */ length++; /* At least one length byte */
min_key_length_skipp+=HA_FT_MAXLEN; min_key_length_skipp+=HA_FT_MAXLEN;
#if HA_FT_MAXLEN >= 255
min_key_length_skipp+=2; /* prefix may be 3 bytes */
length+=2;
#endif
} }
else else
{ {
@ -475,6 +459,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
3); 3);
share.base.keys= share.state.header.keys= keys; share.base.keys= share.state.header.keys= keys;
share.state.header.uniques= uniques; share.state.header.uniques= uniques;
share.state.header.fulltext_keys= fulltext_keys;
mi_int2store(share.state.header.key_parts,key_segs); mi_int2store(share.state.header.key_parts,key_segs);
mi_int2store(share.state.header.unique_key_parts,unique_key_parts); mi_int2store(share.state.header.unique_key_parts,unique_key_parts);
@ -590,21 +575,13 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
/* Write key and keyseg definitions */ /* Write key and keyseg definitions */
for (i=0 ; i < share.base.keys - uniques; i++) for (i=0 ; i < share.base.keys - uniques; i++)
{ {
uint ft_segs=(keydefs[i].flag & HA_FULLTEXT) ? FT_SEGS : 0;
uint sp_segs=(keydefs[i].flag & HA_SPATIAL) ? 2*SPDIMS : 0; uint sp_segs=(keydefs[i].flag & HA_SPATIAL) ? 2*SPDIMS : 0;
if (mi_keydef_write(file, &keydefs[i])) if (mi_keydef_write(file, &keydefs[i]))
goto err; goto err;
for (j=0 ; j < keydefs[i].keysegs-ft_segs-sp_segs ; j++) for (j=0 ; j < keydefs[i].keysegs-sp_segs ; j++)
if (mi_keyseg_write(file, &keydefs[i].seg[j])) if (mi_keyseg_write(file, &keydefs[i].seg[j]))
goto err; goto err;
for (j=0 ; j < ft_segs ; j++)
{
HA_KEYSEG seg=ft_keysegs[j];
seg.language= keydefs[i].seg[0].language;
if (mi_keyseg_write(file, &seg))
goto err;
}
for (j=0 ; j < sp_segs ; j++) for (j=0 ; j < sp_segs ; j++)
{ {
HA_KEYSEG sseg; HA_KEYSEG sseg;

View File

@ -23,8 +23,8 @@
#include <errno.h> #include <errno.h>
#endif #endif
static int d_search(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *key, static int d_search(MI_INFO *info,MI_KEYDEF *keyinfo,uint comp_flag,
uint key_length, my_off_t page, uchar *anc_buff); uchar *key,uint key_length,my_off_t page,uchar *anc_buff);
static int del(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *key,uchar *anc_buff, static int del(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *key,uchar *anc_buff,
my_off_t leaf_page,uchar *leaf_buff,uchar *keypos, my_off_t leaf_page,uchar *leaf_buff,uchar *keypos,
my_off_t next_block,uchar *ret_key); my_off_t next_block,uchar *ret_key);
@ -73,7 +73,6 @@ int mi_delete(MI_INFO *info,const byte *record)
if (((ulonglong) 1 << i) & info->s->state.key_map) if (((ulonglong) 1 << i) & info->s->state.key_map)
{ {
info->s->keyinfo[i].version++; info->s->keyinfo[i].version++;
/* The following code block is for text searching by SerG */
if (info->s->keyinfo[i].flag & HA_FULLTEXT ) if (info->s->keyinfo[i].flag & HA_FULLTEXT )
{ {
if (_mi_ft_del(info,i,(char*) old_key,record,info->lastpos)) if (_mi_ft_del(info,i,(char*) old_key,record,info->lastpos))
@ -128,19 +127,24 @@ err:
int _mi_ck_delete(register MI_INFO *info, uint keynr, uchar *key, int _mi_ck_delete(register MI_INFO *info, uint keynr, uchar *key,
uint key_length) uint key_length)
{
return _mi_ck_real_delete(info, info->s->keyinfo+keynr, key, key_length,
&info->s->state.key_root[keynr]);
} /* _mi_ck_delete */
int _mi_ck_real_delete(register MI_INFO *info, MI_KEYDEF *keyinfo,
uchar *key, uint key_length, my_off_t *root)
{ {
int error; int error;
uint nod_flag; uint nod_flag;
my_off_t old_root; my_off_t old_root;
uchar *root_buff; uchar *root_buff;
MI_KEYDEF *keyinfo; DBUG_ENTER("_mi_ck_real_delete");
DBUG_ENTER("_mi_ck_delete");
if ((old_root=info->s->state.key_root[keynr]) == HA_OFFSET_ERROR) if ((old_root=*root) == HA_OFFSET_ERROR)
{ {
DBUG_RETURN(my_errno=HA_ERR_CRASHED); DBUG_RETURN(my_errno=HA_ERR_CRASHED);
} }
keyinfo=info->s->keyinfo+keynr;
if (!(root_buff= (uchar*) my_alloca((uint) keyinfo->block_length+ if (!(root_buff= (uchar*) my_alloca((uint) keyinfo->block_length+
MI_MAX_KEY_BUFF*2))) MI_MAX_KEY_BUFF*2)))
{ {
@ -153,12 +157,15 @@ int _mi_ck_delete(register MI_INFO *info, uint keynr, uchar *key,
error= -1; error= -1;
goto err; goto err;
} }
if ((error=d_search(info,keyinfo,key,key_length,old_root,root_buff)) >0) if ((error=d_search(info,keyinfo,
(keyinfo->flag & HA_FULLTEXT ? SEARCH_FIND
: SEARCH_SAME),
key,key_length,old_root,root_buff)) >0)
{ {
if (error == 2) if (error == 2)
{ {
DBUG_PRINT("test",("Enlarging of root when deleting")); DBUG_PRINT("test",("Enlarging of root when deleting"));
error=_mi_enlarge_root(info,keynr,key); error=_mi_enlarge_root(info,keyinfo,key,root);
} }
else /* error == 1 */ else /* error == 1 */
{ {
@ -166,10 +173,9 @@ int _mi_ck_delete(register MI_INFO *info, uint keynr, uchar *key,
{ {
error=0; error=0;
if (nod_flag) if (nod_flag)
info->s->state.key_root[keynr]=_mi_kpos(nod_flag, *root=_mi_kpos(nod_flag,root_buff+2+nod_flag);
root_buff+2+nod_flag);
else else
info->s->state.key_root[keynr]= HA_OFFSET_ERROR; *root=HA_OFFSET_ERROR;
if (_mi_dispose(info,keyinfo,old_root)) if (_mi_dispose(info,keyinfo,old_root))
error= -1; error= -1;
} }
@ -180,7 +186,7 @@ int _mi_ck_delete(register MI_INFO *info, uint keynr, uchar *key,
err: err:
my_afree((gptr) root_buff); my_afree((gptr) root_buff);
DBUG_RETURN(error); DBUG_RETURN(error);
} /* _mi_ck_delete */ } /* _mi_ck_real_delete */
/* /*
@ -192,11 +198,11 @@ err:
*/ */
static int d_search(register MI_INFO *info, register MI_KEYDEF *keyinfo, static int d_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
uchar *key, uint key_length, my_off_t page, uint comp_flag, uchar *key, uint key_length,
uchar *anc_buff) my_off_t page, uchar *anc_buff)
{ {
int flag,ret_value,save_flag; int flag,ret_value,save_flag;
uint length,nod_flag; uint length,nod_flag,search_key_length;
my_bool last_key; my_bool last_key;
uchar *leaf_buff,*keypos; uchar *leaf_buff,*keypos;
my_off_t leaf_page,next_block; my_off_t leaf_page,next_block;
@ -204,9 +210,9 @@ static int d_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
DBUG_ENTER("d_search"); DBUG_ENTER("d_search");
DBUG_DUMP("page",(byte*) anc_buff,mi_getint(anc_buff)); DBUG_DUMP("page",(byte*) anc_buff,mi_getint(anc_buff));
flag=(*keyinfo->bin_search)(info,keyinfo,anc_buff,key, USE_WHOLE_KEY, search_key_length= (comp_flag & SEARCH_FIND) ? key_length : USE_WHOLE_KEY;
SEARCH_SAME, flag=(*keyinfo->bin_search)(info,keyinfo,anc_buff,key, search_key_length,
&keypos, lastkey, &last_key); comp_flag, &keypos, lastkey, &last_key);
if (flag == MI_FOUND_WRONG_KEY) if (flag == MI_FOUND_WRONG_KEY)
{ {
DBUG_PRINT("error",("Found wrong key")); DBUG_PRINT("error",("Found wrong key"));
@ -214,6 +220,52 @@ static int d_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
} }
nod_flag=mi_test_if_nod(anc_buff); nod_flag=mi_test_if_nod(anc_buff);
if (!flag && keyinfo->flag & HA_FULLTEXT)
{
uint off;
int subkeys;
get_key_full_length_rdonly(off, lastkey);
subkeys=ft_sintXkorr(lastkey+off);
comp_flag=SEARCH_SAME;
if (subkeys >= 0)
{
/* normal word, one-level tree structure */
flag=(*keyinfo->bin_search)(info,keyinfo,anc_buff,key,USE_WHOLE_KEY,
comp_flag, &keypos, lastkey, &last_key);
/* fall through to normal delete */
}
else
{
/* popular word. two-level tree. going down */
uint tmp_key_length;
my_off_t root;
uchar *kpos=keypos;
tmp_key_length=(*keyinfo->get_key)(keyinfo,nod_flag,&kpos,lastkey);
root=_mi_dpos(info,nod_flag,kpos);
if (subkeys == -1)
{
/* the last entry in sub-tree */
_mi_dispose(info, keyinfo, root);
/* fall through to normal delete */
}
else
{
keyinfo=&info->s->ft2_keyinfo;
kpos-=keyinfo->keylength; /* we'll modify key entry 'in vivo' */
key+=off;
ret_value=_mi_ck_real_delete(info, &info->s->ft2_keyinfo,
key, HA_FT_WLEN, &root);
_mi_dpointer(info, kpos+HA_FT_WLEN, root);
subkeys++;
ft_intXstore(kpos, subkeys);
if (!ret_value)
ret_value=_mi_write_keypage(info,keyinfo,page,anc_buff);
DBUG_RETURN(ret_value);
}
}
}
leaf_buff=0; leaf_buff=0;
LINT_INIT(leaf_page); LINT_INIT(leaf_page);
if (nod_flag) if (nod_flag)
@ -239,7 +291,8 @@ static int d_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
goto err; goto err;
} }
save_flag=0; save_flag=0;
ret_value=d_search(info,keyinfo,key,key_length,leaf_page,leaf_buff); ret_value=d_search(info,keyinfo,comp_flag,key,key_length,
leaf_page,leaf_buff);
} }
else else
{ /* Found key */ { /* Found key */

View File

@ -69,7 +69,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
{ {
int lock_error,kfile,open_mode,save_errno,have_rtree=0; int lock_error,kfile,open_mode,save_errno,have_rtree=0;
uint i,j,len,errpos,head_length,base_pos,offset,info_length,keys, uint i,j,len,errpos,head_length,base_pos,offset,info_length,keys,
key_parts,unique_key_parts,tmp_length,uniques; key_parts,unique_key_parts,fulltext_keys,uniques;
char name_buff[FN_REFLEN], org_name [FN_REFLEN], index_name[FN_REFLEN], char name_buff[FN_REFLEN], org_name [FN_REFLEN], index_name[FN_REFLEN],
data_name[FN_REFLEN]; data_name[FN_REFLEN];
char *disk_cache,*disk_pos; char *disk_cache,*disk_pos;
@ -126,8 +126,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
HA_OPTION_TEMP_COMPRESS_RECORD | HA_OPTION_CHECKSUM | HA_OPTION_TEMP_COMPRESS_RECORD | HA_OPTION_CHECKSUM |
HA_OPTION_TMP_TABLE | HA_OPTION_DELAY_KEY_WRITE)) HA_OPTION_TMP_TABLE | HA_OPTION_DELAY_KEY_WRITE))
{ {
DBUG_PRINT("error",("wrong options: 0x%lx", DBUG_PRINT("error",("wrong options: 0x%lx", share->options));
share->options));
my_errno=HA_ERR_OLD_FILE; my_errno=HA_ERR_OLD_FILE;
goto err; goto err;
} }
@ -162,11 +161,9 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
len=mi_uint2korr(share->state.header.state_info_length); len=mi_uint2korr(share->state.header.state_info_length);
keys= (uint) share->state.header.keys; keys= (uint) share->state.header.keys;
uniques= (uint) share->state.header.uniques; uniques= (uint) share->state.header.uniques;
fulltext_keys= (uint) share->state.header.fulltext_keys;
key_parts= mi_uint2korr(share->state.header.key_parts); key_parts= mi_uint2korr(share->state.header.key_parts);
unique_key_parts= mi_uint2korr(share->state.header.unique_key_parts); unique_key_parts= mi_uint2korr(share->state.header.unique_key_parts);
tmp_length=(MI_STATE_INFO_SIZE + keys * MI_STATE_KEY_SIZE +
key_parts*MI_STATE_KEYSEG_SIZE +
share->state.header.max_block_size*MI_STATE_KEYBLOCK_SIZE);
if (len != MI_STATE_INFO_SIZE) if (len != MI_STATE_INFO_SIZE)
{ {
DBUG_PRINT("warning", DBUG_PRINT("warning",
@ -203,6 +200,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
goto err; goto err;
} }
key_parts+=fulltext_keys*FT_SEGS;
if (share->base.max_key_length > MI_MAX_KEY_BUFF || keys > MI_MAX_KEY || if (share->base.max_key_length > MI_MAX_KEY_BUFF || keys > MI_MAX_KEY ||
key_parts >= MI_MAX_KEY * MI_MAX_KEY_SEG) key_parts >= MI_MAX_KEY * MI_MAX_KEY_SEG)
{ {
@ -211,7 +209,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
goto err; goto err;
} }
/* Correct max_file_length based on length of sizeof_t */ /* Correct max_file_length based on length of sizeof(off_t) */
max_data_file_length= max_data_file_length=
(share->options & (HA_OPTION_PACK_RECORD | HA_OPTION_COMPRESS_RECORD)) ? (share->options & (HA_OPTION_PACK_RECORD | HA_OPTION_COMPRESS_RECORD)) ?
(((ulonglong) 1 << (share->base.rec_reflength*8))-1) : (((ulonglong) 1 << (share->base.rec_reflength*8))-1) :
@ -290,6 +288,8 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
for (i=0 ; i < keys ; i++) for (i=0 ; i < keys ; i++)
{ {
disk_pos=mi_keydef_read(disk_pos, &share->keyinfo[i]); disk_pos=mi_keydef_read(disk_pos, &share->keyinfo[i]);
if (share->keyinfo[i].key_alg == HA_KEY_ALG_RTREE)
have_rtree=1;
set_if_smaller(share->blocksize,share->keyinfo[i].block_length); set_if_smaller(share->blocksize,share->keyinfo[i].block_length);
share->keyinfo[i].seg=pos; share->keyinfo[i].seg=pos;
for (j=0 ; j < share->keyinfo[i].keysegs; j++,pos++) for (j=0 ; j < share->keyinfo[i].keysegs; j++,pos++)
@ -312,11 +312,41 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
uint sp_segs=SPDIMS*2; uint sp_segs=SPDIMS*2;
share->keyinfo[i].seg=pos-sp_segs; share->keyinfo[i].seg=pos-sp_segs;
share->keyinfo[i].keysegs--; share->keyinfo[i].keysegs--;
} else if (share->keyinfo[i].flag & HA_FULLTEXT)
{
share->keyinfo[i].seg=pos-FT_SEGS;
share->fulltext_index=1;
} }
else if (share->keyinfo[i].flag & HA_FULLTEXT)
{
if (!fulltext_keys)
{ /* 4.0 compatibility code, to be removed in 5.0 */
share->keyinfo[i].seg=pos-FT_SEGS;
share->keyinfo[i].keysegs-=FT_SEGS;
share->state.header.fulltext_keys++;
}
else
{
uint j;
share->keyinfo[i].seg=pos;
for (j=0; j < FT_SEGS; j++)
{
*pos=ft_keysegs[j];
pos[0].language= pos[-1].language;
pos[0].charset= pos[-1].charset;
pos++;
}
}
if (!share->ft2_keyinfo.seg)
{
memcpy(& share->ft2_keyinfo, & share->keyinfo[i], sizeof(MI_KEYDEF));
share->ft2_keyinfo.keysegs=1;
share->ft2_keyinfo.flag=0;
share->ft2_keyinfo.keylength=
share->ft2_keyinfo.minlength=
share->ft2_keyinfo.maxlength=HA_FT_WLEN+share->base.rec_reflength;
share->ft2_keyinfo.seg=pos-1;
share->ft2_keyinfo.end=pos;
setup_key_functions(& share->ft2_keyinfo);
}
}
setup_key_functions(share->keyinfo+i);
share->keyinfo[i].end=pos; share->keyinfo[i].end=pos;
pos->type=HA_KEYTYPE_END; /* End */ pos->type=HA_KEYTYPE_END; /* End */
pos->length=share->base.rec_reflength; pos->length=share->base.rec_reflength;
@ -349,12 +379,6 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
pos++; pos++;
} }
} }
for (i=0 ; i < keys ; i++)
{
if (share->keyinfo[i].key_alg == HA_KEY_ALG_RTREE)
have_rtree=1;
setup_key_functions(share->keyinfo+i);
}
for (i=j=offset=0 ; i < share->base.fields ; i++) for (i=j=offset=0 ; i < share->base.fields ; i++)
{ {
@ -720,9 +744,9 @@ static void setup_key_functions(register MI_KEYDEF *keyinfo)
} }
/*************************************************************************** /*
** Function to save and store the header in the index file (.MSI) Function to save and store the header in the index file (.MYI)
***************************************************************************/ */
uint mi_state_info_write(File file, MI_STATE_INFO *state, uint pWrite) uint mi_state_info_write(File file, MI_STATE_INFO *state, uint pWrite)
{ {

View File

@ -81,7 +81,7 @@ int mi_rnext(MI_INFO *info, byte *buf, int inx)
error=_mi_search(info,info->s->keyinfo+inx,info->lastkey, error=_mi_search(info,info->s->keyinfo+inx,info->lastkey,
USE_WHOLE_KEY,flag, info->s->state.key_root[inx]); USE_WHOLE_KEY,flag, info->s->state.key_root[inx]);
} }
if (!error) if (!error && info->s->concurrent_insert)
{ {
while (info->lastpos >= info->state->data_file_length) while (info->lastpos >= info->state->data_file_length)
{ {

View File

@ -91,7 +91,6 @@ int mi_update(register MI_INFO *info, const byte *oldrec, byte *newrec)
{ {
if (((ulonglong) 1 << i) & share->state.key_map) if (((ulonglong) 1 << i) & share->state.key_map)
{ {
/* The following code block is for text searching by SerG */
if (share->keyinfo[i].flag & HA_FULLTEXT ) if (share->keyinfo[i].flag & HA_FULLTEXT )
{ {
if (_mi_ft_cmp(info,i,oldrec, newrec)) if (_mi_ft_cmp(info,i,oldrec, newrec))
@ -175,7 +174,6 @@ err:
{ {
if (((ulonglong) 1 << i) & changed) if (((ulonglong) 1 << i) & changed)
{ {
/* The following code block is for text searching by SerG */
if (share->keyinfo[i].flag & HA_FULLTEXT) if (share->keyinfo[i].flag & HA_FULLTEXT)
{ {
if ((flag++ && _mi_ft_del(info,i,(char*) new_key,newrec,pos)) || if ((flag++ && _mi_ft_del(info,i,(char*) new_key,newrec,pos)) ||

View File

@ -250,11 +250,12 @@ int _mi_ck_write_btree(register MI_INFO *info, uint keynr, uchar *key,
int error; int error;
uint comp_flag; uint comp_flag;
MI_KEYDEF *keyinfo=info->s->keyinfo+keynr; MI_KEYDEF *keyinfo=info->s->keyinfo+keynr;
my_off_t *root=&info->s->state.key_root[keynr];
DBUG_ENTER("_mi_ck_write_btree"); DBUG_ENTER("_mi_ck_write_btree");
if (keyinfo->flag & HA_SORT_ALLOWS_SAME) if (keyinfo->flag & HA_SORT_ALLOWS_SAME)
comp_flag=SEARCH_BIGGER; /* Put after same key */ comp_flag=SEARCH_BIGGER; /* Put after same key */
else if (keyinfo->flag & HA_NOSAME) else if (keyinfo->flag & (HA_NOSAME|HA_FULLTEXT))
{ {
comp_flag=SEARCH_FIND | SEARCH_UPDATE; /* No dupplicates */ comp_flag=SEARCH_FIND | SEARCH_UPDATE; /* No dupplicates */
if (keyinfo->flag & HA_NULL_ARE_EQUAL) if (keyinfo->flag & HA_NULL_ARE_EQUAL)
@ -263,37 +264,34 @@ int _mi_ck_write_btree(register MI_INFO *info, uint keynr, uchar *key,
else else
comp_flag=SEARCH_SAME; /* Keys in rec-pos order */ comp_flag=SEARCH_SAME; /* Keys in rec-pos order */
if (info->s->state.key_root[keynr] == HA_OFFSET_ERROR || if (*root == HA_OFFSET_ERROR ||
(error=w_search(info, keyinfo, comp_flag, key, key_length, (error=w_search(info, keyinfo, comp_flag, key, key_length,
info->s->state.key_root[keynr], (uchar *) 0, (uchar*) 0, *root, (uchar *) 0, (uchar*) 0,
(my_off_t) 0, 1)) > 0) (my_off_t) 0, 1)) > 0)
error=_mi_enlarge_root(info,keynr,key); error=_mi_enlarge_root(info,keyinfo,key,root);
DBUG_RETURN(error); DBUG_RETURN(error);
} /* _mi_ck_write_btree */ } /* _mi_ck_write_btree */
/* Make a new root with key as only pointer */ /* Make a new root with key as only pointer */
int _mi_enlarge_root(register MI_INFO *info, uint keynr, uchar *key) int _mi_enlarge_root(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key,
my_off_t *root)
{ {
uint t_length,nod_flag; uint t_length,nod_flag;
reg2 MI_KEYDEF *keyinfo;
MI_KEY_PARAM s_temp; MI_KEY_PARAM s_temp;
MYISAM_SHARE *share=info->s; MYISAM_SHARE *share=info->s;
DBUG_ENTER("_mi_enlarge_root"); DBUG_ENTER("_mi_enlarge_root");
nod_flag= (share->state.key_root[keynr] != HA_OFFSET_ERROR) ? nod_flag= (*root != HA_OFFSET_ERROR) ? share->base.key_reflength : 0;
share->base.key_reflength : 0; _mi_kpointer(info,info->buff+2,*root); /* if nod */
_mi_kpointer(info,info->buff+2,share->state.key_root[keynr]); /* if nod */
keyinfo=share->keyinfo+keynr;
t_length=(*keyinfo->pack_key)(keyinfo,nod_flag,(uchar*) 0, t_length=(*keyinfo->pack_key)(keyinfo,nod_flag,(uchar*) 0,
(uchar*) 0, (uchar*) 0, key,&s_temp); (uchar*) 0, (uchar*) 0, key,&s_temp);
mi_putint(info->buff,t_length+2+nod_flag,nod_flag); mi_putint(info->buff,t_length+2+nod_flag,nod_flag);
(*keyinfo->store_key)(keyinfo,info->buff+2+nod_flag,&s_temp); (*keyinfo->store_key)(keyinfo,info->buff+2+nod_flag,&s_temp);
info->buff_used=info->page_changed=1; /* info->buff is used */ info->buff_used=info->page_changed=1; /* info->buff is used */
if ((share->state.key_root[keynr]= _mi_new(info,keyinfo)) == if ((*root= _mi_new(info,keyinfo)) == HA_OFFSET_ERROR ||
HA_OFFSET_ERROR || _mi_write_keypage(info,keyinfo,*root,info->buff))
_mi_write_keypage(info,keyinfo,share->state.key_root[keynr],info->buff))
DBUG_RETURN(-1); DBUG_RETURN(-1);
DBUG_RETURN(0); DBUG_RETURN(0);
} /* _mi_enlarge_root */ } /* _mi_enlarge_root */
@ -333,16 +331,55 @@ static int w_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
if (flag == 0) if (flag == 0)
{ {
uint tmp_key_length; uint tmp_key_length;
my_errno=HA_ERR_FOUND_DUPP_KEY;
/* get position to record with duplicated key */ /* get position to record with duplicated key */
tmp_key_length=(*keyinfo->get_key)(keyinfo,nod_flag,&keypos,keybuff); tmp_key_length=(*keyinfo->get_key)(keyinfo,nod_flag,&keypos,keybuff);
if (tmp_key_length) if (tmp_key_length)
info->dupp_key_pos=_mi_dpos(info,0,keybuff+tmp_key_length); info->dupp_key_pos=_mi_dpos(info,0,keybuff+tmp_key_length);
else else
info->dupp_key_pos= HA_OFFSET_ERROR; info->dupp_key_pos= HA_OFFSET_ERROR;
if (keyinfo->flag & HA_FULLTEXT)
{
uint off;
int subkeys;
get_key_full_length_rdonly(off, keybuff);
subkeys=ft_sintXkorr(keybuff+off);
comp_flag=SEARCH_SAME;
if (subkeys >= 0)
{
/* normal word, one-level tree structure */
flag=(*keyinfo->bin_search)(info, keyinfo, temp_buff, key,
USE_WHOLE_KEY, comp_flag,
&keypos, keybuff, &was_last_key);
}
else
{
/* popular word. two-level tree. going down */
my_off_t root=info->dupp_key_pos;
keyinfo=&info->s->ft2_keyinfo;
key+=off;
keypos-=keyinfo->keylength; /* we'll modify key entry 'in vivo' */
if ((error=w_search(info, keyinfo, comp_flag, key, HA_FT_WLEN, root,
(uchar *) 0, (uchar*) 0, (my_off_t) 0, 1)) > 0)
{
error=_mi_enlarge_root(info, keyinfo, key, &root);
_mi_dpointer(info, keypos+HA_FT_WLEN, root);
}
subkeys--; /* should there be underflow protection ? */
ft_intXstore(keypos, subkeys);
if (!error)
error=_mi_write_keypage(info,keyinfo,page,temp_buff);
my_afree((byte*) temp_buff); my_afree((byte*) temp_buff);
DBUG_RETURN(error);
}
}
else /* not HA_FULLTEXT, normal HA_NOSAME key */
{
my_afree((byte*) temp_buff);
my_errno=HA_ERR_FOUND_DUPP_KEY;
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
}
if (flag == MI_FOUND_WRONG_KEY) if (flag == MI_FOUND_WRONG_KEY)
DBUG_RETURN(-1); DBUG_RETURN(-1);
if (!was_last_key) if (!was_last_key)
@ -394,7 +431,9 @@ int _mi_insert(register MI_INFO *info, register MI_KEYDEF *keyinfo,
#ifndef DBUG_OFF #ifndef DBUG_OFF
if (key_pos != anc_buff+2+nod_flag && (keyinfo->flag & if (key_pos != anc_buff+2+nod_flag && (keyinfo->flag &
(HA_BINARY_PACK_KEY | HA_PACK_KEY))) (HA_BINARY_PACK_KEY | HA_PACK_KEY)))
{
DBUG_DUMP("prev_key",(byte*) key_buff,_mi_keylength(keyinfo,key_buff)); DBUG_DUMP("prev_key",(byte*) key_buff,_mi_keylength(keyinfo,key_buff));
}
if (keyinfo->flag & HA_PACK_KEY) if (keyinfo->flag & HA_PACK_KEY)
{ {
DBUG_PRINT("test",("t_length: %d ref_len: %d", DBUG_PRINT("test",("t_length: %d ref_len: %d",

View File

@ -874,8 +874,8 @@ static int myisamchk(MI_CHECK *param, my_string filename)
} }
else else
{ {
if (share->fulltext_index) if (share->state.header.fulltext_keys)
ft_init_stopwords(ft_precompiled_stopwords); /* SerG */ ft_init_stopwords(ft_precompiled_stopwords);
if (!(param->testflag & T_READONLY)) if (!(param->testflag & T_READONLY))
lock_type = F_WRLCK; /* table is changed */ lock_type = F_WRLCK; /* table is changed */

View File

@ -55,7 +55,8 @@ typedef struct st_mi_state_info
uchar uniques; /* number of UNIQUE definitions */ uchar uniques; /* number of UNIQUE definitions */
uchar language; /* Language for indexes */ uchar language; /* Language for indexes */
uchar max_block_size; /* max keyblock size */ uchar max_block_size; /* max keyblock size */
uchar not_used[2]; /* To align to 8 */ uchar fulltext_keys;
uchar not_used; /* To align to 8 */
} header; } header;
MI_STATUS_INFO state; MI_STATUS_INFO state;
@ -154,6 +155,7 @@ typedef struct st_mi_isam_pack {
typedef struct st_mi_isam_share { /* Shared between opens */ typedef struct st_mi_isam_share { /* Shared between opens */
MI_STATE_INFO state; MI_STATE_INFO state;
MI_BASE_INFO base; MI_BASE_INFO base;
MI_KEYDEF ft2_keyinfo; /* Second-level ft-key definition */
MI_KEYDEF *keyinfo; /* Key definitions */ MI_KEYDEF *keyinfo; /* Key definitions */
MI_UNIQUEDEF *uniqueinfo; /* unique definitions */ MI_UNIQUEDEF *uniqueinfo; /* unique definitions */
HA_KEYSEG *keyparts; /* key part info */ HA_KEYSEG *keyparts; /* key part info */
@ -197,8 +199,7 @@ typedef struct st_mi_isam_share { /* Shared between opens */
global_changed, /* If changed since open */ global_changed, /* If changed since open */
not_flushed, not_flushed,
temporary,delay_key_write, temporary,delay_key_write,
concurrent_insert, concurrent_insert;
fulltext_index;
#ifdef THREAD #ifdef THREAD
THR_LOCK lock; THR_LOCK lock;
pthread_mutex_t intern_lock; /* Locking for use with _locking */ pthread_mutex_t intern_lock; /* Locking for use with _locking */
@ -229,6 +230,8 @@ struct st_myisam_info {
byte *rec_buff; /* Tempbuff for recordpack */ byte *rec_buff; /* Tempbuff for recordpack */
uchar *int_keypos, /* Save position for next/previous */ uchar *int_keypos, /* Save position for next/previous */
*int_maxpos; /* -""- */ *int_maxpos; /* -""- */
uint int_nod_flag; /* -""- */
uint32 int_keytree_version; /* -""- */
int (*read_record)(struct st_myisam_info*, my_off_t, byte*); int (*read_record)(struct st_myisam_info*, my_off_t, byte*);
invalidator_by_filename invalidator; /* query cache invalidator */ invalidator_by_filename invalidator; /* query cache invalidator */
ulong this_unique; /* uniq filenumber or thread */ ulong this_unique; /* uniq filenumber or thread */
@ -247,7 +250,6 @@ struct st_myisam_info {
int dfile; /* The datafile */ int dfile; /* The datafile */
uint opt_flag; /* Optim. for space/speed */ uint opt_flag; /* Optim. for space/speed */
uint update; /* If file changed since open */ uint update; /* If file changed since open */
uint int_nod_flag; /* -""- */
int lastinx; /* Last used index */ int lastinx; /* Last used index */
uint lastkey_length; /* Length of key in lastkey */ uint lastkey_length; /* Length of key in lastkey */
uint last_rkey_length; /* Last length in mi_rkey() */ uint last_rkey_length; /* Last length in mi_rkey() */
@ -259,7 +261,6 @@ struct st_myisam_info {
uint data_changed; /* Somebody has changed data */ uint data_changed; /* Somebody has changed data */
uint save_update; /* When using KEY_READ */ uint save_update; /* When using KEY_READ */
int save_lastinx; int save_lastinx;
uint32 int_keytree_version; /* -""- */
LIST open_list; LIST open_list;
IO_CACHE rec_cache; /* When cacheing records */ IO_CACHE rec_cache; /* When cacheing records */
myf lock_wait; /* is 0 or MY_DONT_WAIT */ myf lock_wait; /* is 0 or MY_DONT_WAIT */
@ -372,6 +373,13 @@ typedef struct st_mi_sort_param
{ length=mi_uint2korr((key)+1)+3; (key)+=3; } \ { length=mi_uint2korr((key)+1)+3; (key)+=3; } \
} }
#define get_key_full_length_rdonly(length,key) \
{ if ((uchar) *(key) != 255) \
length= ((uint) (uchar) *((key)))+1; \
else \
{ length=mi_uint2korr((key)+1)+3; } \
}
#define get_pack_length(length) ((length) >= 255 ? 3 : 1) #define get_pack_length(length) ((length) >= 255 ? 3 : 1)
#define MI_MIN_BLOCK_LENGTH 20 /* Because of delete-link */ #define MI_MIN_BLOCK_LENGTH 20 /* Because of delete-link */
@ -395,7 +403,7 @@ typedef struct st_mi_sort_param
#define MI_FOUND_WRONG_KEY 32738 /* Impossible value from ha_key_cmp */ #define MI_FOUND_WRONG_KEY 32738 /* Impossible value from ha_key_cmp */
#define MI_MAX_KEY_BLOCK_SIZE (MI_MAX_KEY_BLOCK_LENGTH/MI_MIN_KEY_BLOCK_LENGTH) #define MI_MAX_KEY_BLOCK_SIZE (MI_MAX_KEY_BLOCK_LENGTH/MI_MIN_KEY_BLOCK_LENGTH)
#define MI_BLOCK_SIZE(key_length,data_pointer,key_pointer) ((((key_length+data_pointer+key_pointer)*4+key_pointer+2)/myisam_block_size+1)*myisam_block_size) #define MI_BLOCK_SIZE(key_length,data_pointer,key_pointer) (((((key_length)+(data_pointer)+(key_pointer))*4+(key_pointer)+2)/myisam_block_size+1)*myisam_block_size)
#define MI_MAX_KEYPTR_SIZE 5 /* For calculating block lengths */ #define MI_MAX_KEYPTR_SIZE 5 /* For calculating block lengths */
#define MI_MIN_KEYBLOCK_LENGTH 50 /* When to split delete blocks */ #define MI_MIN_KEYBLOCK_LENGTH 50 /* When to split delete blocks */
@ -455,7 +463,7 @@ extern int _mi_delete_static_record(MI_INFO *info);
extern int _mi_cmp_static_record(MI_INFO *info,const byte *record); extern int _mi_cmp_static_record(MI_INFO *info,const byte *record);
extern int _mi_read_rnd_static_record(MI_INFO*, byte *,my_off_t, my_bool); extern int _mi_read_rnd_static_record(MI_INFO*, byte *,my_off_t, my_bool);
extern int _mi_ck_write(MI_INFO *info,uint keynr,uchar *key,uint length); extern int _mi_ck_write(MI_INFO *info,uint keynr,uchar *key,uint length);
extern int _mi_enlarge_root(MI_INFO *info,uint keynr,uchar *key); extern int _mi_enlarge_root(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *key, my_off_t *root);
extern int _mi_insert(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *key, extern int _mi_insert(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *key,
uchar *anc_buff,uchar *key_pos,uchar *key_buff, uchar *anc_buff,uchar *key_pos,uchar *key_buff,
uchar *father_buff, uchar *father_keypos, uchar *father_buff, uchar *father_keypos,
@ -690,6 +698,7 @@ void mi_check_print_error _VARARGS((MI_CHECK *param, const char *fmt,...));
void mi_check_print_warning _VARARGS((MI_CHECK *param, const char *fmt,...)); void mi_check_print_warning _VARARGS((MI_CHECK *param, const char *fmt,...));
void mi_check_print_info _VARARGS((MI_CHECK *param, const char *fmt,...)); void mi_check_print_info _VARARGS((MI_CHECK *param, const char *fmt,...));
int flush_pending_blocks(MI_SORT_PARAM *param); int flush_pending_blocks(MI_SORT_PARAM *param);
int sort_ft_buf_flush(MI_SORT_PARAM *sort_param);
int thr_write_keys(MI_SORT_PARAM *sort_param); int thr_write_keys(MI_SORT_PARAM *sort_param);
#ifdef THREAD #ifdef THREAD
pthread_handler_decl(thr_find_all_keys,arg); pthread_handler_decl(thr_find_all_keys,arg);

View File

@ -71,6 +71,7 @@ static int NEAR_F merge_buffers(MI_SORT_PARAM *info,uint keys,
BUFFPEK *Fb, BUFFPEK *Tb); BUFFPEK *Fb, BUFFPEK *Tb);
static int NEAR_F merge_index(MI_SORT_PARAM *,uint,uchar **,BUFFPEK *, int, static int NEAR_F merge_index(MI_SORT_PARAM *,uint,uchar **,BUFFPEK *, int,
IO_CACHE *); IO_CACHE *);
static int flush_ft_buf(MI_SORT_PARAM *info);
static int NEAR_F write_keys_varlen(MI_SORT_PARAM *info,uchar **sort_keys, static int NEAR_F write_keys_varlen(MI_SORT_PARAM *info,uchar **sort_keys,
uint count, BUFFPEK *buffpek, uint count, BUFFPEK *buffpek,
@ -207,7 +208,7 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages,
goto err; /* purecov: inspected */ goto err; /* purecov: inspected */
} }
if (flush_pending_blocks(info)) if (flush_ft_buf(info) || flush_pending_blocks(info))
goto err; goto err;
if (my_b_inited(&tempfile_for_exceptions)) if (my_b_inited(&tempfile_for_exceptions))
@ -478,7 +479,7 @@ int thr_write_keys(MI_SORT_PARAM *sort_param)
fflush(stdout); fflush(stdout);
} }
if (write_index(sinfo, sinfo->sort_keys, sinfo->keys) || if (write_index(sinfo, sinfo->sort_keys, sinfo->keys) ||
flush_pending_blocks(sinfo)) flush_ft_buf(sinfo) || flush_pending_blocks(sinfo))
got_error=1; got_error=1;
} }
} }
@ -551,6 +552,7 @@ int thr_write_keys(MI_SORT_PARAM *sort_param)
if (merge_index(sinfo, keys, (uchar **)mergebuf, if (merge_index(sinfo, keys, (uchar **)mergebuf,
dynamic_element(&sinfo->buffpek,0,BUFFPEK *), dynamic_element(&sinfo->buffpek,0,BUFFPEK *),
maxbuffer,&sinfo->tempfile) || maxbuffer,&sinfo->tempfile) ||
flush_ft_buf(sinfo) ||
flush_pending_blocks(sinfo)) flush_pending_blocks(sinfo))
{ {
got_error=1; got_error=1;
@ -976,3 +978,16 @@ merge_index(MI_SORT_PARAM *info, uint keys, uchar **sort_keys,
DBUG_RETURN(0); DBUG_RETURN(0);
} /* merge_index */ } /* merge_index */
static int
flush_ft_buf(MI_SORT_PARAM *info)
{
int err=0;
if (info->sort_info->ft_buf)
{
err=sort_ft_buf_flush(info);
my_free((gptr)info->sort_info->ft_buf, MYF(0));
info->sort_info->ft_buf=0;
}
return err;
}

View File

@ -1,5 +1,8 @@
drop table if exists t1; drop table if exists t1;
create table t1 (id int not null, str char(10), unique(str)); create table t1 (id int not null, str char(10), unique(str));
explain select * from t1;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 system NULL NULL NULL NULL 0 const row not found
insert into t1 values (1, null),(2, null),(3, "foo"),(4, "bar"); insert into t1 values (1, null),(2, null),(3, "foo"),(4, "bar");
select * from t1 where str is null; select * from t1 where str is null;
id str id str

View File

@ -16,6 +16,8 @@ select * from t1 where MATCH(a,b) AGAINST ("indexes collections");
a b a b
Full-text indexes are called collections Full-text indexes are called collections
Only MyISAM tables support collections Only MyISAM tables support collections
select * from t1 where MATCH(a,b) AGAINST ("only");
a b
select * from t1 where MATCH(a,b) AGAINST ("collections") UNION ALL select * from t1 where MATCH(a,b) AGAINST ("indexes"); select * from t1 where MATCH(a,b) AGAINST ("collections") UNION ALL select * from t1 where MATCH(a,b) AGAINST ("indexes");
a b a b
Only MyISAM tables support collections Only MyISAM tables support collections

View File

@ -0,0 +1,871 @@
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
i int(10) unsigned not null auto_increment primary key,
a varchar(255) not null,
FULLTEXT KEY (a)
) TYPE=MyISAM;
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaaxxx');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaazzz');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
insert t1 (a) values ('aaayyy');
repair table t1 quick;
Table Op Msg_type Msg_text
test.t1 repair status OK
select count(*) from t1 where match a against ('aaaxxx');
count(*)
260
select count(*) from t1 where match a against ('aaayyy');
count(*)
250
select count(*) from t1 where match a against ('aaazzz');
count(*)
255
select count(*) from t1 where match a against ('aaaxxx' in boolean mode);
count(*)
260
select count(*) from t1 where match a against ('aaayyy' in boolean mode);
count(*)
250
select count(*) from t1 where match a against ('aaazzz' in boolean mode);
count(*)
255
select count(*) from t1 where match a against ('aaaxxx aaayyy aaazzz');
count(*)
765
select count(*) from t1 where match a against ('aaaxxx aaayyy aaazzz' in boolean mode);
count(*)
765
select count(*) from t1 where match a against ('aaax*' in boolean mode);
count(*)
260
select count(*) from t1 where match a against ('aaay*' in boolean mode);
count(*)
250
select count(*) from t1 where match a against ('aaa*' in boolean mode);
count(*)
765
insert t1 (a) values ('aaaxxx'),('aaayyy');
insert t1 (a) values ('aaazzz'),('aaazzz'),('aaazzz'),('aaazzz'),('aaazzz');
select count(*) from t1 where match a against ('aaaxxx');
count(*)
261
select count(*) from t1 where match a against ('aaayyy');
count(*)
251
select count(*) from t1 where match a against ('aaazzz');
count(*)
260
insert t1 (a) values ('aaaxxx 000000');
select count(*) from t1 where match a against ('000000');
count(*)
1
delete from t1 where match a against ('000000');
select count(*) from t1 where match a against ('000000');
count(*)
0
select count(*) from t1 where match a against ('aaaxxx');
count(*)
261
delete from t1 where match a against ('aaazzz');
select count(*) from t1 where match a against ('aaaxxx' in boolean mode);
count(*)
261
select count(*) from t1 where match a against ('aaayyy' in boolean mode);
count(*)
251
select count(*) from t1 where match a against ('aaazzz' in boolean mode);
count(*)
0
select count(*) from t1 where a = 'aaaxxx';
count(*)
261
select count(*) from t1 where a = 'aaayyy';
count(*)
251
select count(*) from t1 where a = 'aaazzz';
count(*)
0
insert t1 (a) values ('aaaxxx 000000');
select count(*) from t1 where match a against ('000000');
count(*)
1
update t1 set a='aaazzz' where match a against ('000000');
select count(*) from t1 where match a against ('aaaxxx' in boolean mode);
count(*)
261
select count(*) from t1 where match a against ('aaazzz' in boolean mode);
count(*)
1
update t1 set a='aaazzz' where a = 'aaaxxx';
update t1 set a='aaaxxx' where a = 'aaayyy';
select count(*) from t1 where match a against ('aaaxxx' in boolean mode);
count(*)
251
select count(*) from t1 where match a against ('aaayyy' in boolean mode);
count(*)
0
select count(*) from t1 where match a against ('aaazzz' in boolean mode);
count(*)
262
DROP TABLE IF EXISTS t1;

View File

@ -14,8 +14,7 @@ insert into t1 values (101);
insert into t1 values (105); insert into t1 values (105);
insert into t1 values (106); insert into t1 values (106);
insert into t1 values (107); insert into t1 values (107);
insert into t2 values (107); insert into t2 values (107),(75),(1000);
insert into t2 values (75);
select t1.id, t2.id from t1, t2 where t2.id = t1.id; select t1.id, t2.id from t1, t2 where t2.id = t1.id;
id id id id
107 107 107 107
@ -28,6 +27,16 @@ select t1.id, count(t2.id) from t1,t2 where t2.id = t1.id group by t2.id;
id count(t2.id) id count(t2.id)
75 1 75 1
107 1 107 1
select t1.id,t2.id from t2 left join t1 on t1.id>=74 and t1.id<=0 where t2.id=75 and t1.id is null;
id id
NULL 75
explain select t1.id,t2.id from t2 left join t1 on t1.id>=74 and t1.id<=0 where t2.id=75 and t1.id is null;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 const PRIMARY NULL NULL NULL 1 Impossible ON condition
1 SIMPLE t2 ALL NULL NULL NULL NULL 3 Using where
explain select t1.id, t2.id from t1, t2 where t2.id = t1.id and t1.id <0 and t1.id > 0;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
drop table t1,t2; drop table t1,t2;
CREATE TABLE t1 ( CREATE TABLE t1 (
id int(11) NOT NULL auto_increment, id int(11) NOT NULL auto_increment,

View File

@ -5,6 +5,7 @@
drop table if exists t1; drop table if exists t1;
--enable_warnings --enable_warnings
create table t1 (id int not null, str char(10), unique(str)); create table t1 (id int not null, str char(10), unique(str));
explain select * from t1;
insert into t1 values (1, null),(2, null),(3, "foo"),(4, "bar"); insert into t1 values (1, null),(2, null),(3, "foo"),(4, "bar");
select * from t1 where str is null; select * from t1 where str is null;
select * from t1 where str="foo"; select * from t1 where str="foo";
@ -14,8 +15,10 @@ explain select * from t1 ignore key (str) where str="foo";
explain select * from t1 use key (str,str) where str="foo"; explain select * from t1 use key (str,str) where str="foo";
#The following should give errors #The following should give errors
!$1072 explain select * from t1 use key (str,str,foo) where str="foo"; --error 1072
!$1072 explain select * from t1 ignore key (str,str,foo) where str="foo"; explain select * from t1 use key (str,str,foo) where str="foo";
--error 1072
explain select * from t1 ignore key (str,str,foo) where str="foo";
drop table t1; drop table t1;
explain select 1; explain select 1;

View File

@ -18,6 +18,7 @@ INSERT INTO t1 VALUES('MySQL has now support', 'for full-text search'),
select * from t1 where MATCH(a,b) AGAINST ("collections"); select * from t1 where MATCH(a,b) AGAINST ("collections");
select * from t1 where MATCH(a,b) AGAINST ("indexes"); select * from t1 where MATCH(a,b) AGAINST ("indexes");
select * from t1 where MATCH(a,b) AGAINST ("indexes collections"); select * from t1 where MATCH(a,b) AGAINST ("indexes collections");
select * from t1 where MATCH(a,b) AGAINST ("only");
# UNION of fulltext's # UNION of fulltext's
select * from t1 where MATCH(a,b) AGAINST ("collections") UNION ALL select * from t1 where MATCH(a,b) AGAINST ("indexes"); select * from t1 where MATCH(a,b) AGAINST ("collections") UNION ALL select * from t1 where MATCH(a,b) AGAINST ("indexes");

View File

@ -0,0 +1,96 @@
#
# test of new fulltext search features
#
#
# two-level tree
#
--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
CREATE TABLE t1 (
i int(10) unsigned not null auto_increment primary key,
a varchar(255) not null,
FULLTEXT KEY (a)
) TYPE=MyISAM;
# two-level entry, second-level tree with depth 2
let $1=260;
while ($1)
{
eval insert t1 (a) values ('aaaxxx');
dec $1;
}
# two-level entry, second-level tree has only one page
let $1=255;
while ($1)
{
eval insert t1 (a) values ('aaazzz');
dec $1;
}
# one-level entry (entries)
let $1=250;
while ($1)
{
eval insert t1 (a) values ('aaayyy');
dec $1;
}
# converting to two-level
repair table t1 quick;
select count(*) from t1 where match a against ('aaaxxx');
select count(*) from t1 where match a against ('aaayyy');
select count(*) from t1 where match a against ('aaazzz');
select count(*) from t1 where match a against ('aaaxxx' in boolean mode);
select count(*) from t1 where match a against ('aaayyy' in boolean mode);
select count(*) from t1 where match a against ('aaazzz' in boolean mode);
select count(*) from t1 where match a against ('aaaxxx aaayyy aaazzz');
select count(*) from t1 where match a against ('aaaxxx aaayyy aaazzz' in boolean mode);
select count(*) from t1 where match a against ('aaax*' in boolean mode);
select count(*) from t1 where match a against ('aaay*' in boolean mode);
select count(*) from t1 where match a against ('aaa*' in boolean mode);
# mi_write:
insert t1 (a) values ('aaaxxx'),('aaayyy');
# call to enlarge_root() below
insert t1 (a) values ('aaazzz'),('aaazzz'),('aaazzz'),('aaazzz'),('aaazzz');
select count(*) from t1 where match a against ('aaaxxx');
select count(*) from t1 where match a against ('aaayyy');
select count(*) from t1 where match a against ('aaazzz');
# mi_delete
insert t1 (a) values ('aaaxxx 000000');
select count(*) from t1 where match a against ('000000');
delete from t1 where match a against ('000000');
select count(*) from t1 where match a against ('000000');
select count(*) from t1 where match a against ('aaaxxx');
delete from t1 where match a against ('aaazzz');
select count(*) from t1 where match a against ('aaaxxx' in boolean mode);
select count(*) from t1 where match a against ('aaayyy' in boolean mode);
select count(*) from t1 where match a against ('aaazzz' in boolean mode);
# double-check without index
select count(*) from t1 where a = 'aaaxxx';
select count(*) from t1 where a = 'aaayyy';
select count(*) from t1 where a = 'aaazzz';
# update
insert t1 (a) values ('aaaxxx 000000');
select count(*) from t1 where match a against ('000000');
update t1 set a='aaazzz' where match a against ('000000');
select count(*) from t1 where match a against ('aaaxxx' in boolean mode);
select count(*) from t1 where match a against ('aaazzz' in boolean mode);
update t1 set a='aaazzz' where a = 'aaaxxx';
update t1 set a='aaaxxx' where a = 'aaayyy';
select count(*) from t1 where match a against ('aaaxxx' in boolean mode);
select count(*) from t1 where match a against ('aaayyy' in boolean mode);
select count(*) from t1 where match a against ('aaazzz' in boolean mode);
DROP TABLE IF EXISTS t1;

View File

@ -21,13 +21,18 @@ insert into t1 values (105);
insert into t1 values (106); insert into t1 values (106);
insert into t1 values (107); insert into t1 values (107);
insert into t2 values (107); insert into t2 values (107),(75),(1000);
insert into t2 values (75);
select t1.id, t2.id from t1, t2 where t2.id = t1.id; select t1.id, t2.id from t1, t2 where t2.id = t1.id;
select t1.id, count(t2.id) from t1,t2 where t2.id = t1.id group by t1.id; select t1.id, count(t2.id) from t1,t2 where t2.id = t1.id group by t1.id;
select t1.id, count(t2.id) from t1,t2 where t2.id = t1.id group by t2.id; select t1.id, count(t2.id) from t1,t2 where t2.id = t1.id group by t2.id;
#
# Test problems with impossible ON or WHERE
#
select t1.id,t2.id from t2 left join t1 on t1.id>=74 and t1.id<=0 where t2.id=75 and t1.id is null;
explain select t1.id,t2.id from t2 left join t1 on t1.id>=74 and t1.id<=0 where t2.id=75 and t1.id is null;
explain select t1.id, t2.id from t1, t2 where t2.id = t1.id and t1.id <0 and t1.id > 0;
drop table t1,t2; drop table t1,t2;
# #

View File

@ -19,14 +19,16 @@
/* /*
Malloc many pointers at the same time Malloc many pointers at the same time
Only ptr1 can be free'd, and doing this will free all
the memory allocated. ptr2, etc all point inside big allocated
memory area.
SYNOPSIS SYNOPSIS
my_multi_malloc() my_multi_malloc()
myFlags Flags myFlags Flags
... Multiple arguments terminated by null ptr ptr1, length1 Multiple arguments terminated by null ptr
ptr2, length2 ...
ptr, length ...
ptr, length
NULL NULL
*/ */

View File

@ -23,6 +23,7 @@
#include "mysys_priv.h" #include "mysys_priv.h"
#include "my_static.h" #include "my_static.h"
#include "mysys_err.h" #include "mysys_err.h"
#include <m_string.h>
/* /*
Alloc for things we don't nead to free Alloc for things we don't nead to free

View File

@ -470,7 +470,7 @@ ha_rows tree_record_pos(TREE *tree, const void *key,
{ {
switch (flag) { switch (flag) {
case HA_READ_KEY_EXACT: case HA_READ_KEY_EXACT:
last_equal_pos= (left + right) / 2; last_equal_pos= (ha_rows) ((left + right) / 2);
cmp= 1; cmp= 1;
break; break;
case HA_READ_BEFORE_KEY: case HA_READ_BEFORE_KEY:
@ -498,9 +498,9 @@ ha_rows tree_record_pos(TREE *tree, const void *key,
case HA_READ_KEY_EXACT: case HA_READ_KEY_EXACT:
return last_equal_pos; return last_equal_pos;
case HA_READ_BEFORE_KEY: case HA_READ_BEFORE_KEY:
return (uint) right; return (ha_rows) right;
case HA_READ_AFTER_KEY: case HA_READ_AFTER_KEY:
return (uint) left; return (ha_rows) left;
default: default:
return HA_POS_ERROR; return HA_POS_ERROR;
} }

View File

@ -2053,7 +2053,8 @@ String *Field_longlong::val_str(String *val_buffer,
#endif #endif
longlongget(j,ptr); longlongget(j,ptr);
length=(uint) cs->longlong10_to_str(cs,to,mlength,unsigned_flag ? 10 : -10, j); length=(uint) (cs->longlong10_to_str)(cs,to,mlength,
unsigned_flag ? 10 : -10, j);
val_buffer->length(length); val_buffer->length(length);
if (zerofill) if (zerofill)
prepend_zeros(val_buffer); prepend_zeros(val_buffer);
@ -3928,7 +3929,7 @@ int Field_string::store(longlong nr)
char buff[64]; char buff[64];
int l; int l;
CHARSET_INFO *cs=charset(); CHARSET_INFO *cs=charset();
l=cs->longlong10_to_str(cs,buff,sizeof(buff),-10,nr); l= (cs->longlong10_to_str)(cs,buff,sizeof(buff),-10,nr);
return Field_string::store(buff,(uint)l,cs); return Field_string::store(buff,(uint)l,cs);
} }
@ -4095,7 +4096,7 @@ int Field_varstring::store(longlong nr)
char buff[64]; char buff[64];
int l; int l;
CHARSET_INFO *cs=charset(); CHARSET_INFO *cs=charset();
l=cs->longlong10_to_str(cs,buff,sizeof(buff),-10,nr); l= (cs->longlong10_to_str)(cs,buff,sizeof(buff),-10,nr);
return Field_varstring::store(buff,(uint)l,cs); return Field_varstring::store(buff,(uint)l,cs);
} }

View File

@ -23,7 +23,6 @@
#endif #endif
#include <m_ctype.h> #include <m_ctype.h>
#include "sql_sort.h" #include "sql_sort.h"
#include "assert.h"
#ifndef THREAD #ifndef THREAD
#define SKIP_DBUG_IN_FILESORT #define SKIP_DBUG_IN_FILESORT

View File

@ -55,7 +55,6 @@
#ifdef HAVE_BERKELEY_DB #ifdef HAVE_BERKELEY_DB
#include <m_ctype.h> #include <m_ctype.h>
#include <myisampack.h> #include <myisampack.h>
#include <assert.h>
#include <hash.h> #include <hash.h>
#include "ha_berkeley.h" #include "ha_berkeley.h"
#include "sql_manager.h" #include "sql_manager.h"

View File

@ -32,7 +32,6 @@ InnoDB */
#ifdef HAVE_INNOBASE_DB #ifdef HAVE_INNOBASE_DB
#include <m_ctype.h> #include <m_ctype.h>
#include <assert.h>
#include <hash.h> #include <hash.h>
#include <myisampack.h> #include <myisampack.h>

View File

@ -22,7 +22,6 @@
#include "mysql_priv.h" #include "mysql_priv.h"
#include <m_ctype.h> #include <m_ctype.h>
#include "my_dir.h" #include "my_dir.h"
#include <assert.h>
/***************************************************************************** /*****************************************************************************
** Item functions ** Item functions
@ -1058,7 +1057,8 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference)
break; break;
if ((tmp= find_field_in_tables(thd, this, if ((tmp= find_field_in_tables(thd, this,
sl->get_table_list(), &where, sl->get_table_list(), &where,
0)) != not_found_field); 0)) != not_found_field)
break;
if (sl->master_unit()->first_select()->linkage == if (sl->master_unit()->first_select()->linkage ==
DERIVED_TABLE_TYPE) DERIVED_TABLE_TYPE)
break; // do not look over derived table break; // do not look over derived table

View File

@ -23,7 +23,6 @@
#include "mysql_priv.h" #include "mysql_priv.h"
#include <m_ctype.h> #include <m_ctype.h>
#include "assert.h"
Item_bool_func2* Item_bool_func2::eq_creator(Item *a, Item *b) Item_bool_func2* Item_bool_func2::eq_creator(Item *a, Item *b)
{ {
return new Item_func_eq(a, b); return new Item_func_eq(a, b);

View File

@ -28,7 +28,6 @@
#include <time.h> #include <time.h>
#include <ft_global.h> #include <ft_global.h>
#include <zlib.h> #include <zlib.h>
#include <assert.h>
/* return TRUE if item is a constant */ /* return TRUE if item is a constant */

View File

@ -15,7 +15,6 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include "mysql_priv.h" #include "mysql_priv.h"
#include "assert.h"
Item_row::Item_row(List<Item> &arg): Item_row::Item_row(List<Item> &arg):
Item(), used_tables_cache(0), array_holder(1), const_item_cache(1) Item(), used_tables_cache(0), array_holder(1), const_item_cache(1)

View File

@ -1321,12 +1321,14 @@ String *Item_func_password::val_str(String *str)
char* seed_ptr=key->c_ptr(); char* seed_ptr=key->c_ptr();
while (*seed_ptr) while (*seed_ptr)
{ {
seed=seed*211+*seed_ptr; /* Use simple hashing */ seed=(seed*211+*seed_ptr) & 0xffffffffL; /* Use simple hashing */
seed_ptr++; seed_ptr++;
} }
/* Use constants which allow nice random values even with small seed */ /* Use constants which allow nice random values even with small seed */
randominit(&rand_st,seed*111111+33333333L,seed*1111+55555555L); randominit(&rand_st,
(ulong) ((ulonglong) seed*111111+33333333L) & (ulong) 0xffffffff,
(ulong) ((ulonglong) seed*1111+55555555L) & (ulong) 0xffffffff);
make_scrambled_password(tmp_value,res->c_ptr(),use_old_passwords, make_scrambled_password(tmp_value,res->c_ptr(),use_old_passwords,
&rand_st); &rand_st);

View File

@ -494,7 +494,7 @@ void Item_in_subselect::single_value_transformer(THD *thd,
else else
{ {
sl->item_list.empty(); sl->item_list.empty();
sl->item_list.push_back(new Item_int(1)); sl->item_list.push_back(new Item_int("Not_used", (longlong) 1, 21));
if (sl->table_list.elements) if (sl->table_list.elements)
{ {
item= (*func)(expr, new Item_asterisk_remover(this, item, item= (*func)(expr, new Item_asterisk_remover(this, item,

View File

@ -22,7 +22,7 @@
#endif #endif
#include "mysql_priv.h" #include "mysql_priv.h"
#include "assert.h"
Item_sum::Item_sum(List<Item> &list) Item_sum::Item_sum(List<Item> &list)
{ {
arg_count=list.elements; arg_count=list.elements;

View File

@ -136,7 +136,7 @@ static SYMBOL symbols[] = {
{ "DROP", SYM(DROP),0,0}, { "DROP", SYM(DROP),0,0},
{ "DUMPFILE", SYM(DUMPFILE),0,0}, { "DUMPFILE", SYM(DUMPFILE),0,0},
{ "DYNAMIC", SYM(DYNAMIC_SYM),0,0}, { "DYNAMIC", SYM(DYNAMIC_SYM),0,0},
{ "DUPLICATE", SYM(DUPLICATE),0,0}, { "DUPLICATE", SYM(DUPLICATE_SYM),0,0},
{ "ERRORS", SYM(ERRORS),0,0}, { "ERRORS", SYM(ERRORS),0,0},
{ "END", SYM(END),0,0}, { "END", SYM(END),0,0},
{ "ELSE", SYM(ELSE),0,0}, { "ELSE", SYM(ELSE),0,0},

View File

@ -68,8 +68,7 @@ TODO:
#include "mysql_priv.h" #include "mysql_priv.h"
#include <hash.h> #include <hash.h>
#include <assert.h> #include "ha_myisammrg.h"
#include <ha_myisammrg.h>
#ifndef MASTER #ifndef MASTER
#include "../srclib/myisammrg/myrg_def.h" #include "../srclib/myisammrg/myrg_def.h"
#else #else

View File

@ -29,7 +29,6 @@
#include <my_dir.h> #include <my_dir.h>
#include <stdarg.h> #include <stdarg.h>
#include <m_ctype.h> // For test_if_number #include <m_ctype.h> // For test_if_number
#include <assert.h>
#define files_charset_info my_charset_latin1 #define files_charset_info my_charset_latin1

View File

@ -24,8 +24,6 @@
#include <my_dir.h> #include <my_dir.h>
#endif /* MYSQL_CLIENT */ #endif /* MYSQL_CLIENT */
#include <assert.h>
#define log_cs my_charset_latin1 #define log_cs my_charset_latin1
/***************************************************************************** /*****************************************************************************
@ -1660,7 +1658,7 @@ void Rotate_log_event::pack_info(Protocol *protocol)
memcpy(buf, new_log_ident, ident_len); memcpy(buf, new_log_ident, ident_len);
b_pos+= ident_len; b_pos+= ident_len;
b_pos= strmov(b_pos, ";pos="); b_pos= strmov(b_pos, ";pos=");
b_pos=int10_to_str(pos, b_pos, 10); b_pos=longlong10_to_str(pos, b_pos, 10);
if (flags & LOG_EVENT_FORCED_ROTATE_F) if (flags & LOG_EVENT_FORCED_ROTATE_F)
b_pos= strmov(b_pos ,"; forced by master"); b_pos= strmov(b_pos ,"; forced by master");
protocol->store(buf, b_pos-buf); protocol->store(buf, b_pos-buf);
@ -1797,7 +1795,7 @@ void Intvar_log_event::pack_info(Protocol *protocol)
char buf[64], *pos; char buf[64], *pos;
pos= strmov(buf, get_var_type_name()); pos= strmov(buf, get_var_type_name());
*(pos++)='='; *(pos++)='=';
pos=int10_to_str(val, pos, -10); pos= longlong10_to_str(val, pos, -10);
protocol->store(buf, pos-buf); protocol->store(buf, pos-buf);
} }
#endif #endif
@ -2010,7 +2008,7 @@ void Slave_log_event::pack_info(Protocol *protocol)
pos= strmov(pos, ",log="); pos= strmov(pos, ",log=");
pos= strmov(pos, master_log); pos= strmov(pos, master_log);
pos= strmov(pos, ",pos="); pos= strmov(pos, ",pos=");
pos= int10_to_str(master_pos, pos, 10); pos= longlong10_to_str(master_pos, pos, 10);
protocol->store(buf, pos-buf); protocol->store(buf, pos-buf);
} }
#endif // !MYSQL_CLIENT #endif // !MYSQL_CLIENT

View File

@ -38,7 +38,6 @@
#include <errno.h> #include <errno.h>
static void my_aiowait(my_aio_result *result); static void my_aiowait(my_aio_result *result);
#endif #endif
#include <assert.h>
extern "C" { extern "C" {

View File

@ -24,6 +24,7 @@
#include <thr_lock.h> #include <thr_lock.h>
#include <my_base.h> /* Needed by field.h */ #include <my_base.h> /* Needed by field.h */
#include <my_bitmap.h> #include <my_bitmap.h>
#include <assert.h>
#ifdef __EMX__ #ifdef __EMX__
#undef write /* remove pthread.h macro definition for EMX */ #undef write /* remove pthread.h macro definition for EMX */

View File

@ -32,7 +32,6 @@
#include <nisam.h> #include <nisam.h>
#include <thr_alarm.h> #include <thr_alarm.h>
#include <ft_global.h> #include <ft_global.h>
#include <assert.h>
#define mysqld_charset my_charset_latin1 #define mysqld_charset my_charset_latin1

View File

@ -33,8 +33,6 @@
#include <m_ctype.h> #include <m_ctype.h>
#include <nisam.h> #include <nisam.h>
#include "sql_select.h" #include "sql_select.h"
#include <assert.h>
#ifndef EXTRA_DEBUG #ifndef EXTRA_DEBUG
#define test_rb_tree(A,B) {} #define test_rb_tree(A,B) {}

Some files were not shown because too many files have changed in this diff Show More