diff --git a/sql/sql_class.cc b/sql/sql_class.cc index cf52b4008f3..23890a0e506 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -1195,11 +1195,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; } diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 78309ed14e9..5895e653221 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -13420,10 +13420,14 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List &fields, if (thd->is_fatal_error) // If end of memory goto err; /* purecov: inspected */ share->db_record_offset= 1; + table->used_for_duplicate_elimination= (param->sum_func_count == 0 && + (table->group || table->distinct)); + if (share->db_type() == TMP_ENGINE_HTON) { if (create_internal_tmp_table(table, param->keyinfo, param->start_recinfo, - ¶m->recinfo, select_options)) + ¶m->recinfo, + select_options)) goto err; } DBUG_PRINT("info", ("skip_create_table: %d", (int)param->skip_create_table)); @@ -13718,11 +13722,23 @@ bool create_internal_tmp_table(TABLE *table, KEY *keyinfo, 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 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. 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, table->no_rows ? NO_RECORD : (share->reclength < 64 && !share->blob_fields ? STATIC_RECORD : - BLOCK_RECORD), + table->used_for_duplicate_elimination ? + DYNAMIC_RECORD : BLOCK_RECORD), share->keys, &keydef, (uint) (*recinfo-start_recinfo), start_recinfo, @@ -13967,7 +13983,8 @@ create_internal_tmp_table_from_heap2(THD *thd, TABLE *table, new_table.no_rows= table->no_rows; if (create_internal_tmp_table(&new_table, table->key_info, start_recinfo, - recinfo, thd->lex->select_lex.options | + recinfo, + thd->lex->select_lex.options | thd->options)) goto err2; if (open_tmp_table(&new_table)) diff --git a/sql/table.h b/sql/table.h index 4e198116fe2..02e6eaf68aa 100644 --- a/sql/table.h +++ b/sql/table.h @@ -827,7 +827,7 @@ struct st_table { See TABLE_LIST::process_index_hints(). */ bool force_index_group; - bool distinct,const_table,no_rows; + bool distinct,const_table,no_rows, used_for_duplicate_elimination; /** If set, the optimizer has found that row retrieval should access index diff --git a/storage/maria/ma_create.c b/storage/maria/ma_create.c index 0ed7b7d62d2..6737030cd89 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() */ 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..795732e946b 100644 --- a/win/packaging/CMakeLists.txt +++ b/win/packaging/CMakeLists.txt @@ -103,6 +103,38 @@ 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() + +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}) + 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() @@ -125,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 @@ -134,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 13c433887b8..d291d06161c 100644 --- a/win/packaging/create_msi.cmake.in +++ b/win/packaging/create_msi.cmake.in @@ -23,7 +23,30 @@ 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@") +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}") +ENDIF() + +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) 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..94a287cba08 --- /dev/null +++ b/win/packaging/heidisql.cmake @@ -0,0 +1,23 @@ +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}") +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() + +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) + SET(LIBMYSQLDLL_SOURCE "${LIBMYSQL_LOCATION}") + 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 new file mode 100644 index 00000000000..2af52862e06 --- /dev/null +++ b/win/packaging/heidisql.wxi.in @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + +