diff options
43 files changed, 783 insertions, 355 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 3703548ebc3..e2fb39fee9a 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,52 +22,37 @@ CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/include/mysql_version.h.in ${CMAKE_SOURCE_DIR}/include/mysql_version.h @ONLY) # Set standard options -ADD_DEFINITIONS(-D WITH_MYISAM_STORAGE_ENGINE) -ADD_DEFINITIONS(-D CMAKE_BUILD) -ADD_DEFINITIONS(-D HAVE_YASSL) +ADD_DEFINITIONS(-DCMAKE_BUILD) +ADD_DEFINITIONS(-DHAVE_YASSL) # Set debug options SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DFORCE_INIT_OF_VARS") -SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -DFORCE_INIT_OF_VARS") - -SET (mysql_plugin_defs "${mysql_plugin_defs},builtin_myisam_plugin") +# Note that some engines are always compiled in, MyISAM, MyISAMMRG, HEAP IF(WITH_ARCHIVE_STORAGE_ENGINE) - ADD_DEFINITIONS(-D HAVE_ARCHIVE_DB) + ADD_DEFINITIONS(-DHAVE_ARCHIVE_DB) ENDIF(WITH_ARCHIVE_STORAGE_ENGINE) -IF (WITH_HEAP_STORAGE_ENGINE) - ADD_DEFINITIONS(-D WITH_HEAP_STORAGE_ENGINE) - SET (mysql_plugin_defs "${mysql_plugin_defs},builtin_heap_plugin") -ENDIF (WITH_HEAP_STORAGE_ENGINE) +IF(WITH_BERKELEY_STORAGE_ENGINE) + ADD_DEFINITIONS(-DHAVE_BERKELEY_DB) +ENDIF(WITH_BERKELEY_STORAGE_ENGINE) -IF (WITH_MYISAMMRG_STORAGE_ENGINE) - ADD_DEFINITIONS(-D WITH_MYISAMMRG_STORAGE_ENGINE) - SET (mysql_plugin_defs "${mysql_plugin_defs},builtin_myisammrg_plugin") -ENDIF (WITH_MYISAMMRG_STORAGE_ENGINE) +IF (WITH_BLACKHOLE_STORAGE_ENGINE) + ADD_DEFINITIONS(-DHAVE_BLACKHOLE_DB) +ENDIF (WITH_BLACKHOLE_STORAGE_ENGINE) -IF(WITH_INNOBASE_STORAGE_ENGINE) - ADD_DEFINITIONS(-D HAVE_INNOBASE_DB) - ADD_DEFINITIONS(-D WITH_INNOBASE_STORAGE_ENGINE) - SET (mysql_plugin_defs "${mysql_plugin_defs},builtin_innobase_plugin") -ENDIF(WITH_INNOBASE_STORAGE_ENGINE) +IF(WITH_EXAMPLE_STORAGE_ENGINE) + ADD_DEFINITIONS(-DHAVE_EXAMPLE_DB) +ENDIF(WITH_EXAMPLE_STORAGE_ENGINE) IF(WITH_FEDERATED_STORAGE_ENGINE) - ADD_DEFINITIONS(-D HAVE_FEDERATED_DB) - ADD_DEFINITIONS(-D WITH_FEDERATED_STORAGE_ENGINE) - SET (mysql_plugin_defs "${mysql_plugin_defs},builtin_federated_plugin") + ADD_DEFINITIONS(-DHAVE_FEDERATED_DB) ENDIF(WITH_FEDERATED_STORAGE_ENGINE) -IF(WITH_BERKELEY_STORAGE_ENGINE) - ADD_DEFINITIONS(-D HAVE_BERKELEY_DB) - ADD_DEFINITIONS(-D WITH_BERKELEY_STORAGE_ENGINE) - SET (mysql_plugin_defs "${mysql_plugin_defs},builtin_berkeley_plugin") -ENDIF(WITH_BERKELEY_STORAGE_ENGINE) - -IF (WITH_BLACKHOLE_STORAGE_ENGINE) - ADD_DEFINITIONS(-D HAVE_BLACKHOLE_DB) -ENDIF (WITH_BLACKHOLE_STORAGE_ENGINE) +IF(WITH_INNOBASE_STORAGE_ENGINE) + ADD_DEFINITIONS(-DHAVE_INNOBASE_DB) +ENDIF(WITH_INNOBASE_STORAGE_ENGINE) SET(localstatedir "C:\\mysql\\data") CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/support-files/my-huge.cnf.sh @@ -82,14 +67,14 @@ CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/support-files/my-small.cnf.sh ${CMAKE_SOURCE_DIR}/support-files/my-small.ini @ONLY) IF(__NT__) - ADD_DEFINITIONS(-D __NT__) + ADD_DEFINITIONS(-D__NT__) ENDIF(__NT__) # in some places we use DBUG_OFF -SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -D DBUG_OFF") -SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -D DBUG_OFF") -SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -D DBUG_OFF") -SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D DBUG_OFF") +SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DDBUG_OFF") +SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -DDBUG_OFF") +SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DDBUG_OFF") +SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -DDBUG_OFF") IF(CMAKE_GENERATOR MATCHES "Visual Studio 8") SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4996") @@ -102,41 +87,32 @@ ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio 8") IF(CMAKE_GENERATOR MATCHES "Visual Studio 7" OR CMAKE_GENERATOR MATCHES "Visual Studio 8") - # replace /MDd with /MTd - STRING(REPLACE "/MDd" "/MTd" CMAKE_CXX_FLAGS_DEBUG_INIT - ${CMAKE_CXX_FLAGS_DEBUG_INIT}) - STRING(REPLACE "/MDd" "/MTd" CMAKE_C_FLAGS_DEBUG_INIT - ${CMAKE_C_FLAGS_DEBUG_INIT}) - STRING(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELEASE - ${CMAKE_C_FLAGS_RELEASE}) - STRING(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELWITHDEBINFO - ${CMAKE_C_FLAGS_RELWITHDEBINFO}) - STRING(REPLACE "/MDd" "/MTd" CMAKE_C_FLAGS_DEBUG - ${CMAKE_C_FLAGS_DEBUG}) - STRING(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELEASE - ${CMAKE_CXX_FLAGS_RELEASE}) - STRING(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELWITHDEBINFO - ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}) - STRING(REPLACE "/MDd" "/MTd" CMAKE_CXX_FLAGS_DEBUG - ${CMAKE_CXX_FLAGS_DEBUG}) - - # generate map files - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MAP /MAPINFO:EXPORTS") - - # set stack size (see bug#20815) - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:1048576") - - # remove support for Exception handling - STRING(REPLACE "/GX" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) - STRING(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) - STRING(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS_INIT - ${CMAKE_CXX_FLAGS_INIT}) - STRING(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS_DEBUG_INIT - ${CMAKE_CXX_FLAGS_DEBUG_INIT}) + + # replace /MDd with /MTd + STRING(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE}) + STRING(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELWITHDEBINFO ${CMAKE_C_FLAGS_RELWITHDEBINFO}) + STRING(REPLACE "/MDd" "/MTd" CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG}) + STRING(REPLACE "/MDd" "/MTd" CMAKE_C_FLAGS_DEBUG_INIT ${CMAKE_C_FLAGS_DEBUG_INIT}) + + STRING(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE}) + STRING(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELWITHDEBINFO ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}) + STRING(REPLACE "/MDd" "/MTd" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG}) + STRING(REPLACE "/MDd" "/MTd" CMAKE_CXX_FLAGS_DEBUG_INIT ${CMAKE_CXX_FLAGS_DEBUG_INIT}) + + # generate map files, set stack size (see bug#20815) + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MAP /MAPINFO:EXPORTS") + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:1048576") + + # remove support for Exception handling + STRING(REPLACE "/GX" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) + STRING(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) + STRING(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS_INIT ${CMAKE_CXX_FLAGS_INIT}) + STRING(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS_DEBUG_INIT ${CMAKE_CXX_FLAGS_DEBUG_INIT}) + ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio 7" OR CMAKE_GENERATOR MATCHES "Visual Studio 8") -ADD_DEFINITIONS("-D_WINDOWS -D__WIN__ -D _CRT_SECURE_NO_DEPRECATE") +ADD_DEFINITIONS("-D_WINDOWS -D__WIN__ -D_CRT_SECURE_NO_DEPRECATE") IF(EMBED_MANIFESTS) # Search for the tools (mt, makecat, signtool) necessary for embedding @@ -196,6 +172,8 @@ IF(EMBED_MANIFESTS) ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio 8 2005 Win64") ENDIF(EMBED_MANIFESTS) +# FIXME "debug" only needed if build type is "Debug", but +# CMAKE_BUILD_TYPE is not set during configure time. ADD_SUBDIRECTORY(vio) ADD_SUBDIRECTORY(dbug) ADD_SUBDIRECTORY(strings) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 8eaa04f8392..89675138750 100755 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -14,128 +14,48 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA INCLUDE("${PROJECT_SOURCE_DIR}/win/mysql_manifest.cmake") +# We use the "mysqlclient_notls" library here just as safety, in case +# any of the clients here would go beond the client API and access the +# Thread Local Storage directly. + SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") -# The old Windows build method used renamed (.cc -> .cpp) source files, fails -# in #include in mysqlbinlog.cc. So disable that using the USING_CMAKE define. -ADD_DEFINITIONS(-DUSING_CMAKE -DYASSL_PREFIX -DUSE_TLS) - INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/zlib ${CMAKE_SOURCE_DIR}/extra/yassl/include - ${CMAKE_SOURCE_DIR}/extra/yassl/taocrypt/include - ${CMAKE_SOURCE_DIR}/extra/yassl/taocrypt/mySTL ${CMAKE_SOURCE_DIR}/libmysql ${CMAKE_SOURCE_DIR}/regex - ${CMAKE_SOURCE_DIR}/mysys ${CMAKE_SOURCE_DIR}/sql ${CMAKE_SOURCE_DIR}/strings) -SET(YASSL_SOURCES ../extra/yassl/src/buffer.cpp - ../extra/yassl/src/cert_wrapper.cpp - ../extra/yassl/src/crypto_wrapper.cpp - ../extra/yassl/src/handshake.cpp - ../extra/yassl/src/lock.cpp - ../extra/yassl/src/log.cpp - ../extra/yassl/src/socket_wrapper.cpp - ../extra/yassl/src/ssl.cpp - ../extra/yassl/src/timer.cpp - ../extra/yassl/src/yassl_error.cpp - ../extra/yassl/src/yassl_imp.cpp - ../extra/yassl/src/yassl_int.cpp) - -SET(TAOCRYPT_SOURCES ../extra/yassl/taocrypt/src/aes.cpp - ../extra/yassl/taocrypt/src/aestables.cpp - ../extra/yassl/taocrypt/src/algebra.cpp - ../extra/yassl/taocrypt/src/arc4.cpp - ../extra/yassl/taocrypt/src/asn.cpp - ../extra/yassl/taocrypt/src/coding.cpp - ../extra/yassl/taocrypt/src/des.cpp - ../extra/yassl/taocrypt/src/dh.cpp - ../extra/yassl/taocrypt/src/dsa.cpp - ../extra/yassl/taocrypt/src/file.cpp - ../extra/yassl/taocrypt/src/hash.cpp - ../extra/yassl/taocrypt/src/integer.cpp - ../extra/yassl/taocrypt/src/md2.cpp - ../extra/yassl/taocrypt/src/md4.cpp - ../extra/yassl/taocrypt/src/md5.cpp - ../extra/yassl/taocrypt/src/misc.cpp - ../extra/yassl/taocrypt/src/random.cpp - ../extra/yassl/taocrypt/src/ripemd.cpp - ../extra/yassl/taocrypt/src/rsa.cpp - ../extra/yassl/taocrypt/src/sha.cpp) - -ADD_LIBRARY(mysqlclient ../mysys/array.c ../strings/bchange.c ../strings/bmove.c - ../strings/bmove_upp.c ../mysys/charset-def.c ../mysys/charset.c - ../sql-common/client.c ../strings/ctype-big5.c ../strings/ctype-bin.c - ../strings/ctype-cp932.c ../strings/ctype-czech.c ../strings/ctype-euc_kr.c - ../strings/ctype-eucjpms.c ../strings/ctype-extra.c ../strings/ctype-gb2312.c - ../strings/ctype-gbk.c ../strings/ctype-latin1.c ../strings/ctype-mb.c - ../strings/ctype-simple.c ../strings/ctype-sjis.c ../strings/ctype-tis620.c - ../strings/ctype-uca.c ../strings/ctype-ucs2.c ../strings/ctype-ujis.c - ../strings/ctype-utf8.c ../strings/ctype-win1250ch.c ../strings/ctype.c - ../mysys/default.c ../libmysql/errmsg.c ../mysys/errors.c - ../libmysql/get_password.c ../strings/int2str.c ../strings/is_prefix.c - ../libmysql/libmysql.c ../mysys/list.c ../strings/llstr.c - ../strings/longlong2str.c ../libmysql/manager.c ../mysys/mf_cache.c - ../mysys/mf_dirname.c ../mysys/mf_fn_ext.c ../mysys/mf_format.c - ../mysys/mf_iocache.c ../mysys/mf_iocache2.c ../mysys/mf_loadpath.c - ../mysys/mf_pack.c ../mysys/mf_path.c ../mysys/mf_tempfile.c ../mysys/mf_unixpath.c - ../mysys/mf_wcomp.c ../mysys/mulalloc.c ../mysys/my_access.c ../mysys/my_alloc.c - ../mysys/my_chsize.c ../mysys/my_compress.c ../mysys/my_create.c - ../mysys/my_delete.c ../mysys/my_div.c ../mysys/my_error.c ../mysys/my_file.c - ../mysys/my_fopen.c ../mysys/my_fstream.c ../mysys/my_gethostbyname.c - ../mysys/my_getopt.c ../mysys/my_getwd.c ../mysys/my_init.c ../mysys/my_lib.c - ../mysys/my_malloc.c ../mysys/my_messnc.c ../mysys/my_net.c ../mysys/my_once.c - ../mysys/my_open.c ../mysys/my_pread.c ../mysys/my_pthread.c ../mysys/my_read.c - ../mysys/my_realloc.c ../mysys/my_rename.c ../mysys/my_seek.c - ../mysys/my_static.c ../strings/my_strtoll10.c ../mysys/my_symlink.c - ../mysys/my_symlink2.c ../mysys/my_thr_init.c ../sql-common/my_time.c - ../strings/my_vsnprintf.c ../mysys/my_wincond.c ../mysys/my_winthread.c - ../mysys/my_write.c ../sql/net_serv.cc ../sql-common/pack.c ../sql/password.c - ../mysys/safemalloc.c ../mysys/sha1.c ../strings/str2int.c - ../strings/str_alloc.c ../strings/strcend.c ../strings/strcont.c ../strings/strend.c - ../strings/strfill.c ../mysys/string.c ../strings/strinstr.c ../strings/strmake.c - ../strings/strmov.c ../strings/strnlen.c ../strings/strnmov.c ../strings/strtod.c - ../strings/strtoll.c ../strings/strtoull.c ../strings/strxmov.c ../strings/strxnmov.c - ../mysys/thr_mutex.c ../mysys/typelib.c ../vio/vio.c ../vio/viosocket.c - ../vio/viossl.c ../vio/viosslfactories.c ../strings/xml.c - ${YASSL_SOURCES} ${TAOCRYPT_SOURCES} - ) - - -ADD_DEPENDENCIES(mysqlclient GenError) -ADD_EXECUTABLE(mysql completion_hash.cc mysql.cc readline.cc sql_string.cc) -LINK_DIRECTORIES(${MYSQL_BINARY_DIR}/mysys ${MYSQL_BINARY_DIR}/zlib) -TARGET_LINK_LIBRARIES(mysql mysqlclient mysys zlib dbug wsock32) +ADD_EXECUTABLE(mysql completion_hash.cc mysql.cc readline.cc sql_string.cc ../mysys/my_conio.c) +TARGET_LINK_LIBRARIES(mysql mysqlclient_notls wsock32) -ADD_EXECUTABLE(mysqltest mysqltest.c) -TARGET_LINK_LIBRARIES(mysqltest mysqlclient mysys zlib dbug regex wsock32) +ADD_EXECUTABLE(mysqltest mysqltest.c ../mysys/my_getsystime.c ../mysys/my_copy.c) +TARGET_LINK_LIBRARIES(mysqltest mysqlclient_notls regex wsock32) ADD_EXECUTABLE(mysqlcheck mysqlcheck.c) -TARGET_LINK_LIBRARIES(mysqlcheck mysqlclient dbug zlib wsock32) +TARGET_LINK_LIBRARIES(mysqlcheck mysqlclient_notls wsock32) -ADD_EXECUTABLE(mysqldump mysqldump.c ../sql-common/my_user.c) -TARGET_LINK_LIBRARIES(mysqldump mysqlclient mysys dbug zlib wsock32) +ADD_EXECUTABLE(mysqldump mysqldump.c ../sql-common/my_user.c ../mysys/mf_getdate.c) +TARGET_LINK_LIBRARIES(mysqldump mysqlclient_notls wsock32) ADD_EXECUTABLE(mysqlimport mysqlimport.c) -TARGET_LINK_LIBRARIES(mysqlimport mysqlclient mysys dbug zlib wsock32) +TARGET_LINK_LIBRARIES(mysqlimport mysqlclient_notls wsock32) ADD_EXECUTABLE(mysql_upgrade mysql_upgrade.c ../mysys/my_getpagesize.c) -TARGET_LINK_LIBRARIES(mysql_upgrade mysqlclient mysys dbug zlib wsock32) +TARGET_LINK_LIBRARIES(mysql_upgrade mysqlclient_notls wsock32) ADD_DEPENDENCIES(mysql_upgrade GenFixPrivs) ADD_EXECUTABLE(mysqlshow mysqlshow.c) -TARGET_LINK_LIBRARIES(mysqlshow mysqlclient mysys dbug zlib wsock32) +TARGET_LINK_LIBRARIES(mysqlshow mysqlclient_notls wsock32) -ADD_EXECUTABLE(mysqlbinlog mysqlbinlog.cc ../mysys/mf_tempdir.c ../mysys/my_new.cc - ../mysys/my_bit.c ../mysys/my_bitmap.c - ../mysys/base64.c) -TARGET_LINK_LIBRARIES(mysqlbinlog mysqlclient dbug zlib wsock32) +ADD_EXECUTABLE(mysqlbinlog mysqlbinlog.cc ../mysys/mf_tempdir.c ../mysys/my_new.cc) +TARGET_LINK_LIBRARIES(mysqlbinlog mysqlclient_notls wsock32) ADD_EXECUTABLE(mysqladmin mysqladmin.cc) -TARGET_LINK_LIBRARIES(mysqladmin mysqlclient mysys dbug zlib wsock32) +TARGET_LINK_LIBRARIES(mysqladmin mysqlclient_notls wsock32) ADD_EXECUTABLE(echo echo.c) diff --git a/dbug/CMakeLists.txt b/dbug/CMakeLists.txt index 375fd19fb40..8b27f79dcf4 100755 --- a/dbug/CMakeLists.txt +++ b/dbug/CMakeLists.txt @@ -13,8 +13,12 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX -D__WIN32__") -SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/dbug) -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) -ADD_LIBRARY(dbug dbug.c factorial.c sanity.c) +SET(DBUG_SOURCES dbug.c factorial.c sanity.c) + +IF(NOT SOURCE_SUBLIBS) + SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") + INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) + ADD_LIBRARY(dbug ${DBUG_SOURCES}) +ENDIF(NOT SOURCE_SUBLIBS) diff --git a/extra/CMakeLists.txt b/extra/CMakeLists.txt index 8608e72127b..a909bc93820 100755 --- a/extra/CMakeLists.txt +++ b/extra/CMakeLists.txt @@ -20,7 +20,7 @@ SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) ADD_EXECUTABLE(comp_err comp_err.c) -TARGET_LINK_LIBRARIES(comp_err dbug mysys strings zlib wsock32) +TARGET_LINK_LIBRARIES(comp_err debug dbug mysys strings zlib wsock32) GET_TARGET_PROPERTY(COMP_ERR_EXE comp_err LOCATION) @@ -39,13 +39,13 @@ ADD_CUSTOM_TARGET(GenError DEPENDS ${PROJECT_SOURCE_DIR}/include/mysqld_error.h) ADD_EXECUTABLE(my_print_defaults my_print_defaults.c) -TARGET_LINK_LIBRARIES(my_print_defaults strings mysys dbug taocrypt wsock32) +TARGET_LINK_LIBRARIES(my_print_defaults strings mysys debug dbug taocrypt wsock32) ADD_EXECUTABLE(perror perror.c) -TARGET_LINK_LIBRARIES(perror strings mysys dbug wsock32) +TARGET_LINK_LIBRARIES(perror strings mysys debug dbug wsock32) ADD_EXECUTABLE(replace replace.c) -TARGET_LINK_LIBRARIES(replace strings mysys dbug wsock32) +TARGET_LINK_LIBRARIES(replace strings mysys debug dbug wsock32) IF(EMBED_MANIFESTS) MYSQL_EMBED_MANIFEST("my_print_defaults" "asInvoker") diff --git a/extra/yassl/CMakeLists.txt b/extra/yassl/CMakeLists.txt index 5cc97f22a36..26e682cbb0c 100755 --- a/extra/yassl/CMakeLists.txt +++ b/extra/yassl/CMakeLists.txt @@ -13,9 +13,15 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -ADD_DEFINITIONS("-DWIN32 -D_LIB -DYASSL_PREFIX") +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/extra/yassl/include + ${CMAKE_SOURCE_DIR}/extra/yassl/taocrypt/include + ${CMAKE_SOURCE_DIR}/extra/yassl/taocrypt/mySTL) -INCLUDE_DIRECTORIES(include taocrypt/include taocrypt/mySTL) -ADD_LIBRARY(yassl src/buffer.cpp src/cert_wrapper.cpp src/crypto_wrapper.cpp src/handshake.cpp src/lock.cpp +ADD_DEFINITIONS("-D_LIB -DYASSL_PREFIX") + +SET(YASSL_SOURCES src/buffer.cpp src/cert_wrapper.cpp src/crypto_wrapper.cpp src/handshake.cpp src/lock.cpp src/log.cpp src/socket_wrapper.cpp src/ssl.cpp src/timer.cpp src/yassl_error.cpp src/yassl_imp.cpp src/yassl_int.cpp) +IF(NOT SOURCE_SUBLIBS) + ADD_LIBRARY(yassl ${YASSL_SOURCES}) +ENDIF(NOT SOURCE_SUBLIBS) diff --git a/extra/yassl/taocrypt/CMakeLists.txt b/extra/yassl/taocrypt/CMakeLists.txt index baa8f97dff6..e91fa021de5 100755 --- a/extra/yassl/taocrypt/CMakeLists.txt +++ b/extra/yassl/taocrypt/CMakeLists.txt @@ -13,9 +13,10 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -INCLUDE_DIRECTORIES(mySTL include) +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/extra/yassl/taocrypt/mySTL + ${CMAKE_SOURCE_DIR}/extra/yassl/taocrypt/include) -ADD_LIBRARY(taocrypt src/aes.cpp src/aestables.cpp src/algebra.cpp src/arc4.cpp src/asn.cpp src/coding.cpp +SET(TAOCRYPT_SOURCES src/aes.cpp src/aestables.cpp src/algebra.cpp src/arc4.cpp src/asn.cpp src/coding.cpp src/des.cpp src/dh.cpp src/dsa.cpp src/file.cpp src/hash.cpp src/integer.cpp src/md2.cpp src/md4.cpp src/md5.cpp src/misc.cpp src/random.cpp src/ripemd.cpp src/rsa.cpp src/sha.cpp include/aes.hpp include/algebra.hpp include/arc4.hpp include/asn.hpp include/block.hpp @@ -23,3 +24,6 @@ ADD_LIBRARY(taocrypt src/aes.cpp src/aestables.cpp src/algebra.cpp src/arc4.cpp include/error.hpp include/file.hpp include/hash.hpp include/hmac.hpp include/integer.hpp include/md2.hpp include/md5.hpp include/misc.hpp include/modarith.hpp include/modes.hpp include/random.hpp include/ripemd.hpp include/rsa.hpp include/sha.hpp) +IF(NOT SOURCE_SUBLIBS) + ADD_LIBRARY(taocrypt ${TAOCRYPT_SOURCES}) +ENDIF(NOT SOURCE_SUBLIBS) diff --git a/include/m_ctype.h b/include/m_ctype.h index 9f21ac16a05..218ec2daadb 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -78,8 +78,14 @@ extern MY_UNICASE_INFO *my_unicase_turkish[256]; #define MY_CS_READY 256 /* if a charset is initialized */ #define MY_CS_AVAILABLE 512 /* If either compiled-in or loaded*/ #define MY_CS_CSSORT 1024 /* if case sensitive sort order */ +#define MY_CS_PUREASCII 2048 /* if a charset is pure ascii */ #define MY_CHARSET_UNDEFINED 0 +/* Character repertoire flags */ +#define MY_REPERTOIRE_ASCII 1 /* Pure ASCII U+0000..U+007F */ +#define MY_REPERTOIRE_EXTENDED 2 /* Extended characters: U+0080..U+FFFF */ +#define MY_REPERTOIRE_UNICODE30 3 /* ASCII | EXTENDED: U+0000..U+FFFF */ + typedef struct my_uni_idx_st { @@ -436,6 +442,11 @@ my_bool my_propagate_simple(CHARSET_INFO *cs, const uchar *str, uint len); my_bool my_propagate_complex(CHARSET_INFO *cs, const uchar *str, uint len); +uint my_string_repertoire(CHARSET_INFO *cs, const char *str, ulong len); +my_bool my_charset_is_ascii_based(CHARSET_INFO *cs); +my_bool my_charset_is_8bit_pure_ascii(CHARSET_INFO *cs); + + #define _MY_U 01 /* Upper case */ #define _MY_L 02 /* Lower case */ #define _MY_NMR 04 /* Numeral (digit) */ diff --git a/libmysql/CMakeLists.txt b/libmysql/CMakeLists.txt index 3b18531f6c0..59e70d68a6d 100755 --- a/libmysql/CMakeLists.txt +++ b/libmysql/CMakeLists.txt @@ -14,25 +14,54 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA INCLUDE("${PROJECT_SOURCE_DIR}/win/mysql_manifest.cmake") -# Need to set USE_TLS, since __declspec(thread) approach to thread local -# storage does not work properly in DLLs. -SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX -DUSE_TLS") -SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX -DUSE_TLS") -SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DSAFEMALLOC -DSAFE_MUTEX -DUSE_TLS") -SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DSAFEMALLOC -DSAFE_MUTEX -DUSE_TLS") -SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -DSAFEMALLOC -DSAFE_MUTEX -DUSE_TLS") -SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -DSAFEMALLOC -DSAFE_MUTEX -DUSE_TLS") +SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") +SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") + +# Note that we don't link with the libraries "strings" or "mysys" +# here, instead we recompile the files needed and include them +# directly. This means we don't have to worry here about if these +# libraries are compiled defining USE_TLS or not. Not that it *should* +# have been a problem anyway, they don't use thread local storage. INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include - ${CMAKE_SOURCE_DIR}/zlib - ${CMAKE_SOURCE_DIR}/extra/yassl/include ${CMAKE_SOURCE_DIR}/libmysql ${CMAKE_SOURCE_DIR}/regex ${CMAKE_SOURCE_DIR}/sql ${CMAKE_SOURCE_DIR}/strings) -ADD_LIBRARY(libmysql SHARED dll.c libmysql.def - ../mysys/array.c ../strings/bchange.c ../strings/bmove.c +# We include the source file listing instead of referencing the +# libraries. At least with CMake 2.4 and Visual Studio 2005 a static +# library created from other static libraries would not be complete, +# i.e. the libraries listed in TARGET_LINK_LIBRARIES() were just +# ignored. + + +# Include and add the directory path +SET(SOURCE_SUBLIBS TRUE) + +INCLUDE(${CMAKE_SOURCE_DIR}/zlib/CMakeLists.txt) +FOREACH(rpath ${ZLIB_SOURCES}) + SET(LIB_SOURCES ${LIB_SOURCES} ../zlib/${rpath}) +ENDFOREACH(rpath) + +# FIXME only needed if build type is "Debug", but CMAKE_BUILD_TYPE is +# not set during configure time. +INCLUDE(${CMAKE_SOURCE_DIR}/dbug/CMakeLists.txt) +FOREACH(rpath ${DBUG_SOURCES}) + SET(LIB_SOURCES ${LIB_SOURCES} ../dbug/${rpath}) +ENDFOREACH(rpath) + +INCLUDE(${CMAKE_SOURCE_DIR}/extra/yassl/taocrypt/CMakeLists.txt) +FOREACH(rpath ${TAOCRYPT_SOURCES}) + SET(LIB_SOURCES ${LIB_SOURCES} ../extra/yassl/taocrypt/${rpath}) +ENDFOREACH(rpath) + +INCLUDE(${CMAKE_SOURCE_DIR}/extra/yassl/CMakeLists.txt) +FOREACH(rpath ${YASSL_SOURCES}) + SET(LIB_SOURCES ${LIB_SOURCES} ../extra/yassl/${rpath}) +ENDFOREACH(rpath) + +SET(CLIENT_SOURCES ../mysys/array.c ../strings/bchange.c ../strings/bmove.c ../strings/bmove_upp.c ../mysys/charset-def.c ../mysys/charset.c ../sql-common/client.c ../strings/ctype-big5.c ../strings/ctype-bin.c ../strings/ctype-cp932.c ../strings/ctype-czech.c ../strings/ctype-euc_kr.c @@ -41,10 +70,11 @@ ADD_LIBRARY(libmysql SHARED dll.c libmysql.def ../strings/ctype-simple.c ../strings/ctype-sjis.c ../strings/ctype-tis620.c ../strings/ctype-uca.c ../strings/ctype-ucs2.c ../strings/ctype-ujis.c ../strings/ctype-utf8.c ../strings/ctype-win1250ch.c ../strings/ctype.c - ../mysys/default.c ../libmysql/errmsg.c ../mysys/errors.c - ../libmysql/get_password.c ../strings/int2str.c ../strings/is_prefix.c - ../libmysql/libmysql.c ../mysys/list.c ../strings/llstr.c - ../strings/longlong2str.c ../libmysql/manager.c ../mysys/mf_cache.c + ../mysys/default.c errmsg.c ../mysys/errors.c + ../mysys/hash.c ../mysys/my_sleep.c ../mysys/default_modify.c + get_password.c ../strings/int2str.c ../strings/is_prefix.c + libmysql.c ../mysys/list.c ../strings/llstr.c + ../strings/longlong2str.c manager.c ../mysys/mf_cache.c ../mysys/mf_dirname.c ../mysys/mf_fn_ext.c ../mysys/mf_format.c ../mysys/mf_iocache.c ../mysys/mf_iocache2.c ../mysys/mf_loadpath.c ../mysys/mf_pack.c ../mysys/mf_path.c ../mysys/mf_tempfile.c ../mysys/mf_unixpath.c @@ -66,9 +96,34 @@ ADD_LIBRARY(libmysql SHARED dll.c libmysql.def ../strings/strmov.c ../strings/strnlen.c ../strings/strnmov.c ../strings/strtod.c ../strings/strtoll.c ../strings/strtoull.c ../strings/strxmov.c ../strings/strxnmov.c ../mysys/thr_mutex.c ../mysys/typelib.c ../vio/vio.c ../vio/viosocket.c - ../vio/viossl.c ../vio/viosslfactories.c ../strings/xml.c) -ADD_DEPENDENCIES(libmysql dbug vio mysys strings GenError zlib yassl taocrypt) -TARGET_LINK_LIBRARIES(libmysql mysys strings wsock32) + ../vio/viossl.c ../vio/viosslfactories.c ../strings/xml.c + ${LIB_SOURCES}) + +# Need to set USE_TLS for building the DLL, since __declspec(thread) +# approach to thread local storage does not work properly in DLLs. +# +# The static library might be used to form another DLL, as is the case +# with the ODBC driver, so it has to be compiled with USE_TLS as well. +# +# We create a third library without USE_TLS for internal use. We can't +# be sure that some client application part of this build doesn't go +# beond the documented API, and try access the Thread Local Storage. +# The "_notls" means no Tls*() functions used, i.e. "static" TLS. + +ADD_LIBRARY(libmysql SHARED ${CLIENT_SOURCES} dll.c libmysql.def) +ADD_LIBRARY(mysqlclient STATIC ${CLIENT_SOURCES}) +ADD_LIBRARY(mysqlclient_notls STATIC ${CLIENT_SOURCES}) + +SET_TARGET_PROPERTIES(libmysql mysqlclient PROPERTIES COMPILE_FLAGS "-DUSE_TLS") + +ADD_DEPENDENCIES(libmysql GenError) +TARGET_LINK_LIBRARIES(libmysql wsock32) + +ADD_DEPENDENCIES(mysqlclient GenError) +TARGET_LINK_LIBRARIES(mysqlclient) + +ADD_DEPENDENCIES(mysqlclient_notls GenError) +TARGET_LINK_LIBRARIES(mysqlclient_notls) ADD_EXECUTABLE(myTest mytest.c) TARGET_LINK_LIBRARIES(myTest libmysql) diff --git a/myisam/CMakeLists.txt b/myisam/CMakeLists.txt index 94a7ffc9952..a557d61b87f 100755 --- a/myisam/CMakeLists.txt +++ b/myisam/CMakeLists.txt @@ -30,16 +30,16 @@ ADD_LIBRARY(myisam ft_boolean_search.c ft_nlq_search.c ft_parser.c ft_static.c f rt_split.c sort.c sp_key.c ft_eval.h myisamdef.h rt_index.h mi_rkey.c) ADD_EXECUTABLE(myisam_ftdump myisam_ftdump.c) -TARGET_LINK_LIBRARIES(myisam_ftdump myisam mysys dbug strings zlib wsock32) +TARGET_LINK_LIBRARIES(myisam_ftdump myisam mysys debug dbug strings zlib wsock32) ADD_EXECUTABLE(myisamchk myisamchk.c) -TARGET_LINK_LIBRARIES(myisamchk myisam mysys dbug strings zlib wsock32) +TARGET_LINK_LIBRARIES(myisamchk myisam mysys debug dbug strings zlib wsock32) ADD_EXECUTABLE(myisamlog myisamlog.c) -TARGET_LINK_LIBRARIES(myisamlog myisam mysys dbug strings zlib wsock32) +TARGET_LINK_LIBRARIES(myisamlog myisam mysys debug dbug strings zlib wsock32) ADD_EXECUTABLE(myisampack myisampack.c) -TARGET_LINK_LIBRARIES(myisampack myisam mysys dbug strings zlib wsock32) +TARGET_LINK_LIBRARIES(myisampack myisam mysys debug dbug strings zlib wsock32) IF(EMBED_MANIFESTS) MYSQL_EMBED_MANIFEST("myisam_ftdump" "asInvoker") diff --git a/myisam/myisamchk.c b/myisam/myisamchk.c index 0332644c5a6..d0117e12ede 100644 --- a/myisam/myisamchk.c +++ b/myisam/myisamchk.c @@ -337,7 +337,7 @@ static struct my_option my_long_options[] = (gptr*) &ft_stopword_file, (gptr*) &ft_stopword_file, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"stats_method", OPT_STATS_METHOD, - "Specifies how index statistics collection code should threat NULLs. " + "Specifies how index statistics collection code should treat NULLs. " "Possible values of name are \"nulls_unequal\" (default behavior for 4.1/5.0), " "\"nulls_equal\" (emulate 4.0 behavior), and \"nulls_ignored\".", (gptr*) &myisam_stats_method_str, (gptr*) &myisam_stats_method_str, 0, @@ -452,7 +452,7 @@ static void usage(void) MySQL faster. You can check the calculated distribution\n\ by using '--description --verbose table_name'.\n\ --stats_method=name Specifies how index statistics collection code should\n\ - threat NULLs. Possible values of name are \"nulls_unequal\"\n\ + treat NULLs. Possible values of name are \"nulls_unequal\"\n\ (default for 4.1/5.0), \"nulls_equal\" (emulate 4.0), and \n\ \"nulls_ignored\".\n\ -d, --description Prints some information about table.\n\ diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index 43b1ef7ac86..5c362cddfa1 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -708,6 +708,7 @@ sub command_line_setup () { if (!$opt_extern) { $exe_mysqld= mtr_exe_exists (vs_config_dirs('sql', 'mysqld'), + vs_config_dirs('sql', 'mysqld-debug'), "$glob_basedir/sql/mysqld", "$path_client_bindir/mysqld-max-nt", "$path_client_bindir/mysqld-max", @@ -2436,6 +2437,7 @@ sub vs_config_dirs ($$) { } return ("$glob_basedir/$path_part/release/$exe", + "$glob_basedir/$path_part/relwithdebinfo/$exe", "$glob_basedir/$path_part/debug/$exe"); } diff --git a/mysql-test/r/ctype_ucs.result b/mysql-test/r/ctype_ucs.result index 006f4193ca1..023267c227c 100644 --- a/mysql-test/r/ctype_ucs.result +++ b/mysql-test/r/ctype_ucs.result @@ -896,4 +896,30 @@ select hex(convert(s1 using latin1)) from t1; hex(convert(s1 using latin1)) 7F drop table t1; +create table t1 (a varchar(15) character set ascii not null, b int); +insert into t1 values ('a',1); +select concat(a,if(b<10,_ucs2 0x0061,_ucs2 0x0062)) from t1; +concat(a,if(b<10,_ucs2 0x0061,_ucs2 0x0062)) +aa +select concat(a,if(b>10,_ucs2 0x0061,_ucs2 0x0062)) from t1; +concat(a,if(b>10,_ucs2 0x0061,_ucs2 0x0062)) +ab +select * from t1 where a=if(b<10,_ucs2 0x0061,_ucs2 0x0062); +a b +a 1 +select * from t1 where a=if(b>10,_ucs2 0x0061,_ucs2 0x0062); +a b +select concat(a,if(b<10,_ucs2 0x00C0,_ucs2 0x0062)) from t1; +ERROR HY000: Illegal mix of collations (ascii_general_ci,IMPLICIT) and (ucs2_general_ci,COERCIBLE) for operation 'concat' +select concat(a,if(b>10,_ucs2 0x00C0,_ucs2 0x0062)) from t1; +ERROR HY000: Illegal mix of collations (ascii_general_ci,IMPLICIT) and (ucs2_general_ci,COERCIBLE) for operation 'concat' +select concat(a,if(b<10,_ucs2 0x0062,_ucs2 0x00C0)) from t1; +ERROR HY000: Illegal mix of collations (ascii_general_ci,IMPLICIT) and (ucs2_general_ci,COERCIBLE) for operation 'concat' +select concat(a,if(b>10,_ucs2 0x0062,_ucs2 0x00C0)) from t1; +ERROR HY000: Illegal mix of collations (ascii_general_ci,IMPLICIT) and (ucs2_general_ci,COERCIBLE) for operation 'concat' +select * from t1 where a=if(b<10,_ucs2 0x00C0,_ucs2 0x0062); +ERROR HY000: Illegal mix of collations (ascii_general_ci,IMPLICIT) and (ucs2_general_ci,COERCIBLE) for operation '=' +select * from t1 where a=if(b<10,_ucs2 0x0062,_ucs2 0x00C0); +ERROR HY000: Illegal mix of collations (ascii_general_ci,IMPLICIT) and (ucs2_general_ci,COERCIBLE) for operation '=' +drop table t1; End of 5.0 tests diff --git a/mysql-test/r/ctype_utf8.result b/mysql-test/r/ctype_utf8.result index d38480dced1..710cac388a5 100644 --- a/mysql-test/r/ctype_utf8.result +++ b/mysql-test/r/ctype_utf8.result @@ -1639,6 +1639,42 @@ coercibility(col1) collation(col1) 0 utf8_swedish_ci drop view v1, v2; drop table t1; +set names utf8; +create table t1 (a varchar(10) character set latin1, b int); +insert into t1 values ('a',1); +select concat(a, if(b>10, N'x', N'y')) from t1; +concat(a, if(b>10, N'x', N'y')) +ay +select concat(a, if(b>10, N'æ', N'ß')) from t1; +ERROR HY000: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'concat' +drop table t1; +set names utf8; +create table t1 (a varchar(10) character set latin1, b int); +insert into t1 values ('a',1); +select concat(a, if(b>10, _utf8'x', _utf8'y')) from t1; +concat(a, if(b>10, _utf8'x', _utf8'y')) +ay +select concat(a, if(b>10, _utf8'æ', _utf8'ß')) from t1; +ERROR HY000: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'concat' +drop table t1; +set names utf8; +create table t1 (a varchar(10) character set latin1, b int); +insert into t1 values ('a',1); +select concat(a, if(b>10, _utf8 0x78, _utf8 0x79)) from t1; +concat(a, if(b>10, _utf8 0x78, _utf8 0x79)) +ay +select concat(a, if(b>10, _utf8 0xC3A6, _utf8 0xC3AF)) from t1; +ERROR HY000: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'concat' +drop table t1; +set names utf8; +create table t1 (a varchar(10) character set latin1, b int); +insert into t1 values ('a',1); +select concat(a, if(b>10, 'x' 'x', 'y' 'y')) from t1; +concat(a, if(b>10, 'x' 'x', 'y' 'y')) +ayy +select concat(a, if(b>10, 'x' 'æ', 'y' 'ß')) from t1; +ERROR HY000: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'concat' +drop table t1; CREATE TABLE t1 ( colA int(11) NOT NULL, colB varchar(255) character set utf8 NOT NULL, diff --git a/mysql-test/r/federated.result b/mysql-test/r/federated.result index 74fa20af685..2e7d0ddcea7 100644 --- a/mysql-test/r/federated.result +++ b/mysql-test/r/federated.result @@ -1920,6 +1920,20 @@ a b 2 Curly drop table federated.t1; drop table federated.t1; + +Bug#18287 create federated table always times out, error 1159 ' ' + +Test that self-references work + +create table federated.t1 (a int primary key); +create table federated.t2 (a int primary key) +ENGINE=FEDERATED +connection='mysql://root@127.0.0.1:SLAVE_PORT/federated/t1'; +insert into federated.t1 (a) values (1); +select * from federated.t2; +a +1 +drop table federated.t1, federated.t2; DROP TABLE IF EXISTS federated.t1; DROP DATABASE IF EXISTS federated; DROP TABLE IF EXISTS federated.t1; diff --git a/mysql-test/r/func_time.result b/mysql-test/r/func_time.result index f92ecac329a..ee8b8c1e908 100644 --- a/mysql-test/r/func_time.result +++ b/mysql-test/r/func_time.result @@ -1246,3 +1246,19 @@ SELECT TIME_FORMAT(SEC_TO_TIME(a),"%H:%i:%s") FROM (SELECT 3020399 AS a UNION SE TIME_FORMAT(SEC_TO_TIME(a),"%H:%i:%s") 838:59:58 838:59:59 +set names latin1; +create table t1 (a varchar(15) character set ascii not null); +insert into t1 values ('070514-000000'); +select concat(a,ifnull(min(date_format(now(), '%Y-%m-%d')),' ull')) from t1; +concat(a,ifnull(min(date_format(now(), '%Y-%m-%d')),' ull')) +# +set names swe7; +select concat(a,ifnull(min(date_format(now(), '%Y-%m-%d')),' ull')) from t1; +ERROR HY000: Illegal mix of collations (ascii_general_ci,IMPLICIT) and (swe7_swedish_ci,COERCIBLE) for operation 'concat' +set names latin1; +set lc_time_names=fr_FR; +select concat(a,ifnull(min(date_format(now(), '%Y-%m-%d')),' ull')) from t1; +ERROR HY000: Illegal mix of collations (ascii_general_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation 'concat' +set lc_time_names=en_US; +drop table t1; +End of 5.0 tests diff --git a/mysql-test/t/ctype_ucs.test b/mysql-test/t/ctype_ucs.test index 18a18d6c632..bca3a9c3a96 100644 --- a/mysql-test/t/ctype_ucs.test +++ b/mysql-test/t/ctype_ucs.test @@ -622,4 +622,33 @@ select hex(s2) from t1; select hex(convert(s1 using latin1)) from t1; drop table t1; +# +# Conversion from UCS2 to ASCII is possible +# if the UCS2 string consists of only ASCII characters +# +create table t1 (a varchar(15) character set ascii not null, b int); +insert into t1 values ('a',1); +select concat(a,if(b<10,_ucs2 0x0061,_ucs2 0x0062)) from t1; +select concat(a,if(b>10,_ucs2 0x0061,_ucs2 0x0062)) from t1; +select * from t1 where a=if(b<10,_ucs2 0x0061,_ucs2 0x0062); +select * from t1 where a=if(b>10,_ucs2 0x0061,_ucs2 0x0062); + +# +# Conversion from UCS2 to ASCII is not possible if +# the UCS2 string has non-ASCII characters +# +--error 1267 +select concat(a,if(b<10,_ucs2 0x00C0,_ucs2 0x0062)) from t1; +--error 1267 +select concat(a,if(b>10,_ucs2 0x00C0,_ucs2 0x0062)) from t1; +--error 1267 +select concat(a,if(b<10,_ucs2 0x0062,_ucs2 0x00C0)) from t1; +--error 1267 +select concat(a,if(b>10,_ucs2 0x0062,_ucs2 0x00C0)) from t1; +--error 1267 +select * from t1 where a=if(b<10,_ucs2 0x00C0,_ucs2 0x0062); +--error 1267 +select * from t1 where a=if(b<10,_ucs2 0x0062,_ucs2 0x00C0); +drop table t1; + --echo End of 5.0 tests diff --git a/mysql-test/t/ctype_utf8.test b/mysql-test/t/ctype_utf8.test index 0f1a7cf8c84..f8eed0bae9a 100644 --- a/mysql-test/t/ctype_utf8.test +++ b/mysql-test/t/ctype_utf8.test @@ -1314,6 +1314,46 @@ select coercibility(col1), collation(col1) from v2; drop view v1, v2; drop table t1; +# +# Check conversion of NCHAR strings to subset (e.g. latin1). +# Conversion is possible if string repertoire is ASCII. +# Conversion is not possible if the string have extended characters +# +set names utf8; +create table t1 (a varchar(10) character set latin1, b int); +insert into t1 values ('a',1); +select concat(a, if(b>10, N'x', N'y')) from t1; +--error 1267 +select concat(a, if(b>10, N'æ', N'ß')) from t1; +drop table t1; + +# Conversion tests for character set introducers +set names utf8; +create table t1 (a varchar(10) character set latin1, b int); +insert into t1 values ('a',1); +select concat(a, if(b>10, _utf8'x', _utf8'y')) from t1; +--error 1267 +select concat(a, if(b>10, _utf8'æ', _utf8'ß')) from t1; +drop table t1; + +# Conversion tests for introducer + HEX string +set names utf8; +create table t1 (a varchar(10) character set latin1, b int); +insert into t1 values ('a',1); +select concat(a, if(b>10, _utf8 0x78, _utf8 0x79)) from t1; +--error 1267 +select concat(a, if(b>10, _utf8 0xC3A6, _utf8 0xC3AF)) from t1; +drop table t1; + +# Conversion tests for "text_literal TEXT_STRING_literal" syntax structure +set names utf8; +create table t1 (a varchar(10) character set latin1, b int); +insert into t1 values ('a',1); +select concat(a, if(b>10, 'x' 'x', 'y' 'y')) from t1; +--error 1267 +select concat(a, if(b>10, 'x' 'æ', 'y' 'ß')) from t1; +drop table t1; + # # Bug#19960: Inconsistent results when joining diff --git a/mysql-test/t/federated.test b/mysql-test/t/federated.test index 63809373822..cc66a6ab4bc 100644 --- a/mysql-test/t/federated.test +++ b/mysql-test/t/federated.test @@ -1671,5 +1671,19 @@ drop table federated.t1; connection slave; drop table federated.t1; +--echo +--echo Bug#18287 create federated table always times out, error 1159 ' ' +--echo +--echo Test that self-references work +--echo +connection slave; +create table federated.t1 (a int primary key); +--replace_result $SLAVE_MYPORT SLAVE_PORT +eval create table federated.t2 (a int primary key) + ENGINE=FEDERATED + connection='mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t1'; +insert into federated.t1 (a) values (1); +select * from federated.t2; +drop table federated.t1, federated.t2; source include/federated_cleanup.inc; diff --git a/mysql-test/t/func_time.test b/mysql-test/t/func_time.test index 4f35a681228..86c848983fa 100644 --- a/mysql-test/t/func_time.test +++ b/mysql-test/t/func_time.test @@ -752,3 +752,29 @@ DROP TABLE t1; # Check if using GROUP BY with TIME_FORMAT() produces correct results SELECT TIME_FORMAT(SEC_TO_TIME(a),"%H:%i:%s") FROM (SELECT 3020399 AS a UNION SELECT 3020398 ) x GROUP BY 1; + +# +# Bug#28875 Conversion between ASCII and LATIN1 charsets does not function +# +set names latin1; +create table t1 (a varchar(15) character set ascii not null); +insert into t1 values ('070514-000000'); +# Conversion of date_format() result to ASCII +# is safe with the default locale en_US +--replace_column 1 # +select concat(a,ifnull(min(date_format(now(), '%Y-%m-%d')),' ull')) from t1; +# Error for swe7: it is not ASCII compatible +set names swe7; +--error 1267 +select concat(a,ifnull(min(date_format(now(), '%Y-%m-%d')),' ull')) from t1; +set names latin1; +# Conversion of date_format() result to ASCII +# is not safe with the non-default locale fr_FR +# because month and day names can have accented characters +set lc_time_names=fr_FR; +--error 1267 +select concat(a,ifnull(min(date_format(now(), '%Y-%m-%d')),' ull')) from t1; +set lc_time_names=en_US; +drop table t1; + +--echo End of 5.0 tests diff --git a/mysys/CMakeLists.txt b/mysys/CMakeLists.txt index 608d7cb1ce9..8aaf0b5f00f 100755 --- a/mysys/CMakeLists.txt +++ b/mysys/CMakeLists.txt @@ -13,20 +13,15 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") -# Need to set USE_TLS, since mysys is linked into libmysql.dll and -# libmysqld.dll, and __declspec(thread) approach to thread local storage does -# not work properly in DLLs. -# Currently, USE_TLS crashes in Debug builds, so until that is fixed Debug -# .dlls cannot be loaded at runtime. -SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DUSE_TLS") -SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -DUSE_TLS") -SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DUSE_TLS") -SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -DUSE_TLS") +# Only the server link with this library, the client libraries and the client +# executables all link with recompiles of source found in the "mysys" directory. +# So we only need to create one version of this library, with the "static" +# Thread Local Storage model. + +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/zlib ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/mysys) -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/zlib ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/mysys ) ADD_LIBRARY(mysys array.c charset-def.c charset.c checksum.c default.c default_modify.c errors.c hash.c list.c md5.c mf_brkhant.c mf_cache.c mf_dirname.c mf_fn_ext.c mf_format.c mf_getdate.c mf_iocache.c mf_iocache2.c mf_keycache.c diff --git a/mysys/charset.c b/mysys/charset.c index 9ea17c6515c..4c3f2d0ab71 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -277,6 +277,9 @@ static int add_collation(CHARSET_INFO *cs) if (sort_order && sort_order['A'] < sort_order['a'] && sort_order['a'] < sort_order['B']) all_charsets[cs->number]->state|= MY_CS_CSSORT; + + if (my_charset_is_8bit_pure_ascii(all_charsets[cs->number])) + all_charsets[cs->number]->state|= MY_CS_PUREASCII; } } else diff --git a/mysys/thr_lock.c b/mysys/thr_lock.c index 93884921687..02c9f08c946 100644 --- a/mysys/thr_lock.c +++ b/mysys/thr_lock.c @@ -383,6 +383,9 @@ static inline my_bool have_specific_lock(THR_LOCK_DATA *data, } +static void wake_up_waiters(THR_LOCK *lock); + + static enum enum_thr_lock_result wait_for_lock(struct st_lock_list *wait, THR_LOCK_DATA *data, my_bool in_wait_list) @@ -444,8 +447,13 @@ wait_for_lock(struct st_lock_list *wait, THR_LOCK_DATA *data, else wait->last=data->prev; data->type= TL_UNLOCK; /* No lock */ + check_locks(data->lock, "killed or timed out wait_for_lock", 1); + wake_up_waiters(data->lock); + } + else + { + check_locks(data->lock, "aborted wait_for_lock", 0); } - check_locks(data->lock,"failed wait_for_lock",0); } else { @@ -771,6 +779,26 @@ void thr_unlock(THR_LOCK_DATA *data) lock->read_no_write_count--; data->type=TL_UNLOCK; /* Mark unlocked */ check_locks(lock,"after releasing lock",1); + wake_up_waiters(lock); + pthread_mutex_unlock(&lock->mutex); + DBUG_VOID_RETURN; +} + + +/** + @brief Wake up all threads which pending requests for the lock + can be satisfied. + + @param lock Lock for which threads should be woken up + +*/ + +static void wake_up_waiters(THR_LOCK *lock) +{ + THR_LOCK_DATA *data; + enum thr_lock_type lock_type; + + DBUG_ENTER("wake_up_waiters"); if (!lock->write.data) /* If no active write locks */ { @@ -820,11 +848,7 @@ void thr_unlock(THR_LOCK_DATA *data) data=lock->write_wait.data; /* Free this too */ } if (data->type >= TL_WRITE_LOW_PRIORITY) - { - check_locks(lock,"giving write lock",0); - pthread_mutex_unlock(&lock->mutex); - DBUG_VOID_RETURN; - } + goto end; /* Release possible read locks together with the write lock */ } if (lock->read_wait.data) @@ -879,8 +903,7 @@ void thr_unlock(THR_LOCK_DATA *data) free_all_read_locks(lock,0); } end: - check_locks(lock,"thr_unlock",0); - pthread_mutex_unlock(&lock->mutex); + check_locks(lock, "after waking up waiters", 0); DBUG_VOID_RETURN; } @@ -1094,6 +1117,7 @@ my_bool thr_abort_locks_for_thread(THR_LOCK *lock, pthread_t thread) lock->write_wait.last= data->prev; } } + wake_up_waiters(lock); pthread_mutex_unlock(&lock->mutex); DBUG_RETURN(found); } diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt index e9113b098da..6fbfcab72d4 100755 --- a/scripts/CMakeLists.txt +++ b/scripts/CMakeLists.txt @@ -24,7 +24,7 @@ ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_SOURCE_DIR}/scripts/mysql_fix_privilege_tabl # Build comp_sql - used for embedding SQL in C or C++ programs ADD_EXECUTABLE(comp_sql comp_sql.c) -TARGET_LINK_LIBRARIES(comp_sql dbug mysys strings) +TARGET_LINK_LIBRARIES(comp_sql debug dbug mysys strings) # Use comp_sql to build mysql_fix_privilege_tables_sql.c GET_TARGET_PROPERTY(COMP_SQL_EXE comp_sql LOCATION) diff --git a/scripts/make_win_bin_dist b/scripts/make_win_bin_dist index beb274ca1a3..849226c94ea 100755 --- a/scripts/make_win_bin_dist +++ b/scripts/make_win_bin_dist @@ -144,14 +144,16 @@ fi mkdir $DESTDIR mkdir $DESTDIR/bin -cp client/$TARGET/*.exe $DESTDIR/bin/ -cp extra/$TARGET/*.exe $DESTDIR/bin/ -cp myisam/$TARGET/*.exe $DESTDIR/bin/ -cp server-tools/instance-manager/$TARGET/*.exe $DESTDIR/bin/ -cp server-tools/instance-manager/$TARGET/*.pdb $DESTDIR/bin/ || true -cp server-tools/instance-manager/$TARGET/*.map $DESTDIR/bin/ || true -cp tests/$TARGET/*.exe $DESTDIR/bin/ -cp libmysql/$TARGET/libmysql.dll $DESTDIR/bin/ +cp client/$TARGET/*.exe $DESTDIR/bin/ +cp extra/$TARGET/*.exe $DESTDIR/bin/ +cp myisam/$TARGET/*.exe $DESTDIR/bin/ +cp server-tools/instance-manager/$TARGET/*.{exe,map} $DESTDIR/bin/ +if [ x"$TARGET" != x"release" ] ; then + cp server-tools/instance-manager/$TARGET/*.pdb $DESTDIR/bin/ +fi +cp tests/$TARGET/*.exe $DESTDIR/bin/ +cp libmysql/$TARGET/*.exe $DESTDIR/bin/ +cp libmysql/$TARGET/libmysql.dll $DESTDIR/bin/ # FIXME really needed?! mv $DESTDIR/bin/comp_err.exe $DESTDIR/bin/comp-err.exe @@ -164,8 +166,10 @@ fi # Depending on Visual Studio target, the optimized server has symbols cp sql/$TARGET/$BASENAME.exe $DESTDIR/bin/$BASENAME$EXE_SUFFIX.exe -cp sql/$TARGET/$BASENAME.pdb $DESTDIR/bin/$BASENAME$EXE_SUFFIX.pdb || true -cp sql/$TARGET/$BASENAME.map $DESTDIR/bin/$BASENAME$EXE_SUFFIX.map || true +cp sql/$TARGET/$BASENAME.map $DESTDIR/bin/$BASENAME$EXE_SUFFIX.map +if [ x"$TARGET" != x"release" ] ; then + cp sql/$TARGET/$BASENAME.pdb $DESTDIR/bin/$BASENAME$EXE_SUFFIX.pdb +fi if [ -f "sql/debug/mysqld-debug.exe" ] ; then BASENAME="mysqld-debug" # Old style non CMake build @@ -176,19 +180,16 @@ fi if [ x"$PACK_DEBUG" = x"" -a -f "sql/debug/$BASENAME.exe" -o \ x"$PACK_DEBUG" = x"yes" ] ; then cp sql/debug/$BASENAME.exe $DESTDIR/bin/mysqld-debug.exe - cp sql/debug/$BASENAME.pdb $DESTDIR/bin/mysqld-debug.pdb || true - cp sql/debug/$BASENAME.map $DESTDIR/bin/mysqld-debug.map || true + cp sql/debug/$BASENAME.pdb $DESTDIR/bin/mysqld-debug.pdb + cp sql/debug/$BASENAME.map $DESTDIR/bin/mysqld-debug.map fi # ---------------------------------------------------------------------- # Copy data directory, readme files etc # ---------------------------------------------------------------------- -# FIXME is there ever a data directory to copy? if [ -d win/data ] ; then cp -pR win/data $DESTDIR/ -elif [ -d data ] ; then - cp -pR data $DESTDIR/ fi # FIXME maybe a flag to define "release build", or do the @@ -218,16 +219,22 @@ copy_embedded() $DESTDIR/include cp libmysqld/libmysqld.def $DESTDIR/include/ cp libmysqld/$TARGET/mysqlserver.lib $DESTDIR/Embedded/static/release/ + cp libmysqld/$TARGET/mysqlserver.pdb $DESTDIR/Embedded/static/release/ cp libmysqld/$TARGET/libmysqld.dll $DESTDIR/Embedded/DLL/release/ cp libmysqld/$TARGET/libmysqld.exp $DESTDIR/Embedded/DLL/release/ cp libmysqld/$TARGET/libmysqld.lib $DESTDIR/Embedded/DLL/release/ + cp libmysqld/$TARGET/libmysqld.pdb $DESTDIR/Embedded/DLL/release/ if [ x"$PACK_DEBUG" = x"" -a -f "libmysqld/debug/libmysqld.lib" -o \ x"$PACK_DEBUG" = x"yes" ] ; then - mkdir -p $DESTDIR/Embedded/DLL/debug + mkdir -p $DESTDIR/Embedded/DLL/debug \ + $DESTDIR/Embedded/static/debug + cp libmysqld/debug/mysqlserver.lib $DESTDIR/Embedded/static/debug/ + cp libmysqld/debug/mysqlserver.pdb $DESTDIR/Embedded/static/debug/ cp libmysqld/debug/libmysqld.dll $DESTDIR/Embedded/DLL/debug/ cp libmysqld/debug/libmysqld.exp $DESTDIR/Embedded/DLL/debug/ cp libmysqld/debug/libmysqld.lib $DESTDIR/Embedded/DLL/debug/ + cp libmysqld/debug/libmysqld.pdb $DESTDIR/Embedded/DLL/debug/ fi } @@ -287,7 +294,8 @@ cp include/mysql.h \ mkdir -p $DESTDIR/lib/opt cp libmysql/$TARGET/libmysql.dll \ libmysql/$TARGET/libmysql.lib \ - client/$TARGET/mysqlclient.lib \ + libmysql/$TARGET/mysqlclient.lib \ + mysys/$TARGET/mysys.lib \ regex/$TARGET/regex.lib \ strings/$TARGET/strings.lib \ zlib/$TARGET/zlib.lib $DESTDIR/lib/opt/ @@ -297,54 +305,25 @@ if [ x"$PACK_DEBUG" = x"" -a -f "libmysql/debug/libmysql.lib" -o \ mkdir -p $DESTDIR/lib/debug cp libmysql/debug/libmysql.dll \ libmysql/debug/libmysql.lib \ - client/debug/mysqlclient.lib \ + libmysql/debug/mysqlclient.lib \ + mysys/debug/mysys.lib \ regex/debug/regex.lib \ strings/debug/strings.lib \ zlib/debug/zlib.lib $DESTDIR/lib/debug/ - - if [ -f "mysys/debug/mysys-nt.lib" ] ; then - cp mysys/debug/mysys-nt.lib $DESTDIR/lib/debug/ - else - cp mysys/debug/mysys.lib $DESTDIR/lib/debug/mysys-nt.lib - fi - -fi - -if [ -f "mysys/$TARGET/mysys-nt.lib" ] ; then - cp mysys/$TARGET/mysys-nt.lib $DESTDIR/lib/opt/ -else - cp mysys/$TARGET/mysys.lib $DESTDIR/lib/opt/mysys-nt.lib fi # ---------------------------------------------------------------------- # Copy the test directory # ---------------------------------------------------------------------- -mkdir -p $DESTDIR/mysql-test/include $DESTDIR/mysql-test/lib \ - $DESTDIR/mysql-test/r $DESTDIR/mysql-test/std_data \ - $DESTDIR/mysql-test/t +mkdir $DESTDIR/mysql-test cp mysql-test/mysql-test-run.pl $DESTDIR/mysql-test/ cp mysql-test/README $DESTDIR/mysql-test/ -cp mysql-test/install_test_db.sh $DESTDIR/mysql-test/install_test_db -cp mysql-test/include/*.inc $DESTDIR/mysql-test/include/ -cp mysql-test/include/*.test $DESTDIR/mysql-test/include/ -cp mysql-test/lib/*.pl $DESTDIR/mysql-test/lib/ -cp mysql-test/lib/*.sql $DESTDIR/mysql-test/lib/ || true -cp mysql-test/r/*.require $DESTDIR/mysql-test/r/ -# Need this trick, or we get "argument list too long". -ABS_DST=`pwd`/$DESTDIR -(cd mysql-test/r/ && cp *.result $ABS_DST/mysql-test/r/) -cp mysql-test/std_data/* $DESTDIR/mysql-test/std_data/ -cp mysql-test/t/*.opt $DESTDIR/mysql-test/t/ -cp mysql-test/t/*.sh $DESTDIR/mysql-test/t/ -cp mysql-test/t/*.slave-mi $DESTDIR/mysql-test/t/ -cp mysql-test/t/*.sql $DESTDIR/mysql-test/t/ -cp mysql-test/t/*.def $DESTDIR/mysql-test/t/ -(cd mysql-test/t/ && cp *.test $ABS_DST/mysql-test/t/) +cp -R mysql-test/{t,r,include,suite,std_data,lib} $DESTDIR/mysql-test/ # Note that this will not copy "extra" if a soft link if [ -d mysql-test/extra ] ; then - mkdir -p $DESTDIR/mysql-test/extra + mkdir $DESTDIR/mysql-test/extra cp -pR mysql-test/extra/* $DESTDIR/mysql-test/extra/ fi @@ -372,11 +351,7 @@ for i in `cd scripts && ls`; do \ fi; \ done -if [ -d "share" ] ; then - cp -pR share $DESTDIR/ -else - cp -pR sql/share $DESTDIR/ -fi +cp -pR sql/share $DESTDIR/ cp -pR sql-bench $DESTDIR/ rm -f $DESTDIR/sql-bench/*.sh $DESTDIR/sql-bench/Makefile* @@ -384,6 +359,12 @@ rm -f $DESTDIR/sql-bench/*.sh $DESTDIR/sql-bench/Makefile* mv $DESTDIR/scripts/*.sql $DESTDIR/share/ || true # ---------------------------------------------------------------------- +# Clean up from possibly copied SCCS directories +# ---------------------------------------------------------------------- + +rm -rf `find $DISTDIR -type d -name SCCS -print` + +# ---------------------------------------------------------------------- # Copy other files specified on command line DEST=SOURCE # ---------------------------------------------------------------------- diff --git a/server-tools/instance-manager/CMakeLists.txt b/server-tools/instance-manager/CMakeLists.txt index b7e2f08ff6e..1452cdaf20b 100755 --- a/server-tools/instance-manager/CMakeLists.txt +++ b/server-tools/instance-manager/CMakeLists.txt @@ -30,7 +30,7 @@ ADD_EXECUTABLE(mysqlmanager buffer.cc command.cc commands.cc guardian.cc instanc ../../libmysql/errmsg.c) ADD_DEPENDENCIES(mysqlmanager GenError) -TARGET_LINK_LIBRARIES(mysqlmanager dbug mysys strings taocrypt vio yassl zlib wsock32) +TARGET_LINK_LIBRARIES(mysqlmanager debug dbug mysys strings taocrypt vio yassl zlib wsock32) IF(EMBED_MANIFESTS) MYSQL_EMBED_MANIFEST("mysqlmanager" "asInvoker") diff --git a/sql/CMakeLists.txt b/sql/CMakeLists.txt index b0553f622f8..0c4aeaf6043 100755 --- a/sql/CMakeLists.txt +++ b/sql/CMakeLists.txt @@ -51,7 +51,7 @@ ADD_EXECUTABLE(mysqld${MYSQLD_EXE_SUFFIX} discover.cc ../libmysql/errmsg.c field.cc field_conv.cc filesort.cc gstream.cc ha_blackhole.cc ha_archive.cc ha_heap.cc ha_myisam.cc ha_myisammrg.cc - ha_innodb.cc ha_federated.cc ha_berkeley.cc ha_blackhole.cc + ha_innodb.cc ha_federated.cc ha_berkeley.cc handler.cc hash_filo.cc hash_filo.h hostname.cc init.cc item.cc item_buff.cc item_cmpfunc.cc item_create.cc item_func.cc item_geofunc.cc item_row.cc @@ -84,7 +84,7 @@ ADD_EXECUTABLE(mysqld${MYSQLD_EXE_SUFFIX} ${PROJECT_SOURCE_DIR}/sql/lex_hash.h) TARGET_LINK_LIBRARIES(mysqld${MYSQLD_EXE_SUFFIX} - heap myisam myisammrg mysys yassl zlib dbug yassl + heap myisam myisammrg mysys yassl zlib debug dbug yassl taocrypt strings vio regex wsock32) IF(EMBED_MANIFESTS) @@ -128,8 +128,9 @@ ADD_CUSTOM_COMMAND( DEPENDS ${PROJECT_SOURCE_DIR}/sql/message.mc) # Gen_lex_hash +# About "mysqlclient_notls", see note in "client/CMakeLists.txt" ADD_EXECUTABLE(gen_lex_hash gen_lex_hash.cc) -TARGET_LINK_LIBRARIES(gen_lex_hash dbug mysqlclient wsock32) +TARGET_LINK_LIBRARIES(gen_lex_hash mysqlclient_notls wsock32) GET_TARGET_PROPERTY(GEN_LEX_HASH_EXE gen_lex_hash LOCATION) ADD_CUSTOM_COMMAND( OUTPUT ${PROJECT_SOURCE_DIR}/sql/lex_hash.h diff --git a/sql/item.cc b/sql/item.cc index 9612fbc5243..8ce77e9cd4f 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -1327,6 +1327,25 @@ void Item::split_sum_func2(THD *thd, Item **ref_pointer_array, } +static bool +left_is_superset(DTCollation *left, DTCollation *right) +{ + /* Allow convert to Unicode */ + if (left->collation->state & MY_CS_UNICODE && + (left->derivation < right->derivation || + (left->derivation == right->derivation && + !(right->collation->state & MY_CS_UNICODE)))) + return TRUE; + /* Allow convert from ASCII */ + if (right->repertoire == MY_REPERTOIRE_ASCII && + (left->derivation < right->derivation || + (left->derivation == right->derivation && + !(left->repertoire == MY_REPERTOIRE_ASCII)))) + return TRUE; + /* Disallow conversion otherwise */ + return FALSE; +} + /* Aggregate two collations together taking into account their coercibility (aka derivation): @@ -1391,18 +1410,12 @@ bool DTCollation::aggregate(DTCollation &dt, uint flags) ; // Do nothing } else if ((flags & MY_COLL_ALLOW_SUPERSET_CONV) && - collation->state & MY_CS_UNICODE && - (derivation < dt.derivation || - (derivation == dt.derivation && - !(dt.collation->state & MY_CS_UNICODE)))) + left_is_superset(this, &dt)) { // Do nothing } else if ((flags & MY_COLL_ALLOW_SUPERSET_CONV) && - dt.collation->state & MY_CS_UNICODE && - (dt.derivation < derivation || - (dt.derivation == derivation && - !(collation->state & MY_CS_UNICODE)))) + left_is_superset(&dt, this)) { set(dt); } @@ -1421,7 +1434,7 @@ bool DTCollation::aggregate(DTCollation &dt, uint flags) else { // Cannot apply conversion - set(0, DERIVATION_NONE); + set(0, DERIVATION_NONE, 0); return 1; } } @@ -1443,8 +1456,8 @@ bool DTCollation::aggregate(DTCollation &dt, uint flags) { if (derivation == DERIVATION_EXPLICIT) { - set(0, DERIVATION_NONE); - return 1; + set(0, DERIVATION_NONE, 0); + return 1; } if (collation->state & MY_CS_BINSORT) return 0; @@ -1458,6 +1471,7 @@ bool DTCollation::aggregate(DTCollation &dt, uint flags) set(bin, DERIVATION_NONE); } } + repertoire|= dt.repertoire; return 0; } @@ -1597,12 +1611,16 @@ bool agg_item_charsets(DTCollation &coll, const char *fname, { Item* conv; uint32 dummy_offset; - if (!String::needs_conversion(0, coll.collation, - (*arg)->collation.collation, + if (!String::needs_conversion(0, (*arg)->collation.collation, + coll.collation, &dummy_offset)) continue; - if (!(conv= (*arg)->safe_charset_converter(coll.collation))) + if (!(conv= (*arg)->safe_charset_converter(coll.collation)) && + ((*arg)->collation.repertoire == MY_REPERTOIRE_ASCII)) + conv= new Item_func_conv_charset(*arg, coll.collation, 1); + + if (!conv) { if (nargs >=2 && nargs <= 3) { @@ -1652,7 +1670,7 @@ void Item_ident_for_show::make_field(Send_field *tmp_field) tmp_field->type=field->type(); tmp_field->flags= field->table->maybe_null ? (field->flags & ~NOT_NULL_FLAG) : field->flags; - tmp_field->decimals= 0; + tmp_field->decimals= field->decimals(); } /**********************************************/ diff --git a/sql/item.h b/sql/item.h index 23f6977a0f8..3c699c0eda3 100644 --- a/sql/item.h +++ b/sql/item.h @@ -49,29 +49,50 @@ class DTCollation { public: CHARSET_INFO *collation; enum Derivation derivation; + uint repertoire; + void set_repertoire_from_charset(CHARSET_INFO *cs) + { + repertoire= cs->state & MY_CS_PUREASCII ? + MY_REPERTOIRE_ASCII : MY_REPERTOIRE_UNICODE30; + } DTCollation() { collation= &my_charset_bin; derivation= DERIVATION_NONE; + repertoire= MY_REPERTOIRE_UNICODE30; } DTCollation(CHARSET_INFO *collation_arg, Derivation derivation_arg) { collation= collation_arg; derivation= derivation_arg; + set_repertoire_from_charset(collation_arg); } void set(DTCollation &dt) { collation= dt.collation; derivation= dt.derivation; + repertoire= dt.repertoire; } void set(CHARSET_INFO *collation_arg, Derivation derivation_arg) { collation= collation_arg; derivation= derivation_arg; + set_repertoire_from_charset(collation_arg); + } + void set(CHARSET_INFO *collation_arg, + Derivation derivation_arg, + uint repertoire_arg) + { + collation= collation_arg; + derivation= derivation_arg; + repertoire= repertoire_arg; } void set(CHARSET_INFO *collation_arg) - { collation= collation_arg; } + { + collation= collation_arg; + set_repertoire_from_charset(collation_arg); + } void set(Derivation derivation_arg) { derivation= derivation_arg; } bool aggregate(DTCollation &dt, uint flags= 0); @@ -1672,10 +1693,11 @@ class Item_string :public Item { public: Item_string(const char *str,uint length, - CHARSET_INFO *cs, Derivation dv= DERIVATION_COERCIBLE) + CHARSET_INFO *cs, Derivation dv= DERIVATION_COERCIBLE, + uint repertoire= MY_REPERTOIRE_UNICODE30) { - collation.set(cs, dv); - str_value.set_or_copy_aligned(str,length,cs); + str_value.set_or_copy_aligned(str, length, cs); + collation.set(cs, dv, repertoire); /* We have to have a different max_length than 'length' here to ensure that we get the right length if we do use the item @@ -1699,10 +1721,11 @@ public: fixed= 1; } Item_string(const char *name_par, const char *str, uint length, - CHARSET_INFO *cs, Derivation dv= DERIVATION_COERCIBLE) + CHARSET_INFO *cs, Derivation dv= DERIVATION_COERCIBLE, + uint repertoire= MY_REPERTOIRE_UNICODE30) { - collation.set(cs, dv); - str_value.set_or_copy_aligned(str,length,cs); + str_value.set_or_copy_aligned(str, length, cs); + collation.set(cs, dv, repertoire); max_length= str_value.numchars()*cs->mbmaxlen; set_name(name_par, 0, cs); decimals=NOT_FIXED_DEC; @@ -1718,6 +1741,12 @@ public: str_value.copy(str_arg, length_arg, collation.collation); max_length= str_value.numchars() * collation.collation->mbmaxlen; } + void set_repertoire_from_value() + { + collation.repertoire= my_string_repertoire(str_value.charset(), + str_value.ptr(), + str_value.length()); + } enum Type type() const { return STRING_ITEM; } double val_real(); longlong val_int(); diff --git a/sql/item_func.cc b/sql/item_func.cc index c70cfa1ce2a..d03d497dfd0 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -3767,7 +3767,7 @@ static user_var_entry *get_variable(HASH *hash, LEX_STRING &name, entry->value=0; entry->length=0; entry->update_query_id=0; - entry->collation.set(NULL, DERIVATION_IMPLICIT); + entry->collation.set(NULL, DERIVATION_IMPLICIT, 0); entry->unsigned_flag= 0; /* If we are here, we were called from a SET or a query which sets a diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 20a4b64640a..0c11c9eece8 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -2673,7 +2673,8 @@ void Item_func_set_collation::fix_length_and_dec() colname, args[0]->collation.collation->csname); return; } - collation.set(set_collation, DERIVATION_EXPLICIT); + collation.set(set_collation, DERIVATION_EXPLICIT, + args[0]->collation.repertoire); max_length= args[0]->max_length; } diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 873e2833a1e..ae18e4786d7 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -1718,7 +1718,11 @@ void Item_func_date_format::fix_length_and_dec() Item *arg1= args[1]->this_item(); decimals=0; - collation.set(thd->variables.collation_connection); + CHARSET_INFO *cs= thd->variables.collation_connection; + uint32 repertoire= arg1->collation.repertoire; + if (!thd->variables.lc_time_names->is_ascii) + repertoire|= MY_REPERTOIRE_EXTENDED; + collation.set(cs, arg1->collation.derivation, repertoire); if (arg1->type() == STRING_ITEM) { // Optimize the normal case fixed_length=1; diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index a62d8b383a5..7911da69862 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -311,10 +311,12 @@ static char *get_text(Lex_input_stream *lip) uint found_escape=0; CHARSET_INFO *cs= lip->m_thd->charset(); + lip->tok_bitmap= 0; sep= yyGetLast(); // String should end with this while (lip->ptr != lip->end_of_query) { - c = yyGet(); + c= yyGet(); + lip->tok_bitmap|= c; #ifdef USE_MB { int l; @@ -605,6 +607,7 @@ int MYSQLlex(void *arg, void *yythd) break; } yylval->lex_str.length= lip->yytoklen; + lex->text_string_is_7bit= (lip->tok_bitmap & 0x80) ? 0 : 1; return(NCHAR_STRING); case MY_LEX_IDENT_OR_HEX: @@ -926,6 +929,7 @@ int MYSQLlex(void *arg, void *yythd) break; } yylval->lex_str.length=lip->yytoklen; + lex->text_string_is_7bit= (lip->tok_bitmap & 0x80) ? 0 : 1; return(TEXT_STRING); case MY_LEX_COMMENT: // Comment diff --git a/sql/sql_lex.h b/sql/sql_lex.h index bfa6c05974f..b9c6abd2b06 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -957,6 +957,9 @@ public: /** Position of ';' in the stream, to delimit multiple queries. */ const char* found_semicolon; + + /** Token character bitmaps, to detect 7bit strings. */ + uchar tok_bitmap; /** SQL_MODE = IGNORE_SPACE. */ bool ignore_space; @@ -994,6 +997,7 @@ typedef struct st_lex : public Query_tables_list gptr yacc_yyss,yacc_yyvs; THD *thd; CHARSET_INFO *charset, *underscore_charset; + bool text_string_is_7bit; /* store original leaf_tables for INSERT SELECT and PS/SP */ TABLE_LIST *leaf_tables_insert; /* Position (first character index) of SELECT of CREATE VIEW statement */ diff --git a/sql/sql_string.cc b/sql/sql_string.cc index 9d7df73cd7a..a87074c3359 100644 --- a/sql/sql_string.cc +++ b/sql/sql_string.cc @@ -263,6 +263,8 @@ bool String::needs_conversion(uint32 arg_length, (to_cs == &my_charset_bin) || (to_cs == from_cs) || my_charset_same(from_cs, to_cs) || + (my_charset_is_ascii_based(to_cs) && + my_charset_is_8bit_pure_ascii(from_cs)) || ((from_cs == &my_charset_bin) && (!(*offset=(arg_length % to_cs->mbminlen))))) return FALSE; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 638da3b1bb0..a53cadafda8 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -7523,18 +7523,54 @@ opt_load_data_set_spec: /* Common definitions */ text_literal: - TEXT_STRING_literal - { - THD *thd= YYTHD; - $$ = new Item_string($1.str,$1.length,thd->variables.collation_connection); - } - | NCHAR_STRING - { $$= new Item_string($1.str,$1.length,national_charset_info); } - | UNDERSCORE_CHARSET TEXT_STRING - { $$ = new Item_string($2.str,$2.length,Lex->underscore_charset); } - | text_literal TEXT_STRING_literal - { ((Item_string*) $1)->append($2.str,$2.length); } - ; + TEXT_STRING + { + LEX_STRING tmp; + THD *thd= YYTHD; + CHARSET_INFO *cs_con= thd->variables.collation_connection; + CHARSET_INFO *cs_cli= thd->variables.character_set_client; + uint repertoire= thd->lex->text_string_is_7bit && + my_charset_is_ascii_based(cs_cli) ? + MY_REPERTOIRE_ASCII : MY_REPERTOIRE_UNICODE30; + if (thd->charset_is_collation_connection || + (repertoire == MY_REPERTOIRE_ASCII && + my_charset_is_ascii_based(cs_con))) + tmp= $1; + else + thd->convert_string(&tmp, cs_con, $1.str, $1.length, cs_cli); + $$= new Item_string(tmp.str, tmp.length, cs_con, + DERIVATION_COERCIBLE, repertoire); + } + | NCHAR_STRING + { + uint repertoire= Lex->text_string_is_7bit ? + MY_REPERTOIRE_ASCII : MY_REPERTOIRE_UNICODE30; + DBUG_ASSERT(my_charset_is_ascii_based(national_charset_info)); + $$= new Item_string($1.str, $1.length, national_charset_info, + DERIVATION_COERCIBLE, repertoire); + } + | UNDERSCORE_CHARSET TEXT_STRING + { + $$= new Item_string($2.str, $2.length, Lex->underscore_charset); + ((Item_string*) $$)->set_repertoire_from_value(); + } + | text_literal TEXT_STRING_literal + { + Item_string* item= (Item_string*) $1; + item->append($2.str, $2.length); + if (!(item->collation.repertoire & MY_REPERTOIRE_EXTENDED)) + { + /* + If the string has been pure ASCII so far, + check the new part. + */ + CHARSET_INFO *cs= YYTHD->variables.collation_connection; + item->collation.repertoire|= my_string_repertoire(cs, + $2.str, + $2.length); + } + } + ; text_string: TEXT_STRING_literal @@ -7606,20 +7642,22 @@ literal: | TRUE_SYM { $$= new Item_int((char*) "TRUE",1,1); } | HEX_NUM { $$ = new Item_hex_string($1.str, $1.length);} | BIN_NUM { $$= new Item_bin_string($1.str, $1.length); } - | UNDERSCORE_CHARSET HEX_NUM - { - Item *tmp= new Item_hex_string($2.str, $2.length); - /* - it is OK only emulate fix_fieds, because we need only + | UNDERSCORE_CHARSET HEX_NUM + { + Item *tmp= new Item_hex_string($2.str, $2.length); + /* + it is OK only emulate fix_fieds, because we need only value of constant - */ - String *str= tmp ? - tmp->quick_fix_field(), tmp->val_str((String*) 0) : - (String*) 0; - $$= new Item_string(str ? str->ptr() : "", - str ? str->length() : 0, - Lex->underscore_charset); - } + */ + String *str= tmp ? + tmp->quick_fix_field(), tmp->val_str((String*) 0) : + (String*) 0; + $$= new Item_string(str ? str->ptr() : "", + str ? str->length() : 0, + Lex->underscore_charset); + if ($$) + ((Item_string *) $$)->set_repertoire_from_value(); + } | UNDERSCORE_CHARSET BIN_NUM { Item *tmp= new Item_bin_string($2.str, $2.length); diff --git a/strings/conf_to_src.c b/strings/conf_to_src.c index 75776d5e6d0..dc2a300a2ec 100644 --- a/strings/conf_to_src.c +++ b/strings/conf_to_src.c @@ -179,14 +179,16 @@ is_case_sensitive(CHARSET_INFO *cs) cs->sort_order['a'] < cs->sort_order['B']) ? 1 : 0; } + void dispcset(FILE *f,CHARSET_INFO *cs) { fprintf(f,"{\n"); fprintf(f," %d,%d,%d,\n",cs->number,0,0); - fprintf(f," MY_CS_COMPILED%s%s%s,\n", - cs->state & MY_CS_BINSORT ? "|MY_CS_BINSORT" : "", - cs->state & MY_CS_PRIMARY ? "|MY_CS_PRIMARY" : "", - is_case_sensitive(cs) ? "|MY_CS_CSSORT" : ""); + fprintf(f," MY_CS_COMPILED%s%s%s%s,\n", + cs->state & MY_CS_BINSORT ? "|MY_CS_BINSORT" : "", + cs->state & MY_CS_PRIMARY ? "|MY_CS_PRIMARY" : "", + is_case_sensitive(cs) ? "|MY_CS_CSSORT" : "", + my_charset_is_8bit_pure_ascii(cs) ? "|MY_CS_PUREASCII" : ""); if (cs->name) { diff --git a/strings/ctype-extra.c b/strings/ctype-extra.c index bf45b5b5d75..38aa3a05adf 100644 --- a/strings/ctype-extra.c +++ b/strings/ctype-extra.c @@ -6722,7 +6722,7 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_ascii { 11,0,0, - MY_CS_COMPILED|MY_CS_PRIMARY, + MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_PUREASCII, "ascii", /* cset name */ "ascii_general_ci", /* coll name */ "", /* comment */ @@ -7811,7 +7811,7 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_ascii { 65,0,0, - MY_CS_COMPILED|MY_CS_BINSORT, + MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_PUREASCII, "ascii", /* cset name */ "ascii_bin", /* coll name */ "", /* comment */ diff --git a/strings/ctype.c b/strings/ctype.c index e7399c5438b..372a1a8a468 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -306,3 +306,89 @@ my_bool my_parse_charset_xml(const char *buf, uint len, my_xml_parser_free(&p); return rc; } + + +/* + Check repertoire: detect pure ascii strings +*/ +uint +my_string_repertoire(CHARSET_INFO *cs, const char *str, ulong length) +{ + const char *strend= str + length; + if (cs->mbminlen == 1) + { + for ( ; str < strend; str++) + { + if (((uchar) *str) > 0x7F) + return MY_REPERTOIRE_UNICODE30; + } + } + else + { + my_wc_t wc; + int chlen; + for (; (chlen= cs->cset->mb_wc(cs, &wc, str, strend)) > 0; str+= chlen) + { + if (wc > 0x7F) + return MY_REPERTOIRE_UNICODE30; + } + } + return MY_REPERTOIRE_ASCII; +} + + +/* + Detect whether a character set is ASCII compatible. + + Returns TRUE for: + + - all 8bit character sets whose Unicode mapping of 0x7B is '{' + (ignores swe7 which maps 0x7B to "LATIN LETTER A WITH DIAERESIS") + + - all multi-byte character sets having mbminlen == 1 + (ignores ucs2 whose mbminlen is 2) + + TODO: + + When merging to 5.2, this function should be changed + to check a new flag MY_CS_NONASCII, + + return (cs->flag & MY_CS_NONASCII) ? 0 : 1; + + This flag was previously added into 5.2 under terms + of WL#3759 "Optimize identifier conversion in client-server protocol" + especially to mark character sets not compatible with ASCII. + + We won't backport this flag to 5.0 or 5.1. + This function is Ok for 5.0 and 5.1, because we're not going + to introduce new tricky character sets between 5.0 and 5.2. +*/ +my_bool +my_charset_is_ascii_based(CHARSET_INFO *cs) +{ + return + (cs->mbmaxlen == 1 && cs->tab_to_uni && cs->tab_to_uni['{'] == '{') || + (cs->mbminlen == 1 && cs->mbmaxlen > 1); +} + + +/* + Detect if a character set is 8bit, + and it is pure ascii, i.e. doesn't have + characters outside U+0000..U+007F + This functions is shared between "conf_to_src" + and dynamic charsets loader in "mysqld". +*/ +my_bool +my_charset_is_8bit_pure_ascii(CHARSET_INFO *cs) +{ + size_t code; + if (!cs->tab_to_uni) + return 0; + for (code= 0; code < 256; code++) + { + if (cs->tab_to_uni[code] > 0x7F) + return 0; + } + return 1; +} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 7559ca9ec6b..2093fc0da36 100755 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -13,15 +13,15 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") -SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") +# About "mysqlclient_notls", see note in "client/CMakeLists.txt" +SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") ADD_DEFINITIONS("-DMYSQL_CLIENT") INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) -ADD_EXECUTABLE(mysql_client_test mysql_client_test.c) -TARGET_LINK_LIBRARIES(mysql_client_test dbug mysys mysqlclient yassl taocrypt zlib wsock32) +ADD_EXECUTABLE(mysql_client_test mysql_client_test.c ../mysys/my_memmem.c) +TARGET_LINK_LIBRARIES(mysql_client_test mysqlclient_notls wsock32) ADD_EXECUTABLE(bug25714 bug25714.c) -TARGET_LINK_LIBRARIES(bug25714 dbug mysys mysqlclient yassl taocrypt zlib wsock32) +TARGET_LINK_LIBRARIES(bug25714 mysqlclient_notls wsock32) diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c index 75c86902972..cbeea064ffd 100644 --- a/tests/mysql_client_test.c +++ b/tests/mysql_client_test.c @@ -15570,7 +15570,7 @@ static void test_bug27876() int rc; MYSQL_RES *result; - char utf8_func[] = + unsigned char utf8_func[] = { 0xd1, 0x84, 0xd1, 0x83, 0xd0, 0xbd, 0xd0, 0xba, 0xd1, 0x86, 0xd0, 0xb8, 0xd0, 0xb9, 0xd0, 0xba, @@ -15578,7 +15578,7 @@ static void test_bug27876() 0x00 }; - char utf8_param[] = + unsigned char utf8_param[] = { 0xd0, 0xbf, 0xd0, 0xb0, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xbc, 0xd0, 0xb5, 0xd1, 0x82, 0xd1, 0x8a, @@ -15735,6 +15735,55 @@ static void test_bug27592() } +/** + Bug#29306 Truncated data in MS Access with decimal (3,1) columns in a VIEW +*/ + +static void test_bug29306() +{ + MYSQL_FIELD *field; + int rc; + MYSQL_RES *res; + + DBUG_ENTER("test_bug29306"); + myheader("test_bug29306"); + + rc= mysql_query(mysql, "DROP TABLE IF EXISTS tab17557"); + myquery(rc); + rc= mysql_query(mysql, "DROP VIEW IF EXISTS view17557"); + myquery(rc); + rc= mysql_query(mysql, "CREATE TABLE tab17557 (dd decimal (3,1))"); + myquery(rc); + rc= mysql_query(mysql, "CREATE VIEW view17557 as SELECT dd FROM tab17557"); + myquery(rc); + rc= mysql_query(mysql, "INSERT INTO tab17557 VALUES (7.6)"); + myquery(rc); + + /* Checking the view */ + res= mysql_list_fields(mysql, "view17557", NULL); + while ((field= mysql_fetch_field(res))) + { + if (! opt_silent) + { + printf("field name %s\n", field->name); + printf("field table %s\n", field->table); + printf("field decimals %d\n", field->decimals); + if (field->decimals < 1) + printf("Error! No decimals! \n"); + printf("\n\n"); + } + DIE_UNLESS(field->decimals == 1); + } + mysql_free_result(res); + + rc= mysql_query(mysql, "DROP TABLE tab17557"); + myquery(rc); + rc= mysql_query(mysql, "DROP VIEW view17557"); + myquery(rc); + + DBUG_VOID_RETURN; +} + /* Read and parse arguments and MySQL options from my.cnf */ @@ -16019,6 +16068,7 @@ static struct my_tests_st my_tests[]= { { "test_bug28505", test_bug28505 }, { "test_bug28934", test_bug28934 }, { "test_bug27592", test_bug27592 }, + { "test_bug29306", test_bug29306 }, { 0, 0 } }; diff --git a/win/README b/win/README index d13f37965c1..cfc3cc9ef6f 100644 --- a/win/README +++ b/win/README @@ -37,7 +37,6 @@ From the root of your bk clone, execute the command: win\configure <options>. The options right now are WITH_INNOBASE_STORAGE_ENGINE Enable particular storage engines - WITH_PARTITION_STORAGE_ENGINE WITH_ARCHIVE_STORAGE_ENGINE WITH_BERKELEY_STORAGE_ENGINE WITH_BLACKHOLE_STORAGE_ENGINE @@ -57,7 +56,7 @@ The options right now are So the command line could look like: -win\configure WITH_INNOBASE_STORAGE_ENGINE WITH_PARTITION_STORAGE_ENGINE MYSQL_SERVER_SUFFIX=-pro +win\configure WITH_INNOBASE_STORAGE_ENGINE WITH_ARCHIVE_STORAGE_ENGINE MYSQL_SERVER_SUFFIX=-my-suffix Step 5 ------ diff --git a/win/configure.js b/win/configure.js index 7cdf6176e50..1408dba9aea 100755 --- a/win/configure.js +++ b/win/configure.js @@ -44,7 +44,6 @@ try case "WITH_EXAMPLE_STORAGE_ENGINE": case "WITH_FEDERATED_STORAGE_ENGINE": case "WITH_INNOBASE_STORAGE_ENGINE": - case "WITH_PARTITION_STORAGE_ENGINE": case "__NT__": case "DISABLE_GRANT_OPTIONS": case "EMBED_MANIFESTS": diff --git a/zlib/CMakeLists.txt b/zlib/CMakeLists.txt index ac315b0dd85..43235b631f6 100755 --- a/zlib/CMakeLists.txt +++ b/zlib/CMakeLists.txt @@ -13,11 +13,18 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_DEBUG") +# Note that this library is not using any "Thread Local Storage" (TLS), +# i.e. no data declared "__declspec(thread)" or allocated with TlsAlloc(). +# Not directly and indirectly using any of the macros for creating and +# using the storage, pthread_key*(), {,my_}{set,get}_specific*() .... + +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/zlib) + SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG") -ADD_DEFINITIONS(-DUSE_TLS -DMYSQL_CLIENT -D__WIN32__) -ADD_LIBRARY(zlib adler32.c compress.c crc32.c crc32.h deflate.c deflate.h gzio.c infback.c inffast.c inffast.h +SET(ZLIB_SOURCES adler32.c compress.c crc32.c crc32.h deflate.c deflate.h gzio.c infback.c inffast.c inffast.h inffixed.h inflate.c inflate.h inftrees.c inftrees.h trees.c trees.h uncompr.c zconf.h zlib.h zutil.c zutil.h) -
\ No newline at end of file +IF(NOT SOURCE_SUBLIBS) + ADD_LIBRARY(zlib ${ZLIB_SOURCES}) +ENDIF(NOT SOURCE_SUBLIBS) |