From 02dabe3597be3bd418c1cd28a3172a6b0cce24e3 Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Wed, 1 Jun 2011 15:52:52 +0200 Subject: [PATCH 1/8] MWL#200 - provide options to install 3rd party components. Added HeidiSQL as example, i.e cmake -DWITH_THIRD_PARTY=HeidiSQL and building MSI will bundle HeidiSQL. --- win/Makefile.am | 3 +++ win/packaging/CMakeLists.txt | 31 ++++++++++++++++++++++++ win/packaging/create_msi.cmake.in | 17 +++++++++++++ win/packaging/extra.wxs.in | 35 +++++++++++++++++++++++++++ win/packaging/heidisql.cmake | 13 ++++++++++ win/packaging/heidisql.wxi.in | 35 +++++++++++++++++++++++++++ win/packaging/heidisql_feature.wxi.in | 10 ++++++++ 7 files changed, 144 insertions(+) create mode 100644 win/packaging/heidisql.cmake create mode 100644 win/packaging/heidisql.wxi.in create mode 100644 win/packaging/heidisql_feature.wxi.in diff --git a/win/Makefile.am b/win/Makefile.am index b657acfd65c..310c54bc117 100644 --- a/win/Makefile.am +++ b/win/Makefile.am @@ -42,6 +42,9 @@ EXTRA_DIST = build-vs71.bat build-vs8.bat build-vs8_x64.bat build-vs9.bat \ packaging/ca/CustomAction.rc \ packaging/WixUIBannerBmp.jpg \ packaging/WixUIDialogBmp.jpg \ + packaging/heidisql.cmake \ + packaging/heidisql.wxi.in \ + packaging/heidisql_feature.wxi.in\ upgrade_wizard/resource.h \ upgrade_wizard/stdafx.h \ upgrade_wizard/targetver.h \ diff --git a/win/packaging/CMakeLists.txt b/win/packaging/CMakeLists.txt index 02fba4ae16b..8c8cca60c35 100644 --- a/win/packaging/CMakeLists.txt +++ b/win/packaging/CMakeLists.txt @@ -103,6 +103,37 @@ IF(WITH_INNOBASE_STORAGE_ENGINE OR WITH_INNODB_STORAGE_ENGINE OR WITH_XTRADB_STO SET(EXTRA_WIX_PREPROCESSOR_FLAGS ${EXTRA_WIX_PREPROCESSOR_FLAGS} "-dHaveInnodb=1") ENDIF() +SET(THIRD_PARTY_FEATURE_CONDITION "") + +IF(WITH_THIRD_PARTY) + SET(THIRD_PARTY_DOWNLOAD_LOCATION "$ENV{TEMP}") + IF(THIRD_PARTY_DOWNLOAD_LOCATION) + FILE(TO_CMAKE_PATH "${THIRD_PARTY_DOWNLOAD_LOCATION}" THIRD_PARTY_DOWNLOAD_LOCATION) + ELSE() + SET(THIRD_PARTY_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}") + ENDIF() +ENDIF() + +FOREACH(third_party ${WITH_THIRD_PARTY}) + SET(third_party_install_plugin ${CMAKE_CURRENT_SOURCE_DIR}/${third_party}.cmake) + IF(NOT EXISTS ${third_party_install_plugin}) + MESSAGE(FATAL_ERROR +"Third party MSI installation plugin ${third_party_install_plugin} does not exist. +It was expected due to WITH_THIRD_PARTY=${WITH_THIRD_PARTY}" +) + ENDIF() + STRING(TOUPPER "${third_party}" upper_third_party) + IF(NOT THIRD_PARTY_FEATURE_CONDITION ) + SET(THIRD_PARTY_FEATURE_CONDITION "${upper_third_party}INSTALLED") + ELSE() + SET(THIRD_PARTY_FEATURE_CONDITION "AND ${upper_third_party}INSTALLED") + ENDIF() +ENDFOREACH() + +IF(THIRD_PARTY_FEATURE_CONDITION) + SET(THIRD_PARTY_FEATURE_CONDITION "${THIRD_PARTY_FEATURE_CONDITION}") +ENDIF() + IF(NOT CPACK_WIX_UI) SET(CPACK_WIX_UI "MyWixUI_Mondo") ENDIF() diff --git a/win/packaging/create_msi.cmake.in b/win/packaging/create_msi.cmake.in index 13c433887b8..80560a8c1f2 100644 --- a/win/packaging/create_msi.cmake.in +++ b/win/packaging/create_msi.cmake.in @@ -23,8 +23,25 @@ SET(SIGNTOOL_PARAMETERS "@SIGNTOOL_PARAMETERS@") SET(CMAKE_FULL_VER "@CMAKE_MAJOR_VERSION@.@CMAKE_MINOR_VERSION@.@CMAKE_PATCH_VERSION@") SET(EXTRA_WIX_PREPROCESSOR_FLAGS "@EXTRA_WIX_PREPROCESSOR_FLAGS@") +SET(WITH_THIRD_PARTY "@WITH_THIRD_PARTY@") +SET(THIRD_PARTY_DOWNLOAD_LOCATION "@THIRD_PARTY_DOWNLOAD_LOCATION@") +SET(THIRD_PARTY_FEATURE_CONDITION "@THIRD_PARTY_FEATURE_CONDITION@") +FOREACH(third_party ${WITH_THIRD_PARTY}) + INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/${third_party}.cmake) + + # Check than above script produced ${third_party}.wxi and ${third_party}_feature.wxi + FOREACH(outfile ${third_party}.wxi ${third_party}_feature.wxi) + IF(NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/${outfile}) + MESSAGE(FATAL_ERROR + "${CMAKE_CURRENT_SOURCE_DIR}/${third_party}.cmake did not produce " + "${CMAKE_CURRENT_BINARY_DIR}/${outfile}" + ) + ENDIF() + ENDFOREACH() +ENDFOREACH() + IF(CMAKE_SIZEOF_VOID_P EQUAL 8) SET(CANDLE_ARCH -arch x64) diff --git a/win/packaging/extra.wxs.in b/win/packaging/extra.wxs.in index 456b833cf4f..5aab7bc813c 100644 --- a/win/packaging/extra.wxs.in +++ b/win/packaging/extra.wxs.in @@ -46,6 +46,9 @@ + + + @@ -567,6 +570,38 @@ + + + + + + + + + + + + + + + + + + @THIRD_PARTY_FEATURE_CONDITION@ + + + + + + + + + SKIPNETWORKING ALLOWREMOTEROOTACCESS diff --git a/win/packaging/heidisql.cmake b/win/packaging/heidisql.cmake new file mode 100644 index 00000000000..c1dfb7c4cad --- /dev/null +++ b/win/packaging/heidisql.cmake @@ -0,0 +1,13 @@ +SET(HEIDISQL_BASE_NAME "HeidiSQL_6.0_Portable") +SET(HEIDISQL_ZIP "${HEIDISQL_BASE_NAME}.zip") +SET(HEIDISQL_URL "http://heidisql.googlecode.com/files/${HEIDISQL_ZIP}") +IF(NOT EXISTS ${THIRD_PARTY_DOWNLOAD_LOCATION}/HeidiSQL/${HEIDISQL_ZIP}) + MAKE_DIRECTORY(${THIRD_PARTY_DOWNLOAD_LOCATION}/HeidiSQL) + MESSAGE(STATUS "Downloading ${HEIDISQL_URL} to ${THIRD_PARTY_DOWNLOAD_LOCATION}/HeidiSQL/${HEIDISQL_ZIP}") + FILE(DOWNLOAD ${HEIDISQL_URL} ${THIRD_PARTY_DOWNLOAD_LOCATION}/HeidiSQL/${HEIDISQL_ZIP} TIMEOUT 60) + EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E chdir ${THIRD_PARTY_DOWNLOAD_LOCATION}/HeidiSQL + ${CMAKE_COMMAND} -E tar xfz ${THIRD_PARTY_DOWNLOAD_LOCATION}/HeidiSQL/${HEIDISQL_ZIP} + ) +ENDIF() +CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/heidisql.wxi.in ${CMAKE_CURRENT_BINARY_DIR}/heidisql.wxi) +CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/heidisql_feature.wxi.in ${CMAKE_CURRENT_BINARY_DIR}/heidisql_feature.wxi) diff --git a/win/packaging/heidisql.wxi.in b/win/packaging/heidisql.wxi.in new file mode 100644 index 00000000000..d47d4ae67c0 --- /dev/null +++ b/win/packaging/heidisql.wxi.in @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win/packaging/heidisql_feature.wxi.in b/win/packaging/heidisql_feature.wxi.in new file mode 100644 index 00000000000..9fceb4689d0 --- /dev/null +++ b/win/packaging/heidisql_feature.wxi.in @@ -0,0 +1,10 @@ + + + HEIDISQLINSTALLED + + + From 58c6165e2809d4009aaae5b050d0a6568a7b0b29 Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Wed, 1 Jun 2011 21:14:10 +0200 Subject: [PATCH 2/8] Use our libmysql.dll with Heidi, if we compile 32 bit --- win/packaging/CMakeLists.txt | 1 + win/packaging/create_msi.cmake.in | 6 ++++++ win/packaging/heidisql.cmake | 20 ++++++++++++------ win/packaging/heidisql.wxi.in | 35 +++++++++++++++++-------------- 4 files changed, 40 insertions(+), 22 deletions(-) diff --git a/win/packaging/CMakeLists.txt b/win/packaging/CMakeLists.txt index 8c8cca60c35..8cf4b3872da 100644 --- a/win/packaging/CMakeLists.txt +++ b/win/packaging/CMakeLists.txt @@ -114,6 +114,7 @@ IF(WITH_THIRD_PARTY) ENDIF() ENDIF() +GET_TARGET_PROPERTY(LIBMYSQL_LOCATION libmysql LOCATION) FOREACH(third_party ${WITH_THIRD_PARTY}) SET(third_party_install_plugin ${CMAKE_CURRENT_SOURCE_DIR}/${third_party}.cmake) IF(NOT EXISTS ${third_party_install_plugin}) diff --git a/win/packaging/create_msi.cmake.in b/win/packaging/create_msi.cmake.in index 80560a8c1f2..7c218bbf407 100644 --- a/win/packaging/create_msi.cmake.in +++ b/win/packaging/create_msi.cmake.in @@ -26,8 +26,14 @@ SET(EXTRA_WIX_PREPROCESSOR_FLAGS "@EXTRA_WIX_PREPROCESSOR_FLAGS@") SET(WITH_THIRD_PARTY "@WITH_THIRD_PARTY@") SET(THIRD_PARTY_DOWNLOAD_LOCATION "@THIRD_PARTY_DOWNLOAD_LOCATION@") SET(THIRD_PARTY_FEATURE_CONDITION "@THIRD_PARTY_FEATURE_CONDITION@") +SET(LIBMYSQL_LOCATION "@LIBMYSQL_LOCATION@") +IF(LIBMYSQL_LOCATION AND CMAKE_CFG_INTDIR) + # resolve libmysql full path + STRING(REPLACE "${CMAKE_CFG_INTDIR}" "${CMAKE_INSTALL_CONFIG_NAME}" LIBMYSQL_LOCATION "${LIBMYSQL_LOCATION}") +ENDIF() + FOREACH(third_party ${WITH_THIRD_PARTY}) INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/${third_party}.cmake) diff --git a/win/packaging/heidisql.cmake b/win/packaging/heidisql.cmake index c1dfb7c4cad..e96cbf54282 100644 --- a/win/packaging/heidisql.cmake +++ b/win/packaging/heidisql.cmake @@ -1,13 +1,21 @@ SET(HEIDISQL_BASE_NAME "HeidiSQL_6.0_Portable") SET(HEIDISQL_ZIP "${HEIDISQL_BASE_NAME}.zip") SET(HEIDISQL_URL "http://heidisql.googlecode.com/files/${HEIDISQL_ZIP}") -IF(NOT EXISTS ${THIRD_PARTY_DOWNLOAD_LOCATION}/HeidiSQL/${HEIDISQL_ZIP}) - MAKE_DIRECTORY(${THIRD_PARTY_DOWNLOAD_LOCATION}/HeidiSQL) - MESSAGE(STATUS "Downloading ${HEIDISQL_URL} to ${THIRD_PARTY_DOWNLOAD_LOCATION}/HeidiSQL/${HEIDISQL_ZIP}") - FILE(DOWNLOAD ${HEIDISQL_URL} ${THIRD_PARTY_DOWNLOAD_LOCATION}/HeidiSQL/${HEIDISQL_ZIP} TIMEOUT 60) - EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E chdir ${THIRD_PARTY_DOWNLOAD_LOCATION}/HeidiSQL - ${CMAKE_COMMAND} -E tar xfz ${THIRD_PARTY_DOWNLOAD_LOCATION}/HeidiSQL/${HEIDISQL_ZIP} +SET(HEIDISQL_DOWNLOAD_DIR ${THIRD_PARTY_DOWNLOAD_LOCATION}/${HEIDISQL_BASE_NAME}) + +IF(NOT EXISTS ${HEIDISQL_DOWNLOAD_DIR}/${HEIDISQL_ZIP}) + MAKE_DIRECTORY(${HEIDISQL_DOWNLOAD_DIR}) + MESSAGE(STATUS "Downloading ${HEIDISQL_URL} to ${HEIDISQL_DOWNLOAD_DIR}/${HEIDISQL_ZIP}") + FILE(DOWNLOAD ${HEIDISQL_URL} ${HEIDISQL_DOWNLOAD_DIR}/${HEIDISQL_ZIP} TIMEOUT 60) + EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E chdir ${HEIDISQL_DOWNLOAD_DIR} + ${CMAKE_COMMAND} -E tar xfz ${HEIDISQL_DOWNLOAD_DIR}/${HEIDISQL_ZIP} ) ENDIF() +IF(CMAKE_SIZEOF_VOID_P EQUAL 4) + # Use our libmysql if it is 32 bit. + IF(LIBMYSQL_LOCATION) + CONFIGURE_FILE(${LIBMYSQL_LOCATION} ${HEIDISQL_DOWNLOAD_DIR}/libmysql.dll COPYONLY) + ENDIF() +ENDIF() CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/heidisql.wxi.in ${CMAKE_CURRENT_BINARY_DIR}/heidisql.wxi) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/heidisql_feature.wxi.in ${CMAKE_CURRENT_BINARY_DIR}/heidisql_feature.wxi) diff --git a/win/packaging/heidisql.wxi.in b/win/packaging/heidisql.wxi.in index d47d4ae67c0..3e54d34aa01 100644 --- a/win/packaging/heidisql.wxi.in +++ b/win/packaging/heidisql.wxi.in @@ -8,28 +8,31 @@ Win64="no" /> - - - - - - - + + + + + + + - - - - + + - + - + + + + + - - - + + + + From 37f464f3a26fe084fb6f607a1d4f64ab750f3e9c Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Thu, 2 Jun 2011 10:06:51 +0200 Subject: [PATCH 3/8] use our libmysql.dll with HeidiSQL, if we compile 32 bit --- win/packaging/heidisql.cmake | 4 +++- win/packaging/heidisql.wxi.in | 12 ++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/win/packaging/heidisql.cmake b/win/packaging/heidisql.cmake index e96cbf54282..94a287cba08 100644 --- a/win/packaging/heidisql.cmake +++ b/win/packaging/heidisql.cmake @@ -11,10 +11,12 @@ IF(NOT EXISTS ${HEIDISQL_DOWNLOAD_DIR}/${HEIDISQL_ZIP}) ${CMAKE_COMMAND} -E tar xfz ${HEIDISQL_DOWNLOAD_DIR}/${HEIDISQL_ZIP} ) ENDIF() + +SET(LIBMYSQLDLL_SOURCE ${HEIDISQL_DOWNLOAD_DIR}/libmysql.dll) IF(CMAKE_SIZEOF_VOID_P EQUAL 4) # Use our libmysql if it is 32 bit. IF(LIBMYSQL_LOCATION) - CONFIGURE_FILE(${LIBMYSQL_LOCATION} ${HEIDISQL_DOWNLOAD_DIR}/libmysql.dll COPYONLY) + SET(LIBMYSQLDLL_SOURCE "${LIBMYSQL_LOCATION}") ENDIF() ENDIF() CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/heidisql.wxi.in ${CMAKE_CURRENT_BINARY_DIR}/heidisql.wxi) diff --git a/win/packaging/heidisql.wxi.in b/win/packaging/heidisql.wxi.in index 3e54d34aa01..437f063e419 100644 --- a/win/packaging/heidisql.wxi.in +++ b/win/packaging/heidisql.wxi.in @@ -11,11 +11,19 @@ - + + + + @@ -25,7 +33,7 @@ - + From c0f2f1f1f6e59d7d160694021a0cb066509c6714 Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Wed, 8 Jun 2011 16:56:35 +0200 Subject: [PATCH 4/8] Fix a problem building MSI using localized (Spanish) Visual Studio 2010. VS did not like to execute 2 commands in custom build step, workaround is to use single COMMAND instead of 2. --- win/packaging/CMakeLists.txt | 2 -- win/packaging/create_msi.cmake.in | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/win/packaging/CMakeLists.txt b/win/packaging/CMakeLists.txt index 8cf4b3872da..795732e946b 100644 --- a/win/packaging/CMakeLists.txt +++ b/win/packaging/CMakeLists.txt @@ -157,7 +157,6 @@ ENDIF() ADD_CUSTOM_TARGET( MSI - COMMAND set VS_UNICODE_OUTPUT= COMMAND ${CMAKE_COMMAND} ${CONFIG_PARAM} -P ${CMAKE_CURRENT_BINARY_DIR}/create_msi.cmake @@ -166,7 +165,6 @@ ADD_DEPENDENCIES(MSI wixca) ADD_CUSTOM_TARGET( MSI_ESSENTIALS - COMMAND set VS_UNICODE_OUTPUT= COMMAND ${CMAKE_COMMAND} -DESSENTIALS=1 ${CONFIG_PARAM} -P ${CMAKE_CURRENT_BINARY_DIR}/create_msi.cmake diff --git a/win/packaging/create_msi.cmake.in b/win/packaging/create_msi.cmake.in index 7c218bbf407..d291d06161c 100644 --- a/win/packaging/create_msi.cmake.in +++ b/win/packaging/create_msi.cmake.in @@ -28,7 +28,7 @@ SET(THIRD_PARTY_DOWNLOAD_LOCATION "@THIRD_PARTY_DOWNLOAD_LOCATION@") SET(THIRD_PARTY_FEATURE_CONDITION "@THIRD_PARTY_FEATURE_CONDITION@") SET(LIBMYSQL_LOCATION "@LIBMYSQL_LOCATION@") - +SET($ENV{VS_UNICODE_OUTPUT} "") IF(LIBMYSQL_LOCATION AND CMAKE_CFG_INTDIR) # resolve libmysql full path STRING(REPLACE "${CMAKE_CFG_INTDIR}" "${CMAKE_INSTALL_CONFIG_NAME}" LIBMYSQL_LOCATION "${LIBMYSQL_LOCATION}") From 824ce5f3eae52ee418665211c24218a5772c43f2 Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Thu, 9 Jun 2011 00:24:27 +0200 Subject: [PATCH 5/8] After talking to HeidiSQL people - libmysql.dll that comes with their distribution in place, dont replace with our own. It also will result in less HeidiSQL restarts during MariaDB upgrades (since libmysql.dll won't be replaced) --- win/packaging/heidisql.wxi.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/win/packaging/heidisql.wxi.in b/win/packaging/heidisql.wxi.in index 437f063e419..2af52862e06 100644 --- a/win/packaging/heidisql.wxi.in +++ b/win/packaging/heidisql.wxi.in @@ -33,7 +33,7 @@ - + From 3600e6b81cc52d34205c6ec44c0a3fd78f1e881b Mon Sep 17 00:00:00 2001 From: Michael Widenius Date: Thu, 9 Jun 2011 16:17:45 +0300 Subject: [PATCH 6/8] Fixed problem that global status variables 'bytes_recieved' and 'binlog_bytes_written' where not correctly updated --- sql/sql_class.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/sql_class.cc b/sql/sql_class.cc index ba7e0654331..0db3ea22c78 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -1188,11 +1188,11 @@ void add_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var) *(to++)+= *(from++); /* Handle the not ulong variables. See end of system_status_var */ - to_var->bytes_received= from_var->bytes_received; + to_var->bytes_received+= from_var->bytes_received; to_var->bytes_sent+= from_var->bytes_sent; to_var->rows_read+= from_var->rows_read; to_var->rows_sent+= from_var->rows_sent; - to_var->binlog_bytes_written= from_var->binlog_bytes_written; + to_var->binlog_bytes_written+= from_var->binlog_bytes_written; to_var->cpu_time+= from_var->cpu_time; to_var->busy_time+= from_var->busy_time; } From 97e834e1517ade2779da5bc4e5fae0d000c3864b Mon Sep 17 00:00:00 2001 From: Michael Widenius Date: Thu, 9 Jun 2011 20:22:03 +0300 Subject: [PATCH 7/8] Use dynamic row format when creating temporary tables without sumary fields. The reason for this is that BLOCK_RECORD format is not good when there is a lot of duplicated keys as it first writes the data (to get the row position) and then writes the key (and thus checks for duplicates). --- sql/sql_select.cc | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 287f08bad44..9d2298e4675 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -11009,10 +11009,21 @@ static bool create_internal_tmp_table(TABLE *table,TMP_TABLE_PARAM *param, OPTION_BIG_TABLES) create_info.data_file_length= ~(ulonglong) 0; + /* + The logic for choosing the record format: + The STATIC_RECORD format is the fastest one, because it's so simple, + so we use this by default for short rows. + BLOCK_RECORD caches both row and data, so this is generally faster than + DYNAMIC_RECORD. The one exception is when we write to tmp table + (no updates == no sum fields) in which case BLOCK RECORD is slower as + we first write the row, then check for key conflicts and then we have to + delete the row. + */ if ((error= maria_create(share->table_name.str, - share->reclength < 64 && - !share->blob_fields ? STATIC_RECORD : - BLOCK_RECORD, + (share->reclength < 64 && + !share->blob_fields ? STATIC_RECORD : + !param->sum_func_count ? DYNAMIC_RECORD : + BLOCK_RECORD), share->keys, &keydef, (uint) (param->recinfo-param->start_recinfo), param->start_recinfo, From 13f55aac67343450d1c2872dd238d81093d09f11 Mon Sep 17 00:00:00 2001 From: Michael Widenius Date: Fri, 10 Jun 2011 02:02:58 +0300 Subject: [PATCH 8/8] A bit better fix for tmp-table problem Fixed reference to not initialized memory detected by valgrind sql/sql_select.cc: A bit better fix for tmp-table problem: Use only dynamic_record format for group by and distinct. storage/maria/ma_create.c: DYNAMIC_RECORD format doesn't pack VARCHAR fields. This change fixes a non-fatal uninitialized memory copy. --- sql/sql_select.cc | 11 ++++++----- storage/maria/ma_create.c | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 9d2298e4675..fba23e1495a 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -11014,16 +11014,17 @@ static bool create_internal_tmp_table(TABLE *table,TMP_TABLE_PARAM *param, The STATIC_RECORD format is the fastest one, because it's so simple, so we use this by default for short rows. BLOCK_RECORD caches both row and data, so this is generally faster than - DYNAMIC_RECORD. The one exception is when we write to tmp table - (no updates == no sum fields) in which case BLOCK RECORD is slower as + DYNAMIC_RECORD. The one exception is when we write to tmp table and + want to use keys for duplicate elimination as with BLOCK RECORD we first write the row, then check for key conflicts and then we have to - delete the row. + delete the row. The cases when this can happen is when there is + a group by and no sum functions or if distinct is used. */ if ((error= maria_create(share->table_name.str, (share->reclength < 64 && !share->blob_fields ? STATIC_RECORD : - !param->sum_func_count ? DYNAMIC_RECORD : - BLOCK_RECORD), + ((!param->sum_func_count && table->group) || + table->distinct) ? DYNAMIC_RECORD : BLOCK_RECORD), share->keys, &keydef, (uint) (param->recinfo-param->start_recinfo), param->start_recinfo, diff --git a/storage/maria/ma_create.c b/storage/maria/ma_create.c index e7459f0d81a..ca6a5212044 100644 --- a/storage/maria/ma_create.c +++ b/storage/maria/ma_create.c @@ -204,7 +204,8 @@ int maria_create(const char *name, enum data_file_type datafile_type, pack_reclength++; not_block_record_extra_length++; max_field_lengths++; - packed++; + if (datafile_type != DYNAMIC_RECORD) + packed++; column->fill_length= 1; options|= HA_OPTION_NULL_FIELDS; /* Use ma_checksum() */