summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.bzrignore2
-rwxr-xr-xCMakeLists.txt8
-rw-r--r--client/my_readline.h2
-rw-r--r--client/mysql.cc34
-rw-r--r--client/mysqldump.c13
-rw-r--r--client/readline.cc46
-rw-r--r--cmd-line-utils/libedit/makelist.sh4
-rw-r--r--cmd-line-utils/libedit/readline.c5
-rw-r--r--cmd-line-utils/libedit/readline/readline.h2
-rw-r--r--cmd-line-utils/libedit/vi.c4
-rw-r--r--config/ac-macros/ha_ndbcluster.m440
-rw-r--r--config/ac-macros/plugins.m485
-rw-r--r--configure.in8
-rw-r--r--include/config-win.h9
-rw-r--r--include/my_getopt.h2
-rw-r--r--include/my_global.h38
-rw-r--r--include/my_md5.h90
-rw-r--r--include/my_sys.h8
-rw-r--r--libmysqld/CMakeLists.txt2
-rw-r--r--libmysqld/examples/CMakeLists.txt6
-rw-r--r--libmysqld/lib_sql.cc9
-rw-r--r--mysql-test/Makefile.am8
-rw-r--r--mysql-test/collections/README30
-rw-r--r--mysql-test/collections/README.experimental25
-rw-r--r--mysql-test/collections/default.daily1
-rw-r--r--mysql-test/collections/default.experimental1
-rw-r--r--mysql-test/collections/default.push5
-rw-r--r--mysql-test/collections/default.weekly0
-rw-r--r--mysql-test/include/check-warnings.test2
-rw-r--r--mysql-test/include/concurrent.inc55
-rw-r--r--mysql-test/include/handler.inc28
-rw-r--r--mysql-test/include/ndb_backup.inc42
-rw-r--r--mysql-test/include/wait_show_condition.inc78
-rw-r--r--mysql-test/include/wait_until_count_sessions.inc43
-rw-r--r--mysql-test/lib/My/ConfigFactory.pm8
-rw-r--r--mysql-test/lib/My/Platform.pm10
-rw-r--r--mysql-test/lib/My/SafeProcess.pm2
-rw-r--r--mysql-test/lib/My/SafeProcess/safe_process.cc16
-rw-r--r--mysql-test/lib/mtr_gcov.pl58
-rw-r--r--mysql-test/lib/mtr_report.pm40
-rw-r--r--mysql-test/lib/mtr_unique.pm2
-rwxr-xr-xmysql-test/mysql-test-run.pl152
-rw-r--r--mysql-test/r/archive.result19
-rw-r--r--mysql-test/r/concurrent_innodb_safelog.result28
-rw-r--r--mysql-test/r/concurrent_innodb_unsafelog.result28
-rw-r--r--mysql-test/r/connect.result2
-rw-r--r--mysql-test/r/consistent_snapshot.result32
-rw-r--r--mysql-test/r/create.result4
-rw-r--r--mysql-test/r/ddl_i18n_koi8r.result24
-rw-r--r--mysql-test/r/ddl_i18n_utf8.result24
-rw-r--r--mysql-test/r/dirty_close.result10
-rw-r--r--mysql-test/r/events_bugs.result11
-rw-r--r--mysql-test/r/explain.result5
-rw-r--r--mysql-test/r/flush_block_commit.result74
-rw-r--r--mysql-test/r/flush_block_commit_notembedded.result30
-rw-r--r--mysql-test/r/flush_read_lock_kill.result20
-rw-r--r--mysql-test/r/func_math.result30
-rw-r--r--mysql-test/r/grant.result2
-rw-r--r--mysql-test/r/group_by.result12
-rw-r--r--mysql-test/r/group_min_max.result15
-rw-r--r--mysql-test/r/handler_innodb.result9
-rw-r--r--mysql-test/r/handler_myisam.result9
-rw-r--r--mysql-test/r/information_schema.result5
-rw-r--r--mysql-test/r/information_schema_db.result2
-rw-r--r--mysql-test/r/innodb-autoinc.result288
-rw-r--r--mysql-test/r/innodb_bug42419.result17
-rw-r--r--mysql-test/r/innodb_mysql.result18
-rw-r--r--mysql-test/r/key_cache.result2
-rw-r--r--mysql-test/r/lock.result27
-rw-r--r--mysql-test/r/lock_multi.result10
-rw-r--r--mysql-test/r/log_tables.result20
-rw-r--r--mysql-test/r/merge.result12
-rw-r--r--mysql-test/r/mysql.result15
-rw-r--r--mysql-test/r/mysqlbinlog.result43
-rw-r--r--mysql-test/r/mysqlcheck.result2
-rw-r--r--mysql-test/r/mysqldump-max.result72
-rw-r--r--mysql-test/r/mysqldump.result507
-rw-r--r--mysql-test/r/mysqltest.result8
-rw-r--r--mysql-test/r/openssl_1.result18
-rw-r--r--mysql-test/r/partition.result4
-rw-r--r--mysql-test/r/partition_error.result9
-rw-r--r--mysql-test/r/partition_mgm_err.result4
-rw-r--r--mysql-test/r/preload.result4
-rw-r--r--mysql-test/r/ps.result16
-rw-r--r--mysql-test/r/read_only.result2
-rw-r--r--mysql-test/r/repair.result2
-rw-r--r--mysql-test/r/select.result28
-rw-r--r--mysql-test/r/show_check.result12
-rw-r--r--mysql-test/r/skip_name_resolve.result9
-rw-r--r--mysql-test/r/sp-security.result14
-rw-r--r--mysql-test/r/strict.result6
-rw-r--r--mysql-test/r/system_mysql_db.result6
-rw-r--r--mysql-test/r/trigger-compat.result4
-rw-r--r--mysql-test/r/variables.result161
-rw-r--r--mysql-test/r/view.result70
-rw-r--r--mysql-test/r/view_grant.result56
-rw-r--r--mysql-test/std_data/bug32880.ARNbin0 -> 131 bytes
-rw-r--r--mysql-test/std_data/bug32880.ARZbin0 -> 8744 bytes
-rw-r--r--mysql-test/std_data/bug32880.frmbin0 -> 8578 bytes
-rw-r--r--mysql-test/suite/binlog/r/binlog_auto_increment_bug33029.result1
-rw-r--r--mysql-test/suite/binlog/r/binlog_sql_mode.result46
-rw-r--r--mysql-test/suite/binlog/r/binlog_unsafe.result83
-rw-r--r--mysql-test/suite/binlog/t/binlog_auto_increment_bug33029.test5
-rw-r--r--mysql-test/suite/binlog/t/binlog_sql_mode.test76
-rw-r--r--mysql-test/suite/binlog/t/binlog_unsafe.test103
-rw-r--r--mysql-test/suite/funcs_1/r/innodb_func_view.result4
-rw-r--r--mysql-test/suite/funcs_1/r/innodb_views.result8
-rw-r--r--mysql-test/suite/funcs_1/r/is_columns_innodb.result256
-rw-r--r--mysql-test/suite/funcs_1/r/is_columns_is.result5
-rw-r--r--mysql-test/suite/funcs_1/r/is_columns_memory.result256
-rw-r--r--mysql-test/suite/funcs_1/r/is_columns_myisam.result256
-rw-r--r--mysql-test/suite/funcs_1/r/is_columns_mysql.result12
-rw-r--r--mysql-test/suite/funcs_1/r/memory_views.result2
-rw-r--r--mysql-test/suite/funcs_1/r/myisam_views.result2
-rw-r--r--mysql-test/suite/funcs_1/r/ndb_views.result2
-rw-r--r--mysql-test/suite/funcs_1/r/processlist_priv_no_prot.result4
-rw-r--r--mysql-test/suite/funcs_1/r/processlist_val_no_prot.result2
-rw-r--r--mysql-test/suite/ndb/r/ndb_restore.result15
-rw-r--r--mysql-test/suite/ndb/r/ndb_restore_partition.result15
-rw-r--r--mysql-test/suite/ndb/r/ndb_restore_print.result15
-rw-r--r--mysql-test/suite/ndb_team/r/ndb_dd_backuprestore.result15
-rw-r--r--mysql-test/suite/ndb_team/t/ndb_autodiscover.test6
-rw-r--r--mysql-test/suite/parts/inc/partition_auto_increment.inc39
-rw-r--r--mysql-test/suite/parts/r/ndb_dd_backuprestore.result15
-rw-r--r--mysql-test/suite/parts/r/partition_alter1_1_2_innodb.result112
-rw-r--r--mysql-test/suite/parts/r/partition_alter1_1_2_myisam.result32
-rw-r--r--mysql-test/suite/parts/r/partition_alter1_1_innodb.result64
-rw-r--r--mysql-test/suite/parts/r/partition_alter1_1_myisam.result32
-rw-r--r--mysql-test/suite/parts/r/partition_alter2_1_innodb.result192
-rw-r--r--mysql-test/suite/parts/r/partition_alter2_1_myisam.result96
-rw-r--r--mysql-test/suite/parts/r/partition_alter2_2_innodb.result192
-rw-r--r--mysql-test/suite/parts/r/partition_alter2_2_myisam.result96
-rw-r--r--mysql-test/suite/parts/r/partition_auto_increment_blackhole.result7
-rw-r--r--mysql-test/suite/parts/r/partition_auto_increment_ndb.result1
-rw-r--r--mysql-test/suite/parts/r/partition_basic_innodb.result96
-rw-r--r--mysql-test/suite/parts/r/partition_basic_myisam.result32
-rw-r--r--mysql-test/suite/parts/r/partition_basic_symlink_myisam.result46
-rw-r--r--mysql-test/suite/parts/r/partition_mgm_lc0_archive.result12
-rw-r--r--mysql-test/suite/parts/r/partition_mgm_lc0_innodb.result12
-rw-r--r--mysql-test/suite/parts/r/partition_mgm_lc0_memory.result12
-rw-r--r--mysql-test/suite/parts/r/partition_mgm_lc0_myisam.result12
-rw-r--r--mysql-test/suite/parts/r/partition_mgm_lc0_ndb.result4
-rw-r--r--mysql-test/suite/parts/r/partition_mgm_lc1_archive.result12
-rw-r--r--mysql-test/suite/parts/r/partition_mgm_lc1_innodb.result12
-rw-r--r--mysql-test/suite/parts/r/partition_mgm_lc1_memory.result12
-rw-r--r--mysql-test/suite/parts/r/partition_mgm_lc1_myisam.result12
-rw-r--r--mysql-test/suite/parts/r/partition_mgm_lc1_ndb.result4
-rw-r--r--mysql-test/suite/parts/r/partition_mgm_lc2_archive.result12
-rw-r--r--mysql-test/suite/parts/r/partition_mgm_lc2_innodb.result12
-rw-r--r--mysql-test/suite/parts/r/partition_mgm_lc2_memory.result12
-rw-r--r--mysql-test/suite/parts/r/partition_mgm_lc2_myisam.result12
-rw-r--r--mysql-test/suite/parts/r/partition_mgm_lc2_ndb.result4
-rw-r--r--mysql-test/suite/rpl/r/rpl_do_grant.result78
-rw-r--r--mysql-test/suite/rpl/r/rpl_failed_optimize.result2
-rw-r--r--mysql-test/suite/rpl/r/rpl_mixed_bit_pk.result32
-rw-r--r--mysql-test/suite/rpl/r/rpl_rotate_logs.result4
-rw-r--r--mysql-test/suite/rpl/r/rpl_slave_load_in.result10
-rw-r--r--mysql-test/suite/rpl/r/rpl_temp_table_mix_row.result26
-rw-r--r--mysql-test/suite/rpl/t/rpl_do_grant.test97
-rw-r--r--mysql-test/suite/rpl/t/rpl_mixed_bit_pk.test78
-rw-r--r--mysql-test/suite/rpl/t/rpl_rotate_logs.test24
-rw-r--r--mysql-test/suite/rpl/t/rpl_slave_load_in.test35
-rw-r--r--mysql-test/suite/rpl/t/rpl_temp_table_mix_row.test49
-rw-r--r--mysql-test/suite/rpl_ndb/r/rpl_ndb_sync.result5
-rw-r--r--mysql-test/suite/sys_vars/r/auto_increment_increment_basic.result10
-rw-r--r--mysql-test/suite/sys_vars/r/auto_increment_increment_func.result2
-rw-r--r--mysql-test/suite/sys_vars/r/auto_increment_offset_basic.result10
-rw-r--r--mysql-test/suite/sys_vars/r/auto_increment_offset_func.result2
-rw-r--r--mysql-test/suite/sys_vars/r/completion_type_func.result155
-rw-r--r--mysql-test/suite/sys_vars/r/concurrent_insert_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/connect_timeout_basic.result2
-rw-r--r--mysql-test/suite/sys_vars/r/default_week_format_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/delayed_insert_timeout_basic.result2
-rw-r--r--mysql-test/suite/sys_vars/r/div_precision_increment_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/expire_logs_days_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/group_concat_max_len_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/interactive_timeout_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/max_allowed_packet_basic.result2
-rw-r--r--mysql-test/suite/sys_vars/r/max_binlog_size_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/max_connections_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/max_delayed_threads_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/max_error_count_basic.result8
-rw-r--r--mysql-test/suite/sys_vars/r/max_insert_delayed_threads_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/max_length_for_sort_data_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/max_prepared_stmt_count_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/max_relay_log_size_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/max_sort_length_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/max_sp_recursion_depth_basic.result8
-rw-r--r--mysql-test/suite/sys_vars/r/myisam_data_pointer_size_basic.result2
-rw-r--r--mysql-test/suite/sys_vars/r/net_buffer_length_basic.result2
-rw-r--r--mysql-test/suite/sys_vars/r/net_read_timeout_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/net_write_timeout_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/optimizer_prune_level_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/optimizer_search_depth_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/preload_buffer_size_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/read_buffer_size_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/read_rnd_buffer_size_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/rpl_recovery_rank_basic_32.result6
-rw-r--r--mysql-test/suite/sys_vars/r/server_id_basic_32.result2
-rw-r--r--mysql-test/suite/sys_vars/r/server_id_basic_64.result8
-rw-r--r--mysql-test/suite/sys_vars/r/slave_net_timeout_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/slow_launch_time_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/table_definition_cache_basic.result2
-rw-r--r--mysql-test/suite/sys_vars/r/table_lock_wait_timeout_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/r/table_open_cache_basic.result4
-rw-r--r--mysql-test/suite/sys_vars/t/completion_type_func-master.opt1
-rw-r--r--mysql-test/suite/sys_vars/t/completion_type_func.test136
-rw-r--r--mysql-test/t/alter_table-big.test9
-rw-r--r--mysql-test/t/archive.test15
-rw-r--r--mysql-test/t/connect.test84
-rw-r--r--mysql-test/t/consistent_snapshot.test44
-rw-r--r--mysql-test/t/ddl_i18n_koi8r.test50
-rw-r--r--mysql-test/t/ddl_i18n_utf8.test50
-rw-r--r--mysql-test/t/dirty_close.test21
-rw-r--r--mysql-test/t/disabled.def2
-rw-r--r--mysql-test/t/drop.test25
-rw-r--r--mysql-test/t/events_bugs.test12
-rw-r--r--mysql-test/t/explain.test17
-rw-r--r--mysql-test/t/flush_block_commit.test96
-rw-r--r--mysql-test/t/flush_block_commit_notembedded.test47
-rw-r--r--mysql-test/t/flush_read_lock_kill.test33
-rw-r--r--mysql-test/t/func_group.test2
-rw-r--r--mysql-test/t/func_math.test21
-rw-r--r--mysql-test/t/group_by.test18
-rw-r--r--mysql-test/t/group_min_max.test22
-rw-r--r--mysql-test/t/information_schema.test9
-rw-r--r--mysql-test/t/init_connect.test10
-rw-r--r--mysql-test/t/innodb-autoinc.test88
-rw-r--r--mysql-test/t/innodb_bug42419.test78
-rw-r--r--mysql-test/t/innodb_mysql-master.opt2
-rw-r--r--mysql-test/t/innodb_mysql.test51
-rw-r--r--mysql-test/t/lock.test30
-rw-r--r--mysql-test/t/lock_multi.test146
-rw-r--r--mysql-test/t/log_tables.test4
-rw-r--r--mysql-test/t/merge.test18
-rw-r--r--mysql-test/t/mysql.test100
-rw-r--r--mysql-test/t/mysqlbinlog.test101
-rw-r--r--mysql-test/t/mysqldump-compat.test8
-rw-r--r--mysql-test/t/mysqldump.test34
-rw-r--r--mysql-test/t/mysqltest.test163
-rw-r--r--mysql-test/t/partition.test8
-rw-r--r--mysql-test/t/partition_error.test15
-rw-r--r--mysql-test/t/ps.test31
-rw-r--r--mysql-test/t/query_cache_28249.test1
-rw-r--r--mysql-test/t/read_only.test17
-rw-r--r--mysql-test/t/select.test16
-rw-r--r--mysql-test/t/show_check.test101
-rw-r--r--mysql-test/t/skip_name_resolve.test23
-rw-r--r--mysql-test/t/sp-security.test52
-rw-r--r--mysql-test/t/sp_notembedded.test35
-rw-r--r--mysql-test/t/ssl-big.test28
-rw-r--r--mysql-test/t/ssl.test8
-rw-r--r--mysql-test/t/ssl_compress.test10
-rw-r--r--mysql-test/t/status.test10
-rw-r--r--mysql-test/t/strict.test4
-rw-r--r--mysql-test/t/trigger-compat.test25
-rw-r--r--mysql-test/t/type_bit_innodb.test2
-rw-r--r--mysql-test/t/user_limits.test41
-rw-r--r--mysql-test/t/variables.test139
-rw-r--r--mysql-test/t/view.test823
-rw-r--r--mysql-test/t/view_grant.test277
-rw-r--r--mysql-test/t/wait_timeout.test13
-rw-r--r--mysql-test/t/xa.test28
-rw-r--r--mysys/default.c75
-rw-r--r--mysys/errors.c16
-rw-r--r--mysys/md5.c567
-rw-r--r--mysys/my_error.c13
-rw-r--r--mysys/my_fstream.c6
-rw-r--r--mysys/my_getopt.c20
-rw-r--r--mysys/my_pread.c6
-rw-r--r--mysys/my_write.c6
-rw-r--r--plugin/Makefile.am2
-rw-r--r--scripts/mysql_system_tables.sql6
-rw-r--r--scripts/mysql_system_tables_fix.sql19
-rw-r--r--scripts/mysqld_safe.sh48
-rw-r--r--scripts/mysqldumpslow.sh4
-rw-r--r--server-tools/instance-manager/instance_map.cc3
-rw-r--r--server-tools/instance-manager/options.cc4
-rw-r--r--server-tools/instance-manager/options.h3
-rw-r--r--sql-bench/TODO21
-rw-r--r--sql-common/client.c2
-rw-r--r--sql/ha_partition.cc5
-rw-r--r--sql/handler.cc2
-rw-r--r--sql/item.cc1
-rw-r--r--sql/item_func.cc10
-rw-r--r--sql/item_strfunc.cc5
-rw-r--r--sql/item_sum.cc3
-rw-r--r--sql/log.cc7
-rw-r--r--sql/log_event.cc6
-rw-r--r--sql/log_event.h2
-rw-r--r--sql/mysql_priv.h6
-rw-r--r--sql/mysqld.cc209
-rw-r--r--sql/opt_range.cc57
-rw-r--r--sql/protocol.cc23
-rw-r--r--sql/rpl_record.cc34
-rw-r--r--sql/rpl_rli.cc5
-rw-r--r--sql/rpl_rli.h7
-rw-r--r--sql/set_var.cc232
-rw-r--r--sql/share/errmsg.txt39
-rw-r--r--sql/sp.cc4
-rw-r--r--sql/sql_base.cc3
-rw-r--r--sql/sql_cache.cc47
-rw-r--r--sql/sql_class.cc4
-rw-r--r--sql/sql_class.h2
-rw-r--r--sql/sql_handler.cc19
-rw-r--r--sql/sql_lex.cc1
-rw-r--r--sql/sql_lex.h9
-rw-r--r--sql/sql_load.cc29
-rw-r--r--sql/sql_parse.cc57
-rw-r--r--sql/sql_plugin.cc35
-rw-r--r--sql/sql_select.cc12
-rw-r--r--sql/sql_show.cc44
-rw-r--r--sql/sql_table.cc11
-rw-r--r--sql/sql_view.cc52
-rw-r--r--sql/sql_yacc.yy17
-rw-r--r--sql/table.cc6
-rw-r--r--sql/unireg.cc17
-rw-r--r--storage/Makefile.am1
-rw-r--r--storage/archive/ha_archive.cc6
-rw-r--r--storage/ibmdb2i/CMakeLists.txt25
-rw-r--r--storage/ibmdb2i/Makefile.am53
-rw-r--r--storage/ibmdb2i/db2i_blobCollection.cc107
-rw-r--r--storage/ibmdb2i/db2i_blobCollection.h151
-rw-r--r--storage/ibmdb2i/db2i_charsetSupport.cc793
-rw-r--r--storage/ibmdb2i/db2i_charsetSupport.h65
-rw-r--r--storage/ibmdb2i/db2i_collationSupport.cc359
-rw-r--r--storage/ibmdb2i/db2i_collationSupport.h48
-rw-r--r--storage/ibmdb2i/db2i_constraints.cc698
-rw-r--r--storage/ibmdb2i/db2i_conversion.cc1446
-rw-r--r--storage/ibmdb2i/db2i_errors.cc297
-rw-r--r--storage/ibmdb2i/db2i_errors.h93
-rw-r--r--storage/ibmdb2i/db2i_file.cc556
-rw-r--r--storage/ibmdb2i/db2i_file.h446
-rw-r--r--storage/ibmdb2i/db2i_global.h138
-rw-r--r--storage/ibmdb2i/db2i_iconv.h51
-rw-r--r--storage/ibmdb2i/db2i_ileBridge.cc1342
-rw-r--r--storage/ibmdb2i/db2i_ileBridge.h499
-rw-r--r--storage/ibmdb2i/db2i_ioBuffers.cc332
-rw-r--r--storage/ibmdb2i/db2i_ioBuffers.h416
-rw-r--r--storage/ibmdb2i/db2i_misc.h107
-rw-r--r--storage/ibmdb2i/db2i_myconv.cc1498
-rw-r--r--storage/ibmdb2i/db2i_myconv.h3200
-rw-r--r--storage/ibmdb2i/db2i_rir.cc465
-rw-r--r--storage/ibmdb2i/db2i_safeString.h98
-rw-r--r--storage/ibmdb2i/db2i_sqlStatementStream.cc86
-rw-r--r--storage/ibmdb2i/db2i_sqlStatementStream.h151
-rw-r--r--storage/ibmdb2i/db2i_validatedPointer.h162
-rw-r--r--storage/ibmdb2i/ha_ibmdb2i.cc3286
-rw-r--r--storage/ibmdb2i/ha_ibmdb2i.h750
-rw-r--r--storage/ibmdb2i/plug.in12
-rw-r--r--storage/innobase/btr/btr0sea.c12
-rw-r--r--storage/innobase/dict/dict0load.c8
-rw-r--r--storage/innobase/handler/ha_innodb.cc43
-rw-r--r--storage/innobase/include/rem0rec.h11
-rw-r--r--storage/innobase/include/rem0rec.ic19
-rw-r--r--storage/innobase/include/trx0roll.h14
-rw-r--r--storage/innobase/lock/lock0lock.c15
-rw-r--r--storage/innobase/trx/trx0roll.c51
-rw-r--r--storage/innobase/trx/trx0trx.c4
-rw-r--r--storage/myisam/ha_myisam.cc4
-rw-r--r--storage/myisam/myisamchk.c1
-rw-r--r--storage/myisammrg/ha_myisammrg.cc10
-rw-r--r--support-files/Makefile.am1
-rw-r--r--support-files/mysql.spec.sh12
-rw-r--r--tests/mysql_client_test.c15
365 files changed, 25326 insertions, 3772 deletions
diff --git a/.bzrignore b/.bzrignore
index 01ef6f2ffef..fad758b54b8 100644
--- a/.bzrignore
+++ b/.bzrignore
@@ -1295,6 +1295,8 @@ mysql-test/linux_sys_vars.inc
mysql-test/load_sysvars.inc
mysql-test/mtr
mysql-test/mysql-test-run
+mysql-test/mysql-test-gcov.err
+mysql-test/mysql-test-gcov.msg
mysql-test/mysql-test-run-shell
mysql-test/mysql-test-run.log
mysql-test/mysql_test_run_new
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0657013089b..7c173c9cb49 100755
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -144,7 +144,13 @@ IF(MSVC)
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})
-
+
+ # Mark 32 bit executables large address aware so they can
+ # use > 2GB address space
+ IF(CMAKE_SIZEOF_VOID_P MATCHES 4)
+ SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LARGEADDRESSAWARE")
+ ENDIF(CMAKE_SIZEOF_VOID_P MATCHES 4)
+
# Disable automatic manifest generation.
STRING(REPLACE "/MANIFEST" "/MANIFEST:NO" CMAKE_EXE_LINKER_FLAGS
${CMAKE_EXE_LINKER_FLAGS})
diff --git a/client/my_readline.h b/client/my_readline.h
index 3ebe24b75b8..62ad19bece9 100644
--- a/client/my_readline.h
+++ b/client/my_readline.h
@@ -29,5 +29,5 @@ typedef struct st_line_buffer
extern LINE_BUFFER *batch_readline_init(ulong max_size,FILE *file);
extern LINE_BUFFER *batch_readline_command(LINE_BUFFER *buffer, char * str);
-extern char *batch_readline(LINE_BUFFER *buffer);
+extern char *batch_readline(LINE_BUFFER *buffer, bool *truncated);
extern void batch_readline_end(LINE_BUFFER *buffer);
diff --git a/client/mysql.cc b/client/mysql.cc
index 95a5cda3689..0c815484339 100644
--- a/client/mysql.cc
+++ b/client/mysql.cc
@@ -115,6 +115,8 @@ extern "C" {
#define PROMPT_CHAR '\\'
#define DEFAULT_DELIMITER ";"
+#define MAX_BATCH_BUFFER_SIZE (1024L * 1024L)
+
typedef struct st_status
{
int exit_status;
@@ -1045,7 +1047,7 @@ static void fix_history(String *final_command);
static COMMANDS *find_command(char *name,char cmd_name);
static bool add_line(String &buffer,char *line,char *in_string,
- bool *ml_comment);
+ bool *ml_comment, bool truncated);
static void remove_cntrl(String &buffer);
static void print_table_data(MYSQL_RES *result);
static void print_table_data_html(MYSQL_RES *result);
@@ -1117,7 +1119,7 @@ int main(int argc,char *argv[])
exit(1);
}
if (status.batch && !status.line_buff &&
- !(status.line_buff=batch_readline_init(opt_max_allowed_packet+512,stdin)))
+ !(status.line_buff= batch_readline_init(MAX_BATCH_BUFFER_SIZE, stdin)))
{
free_defaults(defaults_argv);
my_end(0);
@@ -1810,13 +1812,14 @@ static int read_and_execute(bool interactive)
ulong line_number=0;
bool ml_comment= 0;
COMMANDS *com;
+ bool truncated= 0;
status.exit_status=1;
for (;;)
{
if (!interactive)
{
- line=batch_readline(status.line_buff);
+ line=batch_readline(status.line_buff, &truncated);
/*
Skip UTF8 Byte Order Marker (BOM) 0xEFBBBF.
Editors like "notepad" put this marker in
@@ -1913,7 +1916,7 @@ static int read_and_execute(bool interactive)
#endif
continue;
}
- if (add_line(glob_buffer,line,&in_string,&ml_comment))
+ if (add_line(glob_buffer,line,&in_string,&ml_comment, truncated))
break;
}
/* if in batch mode, send last query even if it doesn't end with \g or go */
@@ -1999,7 +2002,7 @@ static COMMANDS *find_command(char *name,char cmd_char)
static bool add_line(String &buffer,char *line,char *in_string,
- bool *ml_comment)
+ bool *ml_comment, bool truncated)
{
uchar inchar;
char buff[80], *pos, *out;
@@ -2245,8 +2248,23 @@ static bool add_line(String &buffer,char *line,char *in_string,
}
if (out != line || !buffer.is_empty())
{
- *out++='\n';
uint length=(uint) (out-line);
+
+ if (!truncated &&
+ (length < 9 ||
+ my_strnncoll (charset_info,
+ (uchar *)line, 9, (const uchar *) "delimiter", 9)))
+ {
+ /*
+ Don't add a new line in case there's a DELIMITER command to be
+ added to the glob buffer (e.g. on processing a line like
+ "<command>;DELIMITER <non-eof>") : similar to how a new line is
+ not added in the case when the DELIMITER is the first command
+ entered with an empty glob buffer.
+ */
+ *out++='\n';
+ length++;
+ }
if (buffer.length() + length >= buffer.alloced_length())
buffer.realloc(buffer.length()+length+IO_SIZE);
if ((!*ml_comment || preserve_comments) && buffer.append(line, length))
@@ -2855,7 +2873,7 @@ com_charset(String *buffer __attribute__((unused)), char *line)
param= get_arg(buff, 0);
if (!param || !*param)
{
- return put_info("Usage: \\C char_setname | charset charset_name",
+ return put_info("Usage: \\C charset_name | charset charset_name",
INFO_ERROR, 0);
}
new_cs= get_charset_by_csname(param, MY_CS_PRIMARY, MYF(MY_WME));
@@ -3907,7 +3925,7 @@ static int com_source(String *buffer, char *line)
return put_info(buff, INFO_ERROR, 0);
}
- if (!(line_buff=batch_readline_init(opt_max_allowed_packet+512,sql_file)))
+ if (!(line_buff= batch_readline_init(MAX_BATCH_BUFFER_SIZE, sql_file)))
{
my_fclose(sql_file,MYF(0));
return put_info("Can't initialize batch_readline", INFO_ERROR, 0);
diff --git a/client/mysqldump.c b/client/mysqldump.c
index 44c53a0e4c2..0f75f0b7315 100644
--- a/client/mysqldump.c
+++ b/client/mysqldump.c
@@ -1,4 +1,4 @@
-/* Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.
+/* Copyright 2000-2008 MySQL AB, 2008, 2009 Sun Microsystems, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -1475,7 +1475,8 @@ static int connect_to_db(char *host, char *user,char *passwd)
DB_error(&mysql_connection, "when trying to connect");
DBUG_RETURN(1);
}
- if (mysql_get_server_version(&mysql_connection) < 40100)
+ if ((mysql_get_server_version(&mysql_connection) < 40100) ||
+ (opt_compatible_mode & 3))
{
/* Don't dump SET NAMES with a pre-4.1 server (bug#7997). */
opt_set_charset= 0;
@@ -2421,11 +2422,11 @@ static uint get_table_structure(char *table, char *db, char *table_type,
row= mysql_fetch_row(result);
- fprintf(sql_file,
- "SET @saved_cs_client = @@character_set_client;\n"
- "SET character_set_client = utf8;\n"
+ fprintf(sql_file, (opt_compatible_mode & 3) ? "%s;\n" :
+ "/*!40101 SET @saved_cs_client = @@character_set_client */;\n"
+ "/*!40101 SET character_set_client = utf8 */;\n"
"%s;\n"
- "SET character_set_client = @saved_cs_client;\n",
+ "/*!40101 SET character_set_client = @saved_cs_client */;\n",
row[1]);
check_io(sql_file);
diff --git a/client/readline.cc b/client/readline.cc
index 7afdbc9531e..b32cb71b0de 100644
--- a/client/readline.cc
+++ b/client/readline.cc
@@ -24,7 +24,7 @@ static bool init_line_buffer(LINE_BUFFER *buffer,File file,ulong size,
ulong max_size);
static bool init_line_buffer_from_string(LINE_BUFFER *buffer,char * str);
static size_t fill_buffer(LINE_BUFFER *buffer);
-static char *intern_read_line(LINE_BUFFER *buffer,ulong *out_length);
+static char *intern_read_line(LINE_BUFFER *buffer, ulong *out_length, bool *truncated);
LINE_BUFFER *batch_readline_init(ulong max_size,FILE *file)
@@ -42,12 +42,13 @@ LINE_BUFFER *batch_readline_init(ulong max_size,FILE *file)
}
-char *batch_readline(LINE_BUFFER *line_buff)
+char *batch_readline(LINE_BUFFER *line_buff, bool *truncated)
{
char *pos;
ulong out_length;
+ DBUG_ASSERT(truncated != NULL);
- if (!(pos=intern_read_line(line_buff,&out_length)))
+ if (!(pos=intern_read_line(line_buff,&out_length, truncated)))
return 0;
if (out_length && pos[out_length-1] == '\n')
if (--out_length && pos[out_length-1] == '\r') /* Remove '\n' */
@@ -149,6 +150,14 @@ static size_t fill_buffer(LINE_BUFFER *buffer)
read_count=(buffer->bufread - bufbytes)/IO_SIZE;
if ((read_count*=IO_SIZE))
break;
+ if (buffer->bufread * 2 > buffer->max_size)
+ {
+ /*
+ So we must grow the buffer but we cannot due to the max_size limit.
+ Return 0 w/o setting buffer->eof to signal this condition.
+ */
+ return 0;
+ }
buffer->bufread *= 2;
if (!(buffer->buffer = (char*) my_realloc(buffer->buffer,
buffer->bufread+1,
@@ -172,11 +181,15 @@ static size_t fill_buffer(LINE_BUFFER *buffer)
DBUG_PRINT("fill_buff", ("Got %lu bytes", (ulong) read_count));
- /* Kludge to pretend every nonempty file ends with a newline. */
- if (!read_count && bufbytes && buffer->end[-1] != '\n')
+ if (!read_count)
{
- buffer->eof = read_count = 1;
- *buffer->end = '\n';
+ buffer->eof = 1;
+ /* Kludge to pretend every nonempty file ends with a newline. */
+ if (bufbytes && buffer->end[-1] != '\n')
+ {
+ read_count = 1;
+ *buffer->end = '\n';
+ }
}
buffer->end_of_line=(buffer->start_of_line=buffer->buffer)+bufbytes;
buffer->end+=read_count;
@@ -186,7 +199,7 @@ static size_t fill_buffer(LINE_BUFFER *buffer)
-char *intern_read_line(LINE_BUFFER *buffer,ulong *out_length)
+char *intern_read_line(LINE_BUFFER *buffer, ulong *out_length, bool *truncated)
{
char *pos;
size_t length;
@@ -200,14 +213,23 @@ char *intern_read_line(LINE_BUFFER *buffer,ulong *out_length)
pos++;
if (pos == buffer->end)
{
- if ((uint) (pos - buffer->start_of_line) < buffer->max_size)
+ /*
+ fill_buffer() can return 0 either on EOF in which case we abort
+ or when the internal buffer has hit the size limit. In the latter case
+ return what we have read so far and signal string truncation.
+ */
+ if (!(length=fill_buffer(buffer)) || length == (uint) -1)
{
- if (!(length=fill_buffer(buffer)) || length == (size_t) -1)
- DBUG_RETURN(0);
- continue;
+ if (buffer->eof)
+ DBUG_RETURN(0);
}
+ else
+ continue;
pos--; /* break line here */
+ *truncated= 1;
}
+ else
+ *truncated= 0;
buffer->end_of_line=pos+1;
*out_length=(ulong) (pos + 1 - buffer->eof - buffer->start_of_line);
DBUG_RETURN(buffer->start_of_line);
diff --git a/cmd-line-utils/libedit/makelist.sh b/cmd-line-utils/libedit/makelist.sh
index fdd3f934e15..5d25b4776c9 100644
--- a/cmd-line-utils/libedit/makelist.sh
+++ b/cmd-line-utils/libedit/makelist.sh
@@ -84,7 +84,7 @@ case $FLAG in
cat $FILES | $AWK '
BEGIN {
printf("/* Automatically generated file, do not edit */\n");
- printf("#include \"sys.h\"\n#include \"el.h\"\n");
+ printf("#include \"config.h\"\n#include \"el.h\"\n");
printf("private const struct el_bindings_t el_func_help[] = {\n");
low = "abcdefghijklmnopqrstuvwxyz_";
high = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_";
@@ -169,7 +169,7 @@ case $FLAG in
cat $FILES | $AWK '/el_action_t/ { print $3 }' | sort | $AWK '
BEGIN {
printf("/* Automatically generated file, do not edit */\n");
- printf("#include \"sys.h\"\n#include \"el.h\"\n");
+ printf("#include \"config.h\"\n#include \"el.h\"\n");
printf("private const el_func_t el_func[] = {");
maxlen = 80;
needn = 1;
diff --git a/cmd-line-utils/libedit/readline.c b/cmd-line-utils/libedit/readline.c
index ca8796fbd37..1f1b18c97d8 100644
--- a/cmd-line-utils/libedit/readline.c
+++ b/cmd-line-utils/libedit/readline.c
@@ -51,13 +51,10 @@
#else
#include "np/vis.h"
#endif
-#ifdef HAVE_ALLOCA_H
-#include <alloca.h>
-#endif
+#include "readline/readline.h"
#include "el.h"
#include "fcns.h" /* for EL_NUM_FCNS */
#include "histedit.h"
-#include "readline/readline.h"
#include "filecomplete.h"
void rl_prep_terminal(int);
diff --git a/cmd-line-utils/libedit/readline/readline.h b/cmd-line-utils/libedit/readline/readline.h
index c4806734bc5..c77b080c439 100644
--- a/cmd-line-utils/libedit/readline/readline.h
+++ b/cmd-line-utils/libedit/readline/readline.h
@@ -66,7 +66,7 @@ typedef KEYMAP_ENTRY *Keymap;
#ifndef CTRL
#include <sys/ioctl.h>
-#if !defined(__sun__) && !defined(__hpux__)
+#if !defined(__sun) && !defined(__hpux) && !defined(_AIX)
#include <sys/ttydefaults.h>
#endif
#ifndef CTRL
diff --git a/cmd-line-utils/libedit/vi.c b/cmd-line-utils/libedit/vi.c
index 602383f3231..00a9f493a9b 100644
--- a/cmd-line-utils/libedit/vi.c
+++ b/cmd-line-utils/libedit/vi.c
@@ -914,14 +914,14 @@ vi_comment_out(EditLine *el, int c)
* NB: posix implies that we should enter insert mode, however
* this is against historical precedent...
*/
-#ifdef __weak_reference
+#if defined(__weak_reference) && !defined(__FreeBSD__)
extern char *get_alias_text(const char *) __weak_reference(get_alias_text);
#endif
protected el_action_t
/*ARGSUSED*/
vi_alias(EditLine *el, int c)
{
-#ifdef __weak_reference
+#if defined(__weak_reference) && !defined(__FreeBSD__)
char alias_name[3];
char *alias_text;
diff --git a/config/ac-macros/ha_ndbcluster.m4 b/config/ac-macros/ha_ndbcluster.m4
index 5ee136f2266..3718b64f688 100644
--- a/config/ac-macros/ha_ndbcluster.m4
+++ b/config/ac-macros/ha_ndbcluster.m4
@@ -330,41 +330,11 @@ AC_DEFUN([MYSQL_SETUP_NDBCLUSTER], [
AC_SUBST([NDB_SIZEOF_LONG])
AC_SUBST([NDB_SIZEOF_LONG_LONG])
- AC_CONFIG_FILES(storage/ndb/include/Makefile dnl
- storage/ndb/src/Makefile storage/ndb/src/common/Makefile dnl
- storage/ndb/docs/Makefile dnl
- storage/ndb/tools/Makefile dnl
- storage/ndb/src/common/debugger/Makefile dnl
- storage/ndb/src/common/debugger/signaldata/Makefile dnl
- storage/ndb/src/common/portlib/Makefile dnl
- storage/ndb/src/common/util/Makefile dnl
- storage/ndb/src/common/logger/Makefile dnl
- storage/ndb/src/common/transporter/Makefile dnl
- storage/ndb/src/common/mgmcommon/Makefile dnl
- storage/ndb/src/kernel/Makefile dnl
- storage/ndb/src/kernel/error/Makefile dnl
- storage/ndb/src/kernel/blocks/Makefile dnl
- storage/ndb/src/kernel/blocks/dbdict/Makefile dnl
- storage/ndb/src/kernel/blocks/dbdih/Makefile dnl
- storage/ndb/src/kernel/blocks/dblqh/Makefile dnl
- storage/ndb/src/kernel/blocks/dbtup/Makefile dnl
- storage/ndb/src/kernel/blocks/backup/Makefile dnl
- storage/ndb/src/kernel/vm/Makefile dnl
- storage/ndb/src/mgmapi/Makefile dnl
- storage/ndb/src/ndbapi/Makefile dnl
- storage/ndb/src/mgmsrv/Makefile dnl
- storage/ndb/src/mgmclient/Makefile dnl
- storage/ndb/src/cw/Makefile dnl
- storage/ndb/src/cw/cpcd/Makefile dnl
- storage/ndb/test/Makefile dnl
- storage/ndb/test/src/Makefile dnl
- storage/ndb/test/ndbapi/Makefile dnl
- storage/ndb/test/ndbapi/bank/Makefile dnl
- storage/ndb/test/tools/Makefile dnl
- storage/ndb/test/run-test/Makefile dnl
- storage/ndb/include/ndb_version.h storage/ndb/include/ndb_global.h dnl
- storage/ndb/include/ndb_types.h dnl
- )
+ AC_CONFIG_FILES([
+ storage/ndb/include/ndb_version.h
+ storage/ndb/include/ndb_global.h
+ storage/ndb/include/ndb_types.h
+ ])
])
AC_SUBST(TEST_NDBCLUSTER)
diff --git a/config/ac-macros/plugins.m4 b/config/ac-macros/plugins.m4
index 8dfb698709f..5d15afeda99 100644
--- a/config/ac-macros/plugins.m4
+++ b/config/ac-macros/plugins.m4
@@ -302,7 +302,9 @@ AC_DEFUN([MYSQL_CONFIGURE_PLUGINS],[
_MYSQL_CONFIGURE_PLUGINS(m4_bpatsubst(__mysql_plugin_list__, :, [,]))
_MYSQL_EMIT_PLUGIN_ACTIONS(m4_bpatsubst(__mysql_plugin_list__, :, [,]))
AC_SUBST([mysql_se_dirs])
+ AC_SUBST([mysql_se_distdirs])
AC_SUBST([mysql_pg_dirs])
+ AC_SUBST([mysql_pg_distdirs])
AC_SUBST([mysql_se_unittest_dirs])
AC_SUBST([mysql_pg_unittest_dirs])
AC_SUBST([condition_dependent_plugin_modules])
@@ -354,6 +356,24 @@ AC_DEFUN([__MYSQL_EMIT_CHECK_PLUGIN],[
fi
AC_MSG_RESULT([no])
],[
+
+ # Plugin is not disabled, determine if it should be built,
+ # or only distributed
+
+ m4_ifdef([$6], [
+ if test ! -d "$srcdir/$6"; then
+ # Plugin directory was removed after autoconf was run; treat
+ # this as a disabled plugin
+ if test "X[$with_plugin_]$2" = Xyes; then
+ AC_MSG_RESULT([error])
+ AC_MSG_ERROR([disabled])
+ fi
+
+ # The result message will be printed below
+ [with_plugin_]$2=no
+ fi
+ ])
+
m4_ifdef([$9],[
if test "X[$with_plugin_]$2" = Xno; then
AC_MSG_RESULT([error])
@@ -372,6 +392,8 @@ AC_DEFUN([__MYSQL_EMIT_CHECK_PLUGIN],[
;;
esac
])
+
+
if test "X[$with_plugin_]$2" = Xno; then
AC_MSG_RESULT([no])
else
@@ -448,28 +470,49 @@ dnl Although this is "pretty", it breaks libmysqld build
condition_dependent_plugin_includes="$condition_dependent_plugin_includes -I[\$(top_srcdir)]/$6/m4_bregexp($11, [^.+[/$]], [\&])"
])
fi
- m4_ifdef([$6],[
- if test -n "$mysql_use_plugin_dir" ; then
- mysql_plugin_dirs="$mysql_plugin_dirs $6"
- m4_syscmd(test -f "$6/configure")
- ifelse(m4_sysval, 0,
- [AC_CONFIG_SUBDIRS($6)],
- [AC_CONFIG_FILES($6/Makefile)]
- )
- ifelse(m4_substr($6, 0, 8), [storage/],
- [
- [mysql_se_dirs="$mysql_se_dirs ]m4_substr($6, 8)"
- mysql_se_unittest_dirs="$mysql_se_unittest_dirs ../$6"
- ],
- m4_substr($6, 0, 7), [plugin/],
- [
- [mysql_pg_dirs="$mysql_pg_dirs ]m4_substr($6, 7)"
- mysql_pg_unittest_dirs="$mysql_pg_unittest_dirs ../$6"
- ],
- [AC_FATAL([don't know how to handle plugin dir ]$6)])
- fi
- ])
fi
+
+ m4_ifdef([$6], [
+ if test -d "$srcdir/$6"; then
+ # Even if we don't build a plugin, we bundle its source into the dist
+ # file. So its Makefile (and Makefiles for any subdirs) must be
+ # generated for 'make dist' to work.
+ m4_syscmd([test -f "]$6[/configure"])
+ ifelse(m4_sysval, 0,
+ [AC_CONFIG_SUBDIRS($6)],
+ [
+ # autoconf doesn't provide an automatic way to configure DIST_SUBDIRS of
+ # a subdir; for our purposes, it's enough to just check for existing
+ # Makefile.am files and add them in here
+dnl
+dnl Warning, don't try to quote the m4_esyscmd() macro, it doesn't
+dnl work. Quoting here is tricky.
+dnl
+dnl The $FIND or $SED variable can be set by the user when calling autoconf itself
+dnl to if they need to pass a specific path. This is *NOT* used when calling
+dnl running configure!
+dnl
+ AC_CONFIG_FILES(m4_esyscmd([${FIND-find} "]$6[" -name Makefile.am -print | ${SED-sed} 's,\.am$,,']))
+ ]
+ )
+
+ ifelse(
+ m4_substr($6, 0, 8), [storage/], [
+ mysql_se_distdirs="$mysql_se_distdirs m4_substr($6, 8)"
+ if test -n "$mysql_use_plugin_dir" ; then
+ mysql_se_dirs="$mysql_se_dirs m4_substr($6, 8)"
+ mysql_se_unittest_dirs="$mysql_se_unittest_dirs ../$6"
+ fi],
+
+ m4_substr($6, 0, 7), [plugin/], [
+ mysql_pg_distdirs="$mysql_pg_distdirs m4_substr($6, 7)"
+ if test -n "$mysql_use_plugin_dir" ; then
+ mysql_pg_dirs="$mysql_pg_dirs m4_substr($6, 7)"
+ mysql_pg_unittest_dirs="$mysql_pg_unittest_dirs ../$6"
+ fi],
+ [AC_FATAL([don't know how to handle plugin dir ]$6)])
+ fi
+ ])
])
])
diff --git a/configure.in b/configure.in
index dc6841e5cf8..d86218bd782 100644
--- a/configure.in
+++ b/configure.in
@@ -10,7 +10,7 @@ AC_CANONICAL_SYSTEM
#
# When changing major version number please also check switch statement
# in mysqlbinlog::check_master_version().
-AM_INIT_AUTOMAKE(mysql, 5.1.33)
+AM_INIT_AUTOMAKE(mysql, 5.1.34)
AM_CONFIG_HEADER([include/config.h:config.h.in])
PROTOCOL_VERSION=10
@@ -36,6 +36,7 @@ MYSQL_NUMERIC_VERSION=`echo $MYSQL_NO_DASH_VERSION | sed -e "s|[[a-z]][[a-z0-9]]
MYSQL_BASE_VERSION=`echo $MYSQL_NUMERIC_VERSION | sed -e "s|\.[[^.]]*$||"`
MYSQL_VERSION_ID=`echo $MYSQL_NUMERIC_VERSION | \
awk -F. '{printf "%d%0.2d%0.2d", $1, $2, $3}'`
+MYSQL_COPYRIGHT_YEAR=`date '+%Y'`
# Add previous major version for debian package upgrade path
MYSQL_PREVIOUS_BASE_VERSION=5.0
@@ -70,6 +71,7 @@ AC_SUBST(MYSQL_NO_DASH_VERSION)
AC_SUBST(MYSQL_BASE_VERSION)
AC_SUBST(MYSQL_VERSION_ID)
AC_SUBST(MYSQL_PREVIOUS_BASE_VERSION)
+AC_SUBST(MYSQL_COPYRIGHT_YEAR)
AC_SUBST(PROTOCOL_VERSION)
AC_DEFINE_UNQUOTED([PROTOCOL_VERSION], [$PROTOCOL_VERSION],
[mysql client protocol version])
@@ -815,7 +817,7 @@ AC_TYPE_SIZE_T
AC_HEADER_DIRENT
AC_HEADER_STDC
AC_HEADER_SYS_WAIT
-AC_CHECK_HEADERS(fcntl.h float.h floatingpoint.h ieeefp.h limits.h \
+AC_CHECK_HEADERS(fcntl.h fenv.h float.h floatingpoint.h ieeefp.h limits.h \
memory.h pwd.h select.h \
stdlib.h stddef.h \
strings.h string.h synch.h sys/mman.h sys/socket.h netinet/in.h arpa/inet.h \
@@ -2038,7 +2040,7 @@ AC_FUNC_VPRINTF
AC_CHECK_FUNCS(alarm bcmp bfill bmove bsearch bzero \
chsize cuserid fchmod fcntl \
- fconvert fdatasync finite fpresetsticky fpsetmask fsync ftruncate \
+ fconvert fdatasync fesetround finite fpresetsticky fpsetmask fsync ftruncate \
getcwd gethostbyaddr_r gethostbyname_r getpass getpassphrase getpwnam \
getpwuid getrlimit getrusage getwd index initgroups isnan \
localtime_r gethrtime gmtime_r \
diff --git a/include/config-win.h b/include/config-win.h
index ab0926af864..3a21551ebbb 100644
--- a/include/config-win.h
+++ b/include/config-win.h
@@ -33,7 +33,6 @@ functions */
#include <sys/locking.h>
#include <winsock2.h>
-#include <math.h> /* Because of rint() */
#include <fcntl.h>
#include <io.h>
#include <malloc.h>
@@ -223,13 +222,6 @@ typedef uint rf_SetTimer;
#define inline __inline
#endif /* __cplusplus */
-inline double rint(double nr)
-{
- double f = floor(nr);
- double c = ceil(nr);
- return (((c-nr) >= (nr-f)) ? f :c);
-}
-
#ifdef _WIN64
#define ulonglong2double(A) ((double) (ulonglong) (A))
#define my_off_t2double(A) ((double) (my_off_t) (A))
@@ -284,7 +276,6 @@ inline ulonglong double2ulonglong(double d)
#define HAVE_FLOAT_H
#define HAVE_LIMITS_H
#define HAVE_STDDEF_H
-#define HAVE_RINT /* defined in this file */
#define NO_FCNTL_NONBLOCK /* No FCNTL */
#define HAVE_ALLOCA
#define HAVE_STRPBRK
diff --git a/include/my_getopt.h b/include/my_getopt.h
index 50ebe9190d8..7cbad607aac 100644
--- a/include/my_getopt.h
+++ b/include/my_getopt.h
@@ -72,7 +72,7 @@ extern void my_cleanup_options(const struct my_option *options);
extern void my_print_help(const struct my_option *options);
extern void my_print_variables(const struct my_option *options);
extern void my_getopt_register_get_addr(uchar ** (*func_addr)(const char *, uint,
- const struct my_option *));
+ const struct my_option *, int *));
ulonglong getopt_ull_limit_value(ulonglong num, const struct my_option *optp,
my_bool *fix);
diff --git a/include/my_global.h b/include/my_global.h
index 8c25cbf802e..ad86aeb749f 100644
--- a/include/my_global.h
+++ b/include/my_global.h
@@ -424,6 +424,9 @@ C_MODE_END
#ifdef HAVE_FLOAT_H
#include <float.h>
#endif
+#ifdef HAVE_FENV_H
+#include <fenv.h> /* For fesetround() */
+#endif
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
@@ -578,8 +581,39 @@ typedef unsigned short ushort;
#define set_bits(type, bit_count) (sizeof(type)*8 <= (bit_count) ? ~(type) 0 : ((((type) 1) << (bit_count)) - (type) 1))
#define array_elements(A) ((uint) (sizeof(A)/sizeof(A[0])))
#ifndef HAVE_RINT
-#define rint(A) floor((A)+(((A) < 0)? -0.5 : 0.5))
-#endif
+/**
+ All integers up to this number can be represented exactly as double precision
+ values (DBL_MANT_DIG == 53 for IEEE 754 hardware).
+*/
+#define MAX_EXACT_INTEGER ((1LL << DBL_MANT_DIG) - 1)
+
+/**
+ rint(3) implementation for platforms that do not have it.
+ Always rounds to the nearest integer with ties being rounded to the nearest
+ even integer to mimic glibc's rint() behavior in the "round-to-nearest"
+ FPU mode. Hardware-specific optimizations are possible (frndint on x86).
+ Unlike this implementation, hardware will also honor the FPU rounding mode.
+*/
+
+static inline double rint(double x)
+{
+ double f, i;
+ f = modf(x, &i);
+ /*
+ All doubles with absolute values > MAX_EXACT_INTEGER are even anyway,
+ no need to check it.
+ */
+ if (x > 0.0)
+ i += (double) ((f > 0.5) || (f == 0.5 &&
+ i <= (double) MAX_EXACT_INTEGER &&
+ (longlong) i % 2));
+ else
+ i -= (double) ((f < -0.5) || (f == -0.5 &&
+ i >= (double) -MAX_EXACT_INTEGER &&
+ (longlong) i % 2));
+ return i;
+}
+#endif /* HAVE_RINT */
/* Define some general constants */
#ifndef TRUE
diff --git a/include/my_md5.h b/include/my_md5.h
index f92976b3beb..6458f27c5cc 100644
--- a/include/my_md5.h
+++ b/include/my_md5.h
@@ -13,80 +13,42 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+/* See md5.c for explanation and copyright information. */
-/* MD5.H - header file for MD5C.C
+/*
+ * $FreeBSD: src/contrib/cvs/lib/md5.h,v 1.2 1999/12/11 15:10:02 peter Exp $
*/
-/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
-rights reserved.
+/* Unlike previous versions of this code, uint32 need not be exactly
+ 32 bits, merely 32 bits or more. Choosing a data type which is 32
+ bits instead of 64 is not important; speed is considerably more
+ important. ANSI guarantees that "unsigned long" will be big enough,
+ and always using it seems to have few disadvantages. */
+typedef uint32 cvs_uint32;
-License to copy and use this software is granted provided that it
-is identified as the "RSA Data Security, Inc. MD5 Message-Digest
-Algorithm" in all material mentioning or referencing this software
-or this function.
-
-License is also granted to make and use derivative works provided
-that such works are identified as "derived from the RSA Data
-Security, Inc. MD5 Message-Digest Algorithm" in all material
-mentioning or referencing the derived work.
-
-RSA Data Security, Inc. makes no representations concerning either
-the merchantability of this software or the suitability of this
-software for any particular purpose. It is provided "as is"
-without express or implied warranty of any kind.
-
-These notices must be retained in any copies of any part of this
-documentation and/or software.
- */
-
-/* GLOBAL.H - RSAREF types and constants
- */
-
-/* PROTOTYPES should be set to one if and only if the compiler supports
- function argument prototyping.
-The following makes PROTOTYPES default to 0 if it has not already
- been defined with C compiler flags.
- */
-
-/* egcs 1.1.2 under linux didn't defined it.... :( */
-
-#ifndef PROTOTYPES
-#define PROTOTYPES 1 /* Assume prototypes */
-#endif
-
-/* POINTER defines a generic pointer type */
-typedef unsigned char *POINTER;
-
-/* UINT2 defines a two byte word */
-typedef uint16 UINT2; /* Fix for MySQL / Alpha */
-
-/* UINT4 defines a four byte word */
-typedef uint32 UINT4; /* Fix for MySQL / Alpha */
-
-/* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
-If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it
- returns an empty list.
- */
-#if PROTOTYPES
-#define PROTO_LIST(list) list
-#else
-#define PROTO_LIST(list) ()
-#endif
-/* MD5 context. */
typedef struct {
- UINT4 state[4]; /* state (ABCD) */
- UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */
- unsigned char buffer[64]; /* input buffer */
-} my_MD5_CTX;
+ cvs_uint32 buf[4];
+ cvs_uint32 bits[2];
+ unsigned char in[64];
+} my_MD5Context;
#ifdef __cplusplus
extern "C" {
#endif
- void my_MD5Init PROTO_LIST ((my_MD5_CTX *));
- void my_MD5Update PROTO_LIST
- ((my_MD5_CTX *, unsigned char *, unsigned int));
- void my_MD5Final PROTO_LIST ((unsigned char [16], my_MD5_CTX *));
+void my_MD5Init (my_MD5Context *context);
+void my_MD5Update (my_MD5Context *context,
+ unsigned char const *buf, unsigned len);
+void my_MD5Final (unsigned char digest[16],
+ my_MD5Context *context);
#ifdef __cplusplus
}
#endif
+
+#define MY_MD5_HASH(digest,buf,len) \
+do { \
+ my_MD5Context ctx; \
+ my_MD5Init (&ctx); \
+ my_MD5Update (&ctx, buf, len); \
+ my_MD5Final (digest, &ctx); \
+} while (0)
diff --git a/include/my_sys.h b/include/my_sys.h
index 5335b65822f..01804cd089f 100644
--- a/include/my_sys.h
+++ b/include/my_sys.h
@@ -637,6 +637,7 @@ extern int nt_share_delete(const char *name,myf MyFlags);
extern void TERMINATE(FILE *file, uint flag);
#endif
extern void init_glob_errs(void);
+extern void wait_for_free_space(const char *filename, int errors);
extern FILE *my_fopen(const char *FileName,int Flags,myf MyFlags);
extern FILE *my_fdopen(File Filedes,const char *name, int Flags,myf MyFlags);
extern int my_fclose(FILE *fd,myf MyFlags);
@@ -842,14 +843,17 @@ extern void *memdup_root(MEM_ROOT *root,const void *str, size_t len);
extern int get_defaults_options(int argc, char **argv,
char **defaults, char **extra_defaults,
char **group_suffix);
+extern int my_load_defaults(const char *conf_file, const char **groups,
+ int *argc, char ***argv, const char ***);
extern int load_defaults(const char *conf_file, const char **groups,
- int *argc, char ***argv);
+ int *argc, char ***argv);
extern int modify_defaults_file(const char *file_location, const char *option,
const char *option_value,
const char *section_name, int remove_option);
extern int my_search_option_files(const char *conf_file, int *argc,
char ***argv, uint *args_used,
- Process_option_func func, void *func_ctx);
+ Process_option_func func, void *func_ctx,
+ const char **default_directories);
extern void free_defaults(char **argv);
extern void my_print_default_files(const char *conf_file);
extern void print_defaults(const char *conf_file, const char **groups);
diff --git a/libmysqld/CMakeLists.txt b/libmysqld/CMakeLists.txt
index 1582f0898d8..1c8f80768d4 100644
--- a/libmysqld/CMakeLists.txt
+++ b/libmysqld/CMakeLists.txt
@@ -201,6 +201,6 @@ ADD_LIBRARY(mysqlserver STATIC ${LIBMYSQLD_SOURCES})
ADD_DEPENDENCIES(mysqlserver GenServerSource GenError)
TARGET_LINK_LIBRARIES(mysqlserver)
-ADD_LIBRARY(libmysqld MODULE cmake_dummy.c libmysqld.def)
+ADD_LIBRARY(libmysqld SHARED cmake_dummy.c libmysqld.def)
ADD_DEPENDENCIES(libmysqld mysqlserver)
TARGET_LINK_LIBRARIES(libmysqld mysqlserver wsock32)
diff --git a/libmysqld/examples/CMakeLists.txt b/libmysqld/examples/CMakeLists.txt
index fa9711b54da..5194836a728 100644
--- a/libmysqld/examples/CMakeLists.txt
+++ b/libmysqld/examples/CMakeLists.txt
@@ -30,12 +30,12 @@ ADD_EXECUTABLE(mysql_embedded ../../client/completion_hash.cc
../../client/mysql.cc ../../client/readline.cc
../../client/sql_string.cc)
TARGET_LINK_LIBRARIES(mysql_embedded debug dbug strings mysys vio yassl taocrypt regex ws2_32)
-ADD_DEPENDENCIES(mysql_embedded libmysqld)
+TARGET_LINK_LIBRARIES(mysql_embedded libmysqld)
ADD_EXECUTABLE(mysqltest_embedded ../../client/mysqltest.cc)
TARGET_LINK_LIBRARIES(mysqltest_embedded debug dbug strings mysys vio yassl taocrypt regex ws2_32)
-ADD_DEPENDENCIES(mysqltest_embedded libmysqld)
+TARGET_LINK_LIBRARIES(mysqltest_embedded libmysqld)
ADD_EXECUTABLE(mysql_client_test_embedded ../../tests/mysql_client_test.c)
TARGET_LINK_LIBRARIES(mysql_client_test_embedded debug dbug strings mysys vio yassl taocrypt regex ws2_32)
-ADD_DEPENDENCIES(mysql_client_test_embedded libmysqld)
+TARGET_LINK_LIBRARIES(mysql_client_test_embedded libmysqld)
diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc
index 23572ad4929..d644c45a66a 100644
--- a/libmysqld/lib_sql.cc
+++ b/libmysqld/lib_sql.cc
@@ -43,6 +43,15 @@ extern char mysql_server_last_error[MYSQL_ERRMSG_SIZE];
static my_bool emb_read_query_result(MYSQL *mysql);
+extern "C" void unireg_clear(int exit_code)
+{
+ DBUG_ENTER("unireg_clear");
+ clean_up(!opt_help && (exit_code || !opt_bootstrap)); /* purecov: inspected */
+ my_end(opt_endinfo ? MY_CHECK_ERROR | MY_GIVE_INFO : 0);
+ DBUG_VOID_RETURN;
+}
+
+
/*
Reads error information from the MYSQL_DATA and puts
it into proper MYSQL members
diff --git a/mysql-test/Makefile.am b/mysql-test/Makefile.am
index dc9fbbd9aa5..5e3582d5e16 100644
--- a/mysql-test/Makefile.am
+++ b/mysql-test/Makefile.am
@@ -71,17 +71,17 @@ SUBDIRS = lib/My/SafeProcess
EXTRA_DIST = README \
valgrind.supp \
$(test_SCRIPTS) \
- $(nobase_test_DATA)
+ $(nobase_test_DATA)
# List of directories containing test + result files and the
# related test data files that should be copied
-TEST_DIRS = t r include std_data std_data/parts \
+TEST_DIRS = t r include std_data std_data/parts collections \
std_data/ndb_backup50 std_data/ndb_backup51 \
std_data/ndb_backup51_data_be std_data/ndb_backup51_data_le \
std_data/funcs_1 \
extra/binlog_tests/ extra/rpl_tests \
suite/binlog suite/binlog/t suite/binlog/r suite/binlog/std_data \
- suite/bugs/data suite/bugs/t suite/bugs/r \
+ suite/bugs suite/bugs/data suite/bugs/t suite/bugs/r \
suite/federated \
suite/funcs_1 suite/funcs_1/bitdata \
suite/funcs_1/include suite/funcs_1/lib suite/funcs_1/r \
@@ -90,7 +90,7 @@ TEST_DIRS = t r include std_data std_data/parts \
suite/funcs_2 suite/funcs_2/charset suite/funcs_2/data \
suite/funcs_2/include suite/funcs_2/lib suite/funcs_2/r \
suite/funcs_2/t \
- suite/jp suite/jp/t suite/jp/r suite/jp/std_data \
+ suite/jp suite/jp/t suite/jp/r suite/jp/std_data suite/jp/include \
suite/manual/t suite/manual/r \
suite/ndb_team suite/ndb_team/t suite/ndb_team/r \
suite/rpl suite/rpl/data suite/rpl/include suite/rpl/r \
diff --git a/mysql-test/collections/README b/mysql-test/collections/README
new file mode 100644
index 00000000000..9af84646a40
--- /dev/null
+++ b/mysql-test/collections/README
@@ -0,0 +1,30 @@
+This directory contains collections of test runs that we run during our
+integration and release testing. Each file contains zero or more lines,
+with one invocation of mysql-test-run.pl on each. These invocations are
+written so that, with the assumption that perl is in your search path,
+any collection can run as a shell script or a batch file, with the parent
+mysql-test directory being the current working directory.
+
+During integration testing, we choose the collection to run by following
+these steps:
+
+1) We choose the extension to look for, based on these rules:
+ - If we're running a per-push test, we choose ".push" as the extension.
+ - If we're running a daily test, we choose ".daily" as the extension.
+ - If we're running a weekly test, we choose ".weekly" as the extension.
+
+2) If there is a collection that has the same name as the branch we're
+ testing plus the extension as determined in step 1, we choose that
+ collection.
+
+3) If the branch is unknown or we have removed all characters from it
+ and still not found a matching collection, we choose the name "default"
+ plus the extension determined in step 1. If there is no such file,
+ we give up and don't test anything at all.
+
+4) If we haven't found a collection yet, we remove the last character from
+ the branch name and go back to step 2.
+
+5) The commands from the collection are run line by line via execv() or
+ similar system calls. They are not run as a shell script. Shell
+ expansions are not guaranteed to work and most likely won't.
diff --git a/mysql-test/collections/README.experimental b/mysql-test/collections/README.experimental
new file mode 100644
index 00000000000..9eee2394423
--- /dev/null
+++ b/mysql-test/collections/README.experimental
@@ -0,0 +1,25 @@
+The .experimental files in this directory contain names of test cases that
+are still in development and whose failures should be considered expected,
+instead of regressions.
+
+These files are to be used with the --experimental option of
+mysql-test-run.pl. Please look at its help screen for usage information.
+
+The syntax is as follows:
+
+1) One line per test case.
+
+2) Empty lines and lines starting with a hash (#) are ignored.
+
+3) If any other line contains a blank followed by a hash (#), the hash
+ and any subsequent characters are ignored.
+
+4) The full test case name including the suite and execution mode
+ must be specified, for example:
+ main.alias 'row' # bug#00000
+
+5) As an exception to item 4, the last character of the test case
+ specification may be an asterisk (*). In that case, all test cases that
+ start with the same characters up to the last letter before the asterisk
+ are considered experimental:
+ main.a* # get rid of main.alias, main.alibaba and main.agliolio
diff --git a/mysql-test/collections/default.daily b/mysql-test/collections/default.daily
new file mode 100644
index 00000000000..194cc2aad59
--- /dev/null
+++ b/mysql-test/collections/default.daily
@@ -0,0 +1 @@
+perl mysql-test-run.pl --timer --force --comment=rpl_ndb_row --suite=rpl_ndb,ndb --mysqld=--binlog-format=row --experimental=collections/default.experimental
diff --git a/mysql-test/collections/default.experimental b/mysql-test/collections/default.experimental
new file mode 100644
index 00000000000..103069f79cf
--- /dev/null
+++ b/mysql-test/collections/default.experimental
@@ -0,0 +1 @@
+funcs_1.charset_collation_1 # depends on compile-time decisions
diff --git a/mysql-test/collections/default.push b/mysql-test/collections/default.push
new file mode 100644
index 00000000000..0879b6fde2c
--- /dev/null
+++ b/mysql-test/collections/default.push
@@ -0,0 +1,5 @@
+perl mysql-test-run.pl --timer --force --comment=n_mix --mysqld=--binlog-format=mixed --experimental=collections/default.experimental
+perl mysql-test-run.pl --timer --force --comment=ps_row --ps-protocol --mysqld=--binlog-format=row --experimental=collections/default.experimental
+perl mysql-test-run.pl --timer --force --comment=embedded --embedded --experimental=collections/default.experimental
+perl mysql-test-run.pl --timer --force --comment=rpl_binlog_row --suite=rpl,binlog --mysqld=--binlog-format=row --experimental=collections/default.experimental
+perl mysql-test-run.pl --timer --force --comment=funcs_1 --suite=funcs_1 --experimental=collections/default.experimental
diff --git a/mysql-test/collections/default.weekly b/mysql-test/collections/default.weekly
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/mysql-test/collections/default.weekly
diff --git a/mysql-test/include/check-warnings.test b/mysql-test/include/check-warnings.test
index 2144957f742..5295dd51a85 100644
--- a/mysql-test/include/check-warnings.test
+++ b/mysql-test/include/check-warnings.test
@@ -26,7 +26,7 @@ create temporary table error_log (
) engine=myisam;
# Get the name of servers error log
-let $log_error= query_get_value(show variables like 'log_error', Value, 1);
+let $log_error= $MTR_LOG_ERROR;
let $log_warning= $log_error.warnings;
# Try tload the warnings into a temporary table,
diff --git a/mysql-test/include/concurrent.inc b/mysql-test/include/concurrent.inc
index 3b34a5b1ede..2180ec4cc9c 100644
--- a/mysql-test/include/concurrent.inc
+++ b/mysql-test/include/concurrent.inc
@@ -11,6 +11,11 @@
# $engine_type storage engine to be tested
#
# Last update:
+# 2009-02-13 HH "Release_lock("hello")" is now also successful when delivering NULL,
+# replaced two sleeps by wait_condition. The last two "sleep 1" have not been
+# replaced as all tried wait conditions leaded to nondeterministic results, especially
+# to succeeding concurrent updates. To replace the sleeps there should be some time
+# planned (or internal knowledge of the server may help).
# 2006-08-02 ML test refactored
# old name was t/innodb_concurrent.test
# main code went into include/concurrent.inc
@@ -20,8 +25,9 @@
# new wrapper t/concurrent_innodb_safelog.test
#
-connection default;
+--source include/not_embedded.inc
+connection default;
#
# Show prerequisites for this test.
#
@@ -50,8 +56,6 @@ GRANT USAGE ON test.* TO mysqltest@localhost;
#
# Preparatory cleanup.
#
-DO release_lock("hello");
-DO release_lock("hello2");
--disable_warnings
drop table if exists t1;
--enable_warnings
@@ -86,13 +90,14 @@ drop table if exists t1;
connection thread2;
--echo ** Start transaction for thread 2
begin;
- --echo ** Update will cause a table scan and a new ULL will
+ --echo ** Update will cause a table scan and a new ULL will
--echo ** be created and blocked on the first row where tipo=11.
send update t1 set eta=1+get_lock("hello",10)*0 where tipo=11;
- sleep 1;
--echo ** connection thread1
connection thread1;
+ let $wait_condition= select count(*)= 1 from information_schema.processlist where state= 'User lock';
+ --source include/wait_condition.inc
--echo ** Start new transaction for thread 1
begin;
--echo ** Update on t1 will cause a table scan which will be blocked because
@@ -111,7 +116,9 @@ drop table if exists t1;
}
--echo ** Release user level name lock from thread 1. This will cause the ULL
--echo ** on thread 2 to end its wait.
- select release_lock("hello");
+# Due to Bug#32782 User lock hash fails to find lock, which probably also cause Bug#39484 (main.concurrent_innodb_safelog fails sporadically) the success of the following
+# is also guaranteed for NULL. Replaced SELECT by DO (no result).
+ DO release_lock("hello");
--echo ** Table is now updated with a new eta on tipo=22 for thread 1.
select * from t1;
@@ -119,7 +126,9 @@ drop table if exists t1;
connection thread2;
--echo ** Release the lock and collect result from update on thread 2
reap;
- select release_lock("hello");
+# Due to Bug#32782 User lock hash fails to find lock, which probably also cause Bug#39484 (main.concurrent_innodb_safelog fails sporadically) the success of the following
+# is also guaranteed for NULL. Replaced SELECT by DO (no result).
+ DO release_lock("hello");
--echo ** Table should have eta updates where tipo=11 but updates made by
--echo ** thread 1 shouldn't be visible yet.
select * from t1;
@@ -183,10 +192,11 @@ drop table t1;
--echo ** This will cause a hang on the first row where tipo=1 until the
--echo ** blocking ULL is released.
send update t1 set eta=1+get_lock("hello",10)*0 where tipo=1;
- sleep 1;
- --echo ** connection thread1
+--echo ** connection thread1
connection thread1;
+ let $wait_condition= select count(*)= 1 from information_schema.processlist where state= 'User lock';
+ --source include/wait_condition.inc
--echo ** Start transaction on thread 1
begin;
--echo ** Update on t1 will cause a table scan which will be blocked because
@@ -204,7 +214,9 @@ drop table t1;
update t1 set tipo=1 where tipo=2;
}
--echo ** Release ULL. This will release the next waiting ULL on thread 2.
- select release_lock("hello");
+# Due to Bug#32782 User lock hash fails to find lock, which probably also cause Bug#39484 (main.concurrent_innodb_safelog fails sporadically)the success of the following
+# is also guaranteed for NULL. Replaced SELECT by DO (no result).
+ DO release_lock("hello");
--echo ** The table should still be updated with updates for thread 1 only:
select * from t1;
@@ -212,7 +224,9 @@ drop table t1;
connection thread2;
--echo ** Release the lock and collect result from thread 2:
reap;
- select release_lock("hello");
+# Due to Bug#32782 User lock hash fails to find lock, which probably also cause Bug#39484 (main.concurrent_innodb_safelog fails sporadically) the success of the following
+# is also guaranteed for NULL. Replaced SELECT by DO (no result).
+ DO release_lock("hello");
--echo ** Seen from thread 2 the table should have been updated on four
--echo ** places.
select * from t1;
@@ -264,15 +278,18 @@ drop table t1;
--echo ** Update will create a table scan which creates a ULL where a=2;
--echo ** this will hang waiting on thread 1.
send update t1 set b=10+get_lock(concat("hello",a),10)*0 where a=2;
- sleep 1;
--echo ** connection thread1
connection thread1;
+ let $wait_condition= select count(*)= 1 from information_schema.processlist where state= 'User lock';
+ --source include/wait_condition.inc
--echo ** Insert new values to t1 from thread 1; this created an implicit
--echo ** commit since there are no on-going transactions.
insert into t1 values (1,1);
--echo ** Release the ULL (thread 2 updates will finish).
- select release_lock("hello2");
+# Due to Bug#32782 User lock hash fails to find lock, which probably also cause Bug#39484 (main.concurrent_innodb_safelog fails sporadically) the success of the following
+# is also guaranteed for NULL. Replaced SELECT by DO (no result).
+ DO release_lock("hello2");
--echo ** ..but thread 1 will still see t1 as if nothing has happend:
select * from t1;
@@ -280,7 +297,9 @@ drop table t1;
connection thread2;
--echo ** Collect results from thread 2 and release the lock.
reap;
- select release_lock("hello2");
+# Due to Bug#32782 User lock hash fails to find lock, which probably also cause Bug#39484 (main.concurrent_innodb_safelog fails sporadically) the success of the following
+# is also guaranteed for NULL. Replaced SELECT by DO (no result).
+ DO release_lock("hello2");
--echo ** The table should look like the original+updates for thread 2,
--echo ** and consist of new rows:
select * from t1;
@@ -534,6 +553,9 @@ drop table t1;
connection thread2;
begin;
send delete from t1 where tipo=2;
+# The sleep has not been replaced as all tried wait conditions leaded to sporadically
+# succeding update in the following thread. Also the used status variables '%lock%' and
+# 'innodb_deleted_rows' and infos in processlist where not sucessful.
sleep 1;
--echo ** connection thread1
@@ -594,8 +616,11 @@ drop table t1;
connection thread2;
begin;
send delete from t1 where tipo=2;
+# The sleep has not been replaced as all tried wait conditions leaded to sporadically
+# succeding update in the following thread. Also the used status variables '%lock%' and
+# 'innodb_deleted_rows' and infos in processlist where not sucessful.
sleep 1;
-
+
--echo ** connection thread1
connection thread1;
begin;
diff --git a/mysql-test/include/handler.inc b/mysql-test/include/handler.inc
index 485b2e881d3..4eb9e413822 100644
--- a/mysql-test/include/handler.inc
+++ b/mysql-test/include/handler.inc
@@ -479,6 +479,7 @@ handler t1 open;
--echo --> client 1
connection default;
drop table t1;
+disconnect con2;
#
# Bug#30632 HANDLER read failure causes hang
@@ -692,3 +693,30 @@ unlock tables;
drop table t1;
--error ER_UNKNOWN_TABLE
handler t1 read a next;
+
+#
+# Bug#41110: crash with handler command when used concurrently with alter table
+# Bug#41112: crash in mysql_ha_close_table/get_lock_data with alter table
+#
+
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+create table t1 (a int);
+insert into t1 values (1);
+handler t1 open;
+connect(con1,localhost,root,,);
+send alter table t1 engine=memory;
+connection default;
+let $wait_condition=
+ select count(*) = 1 from information_schema.processlist
+ where state = "rename result table" and info = "alter table t1 engine=memory";
+--source include/wait_condition.inc
+--error ER_ILLEGAL_HA
+handler t1 read a next;
+handler t1 close;
+connection con1;
+--reap
+drop table t1;
+disconnect con1;
+connection default;
diff --git a/mysql-test/include/ndb_backup.inc b/mysql-test/include/ndb_backup.inc
index e6780788fe9..5262f1231a2 100644
--- a/mysql-test/include/ndb_backup.inc
+++ b/mysql-test/include/ndb_backup.inc
@@ -2,21 +2,45 @@
# By JBM 2006-02-16 So that the code is not repeated #
# in test cases and can be reused. #
######################################################
+
--exec $NDB_MGM --no-defaults --ndb-connectstring="$NDB_CONNECTSTRING" -e "start backup" >> $NDB_TOOLS_OUTPUT
-# there is no neat way to find the backupid, this is a hack to find it...
-let $dump_file= $MYSQLTEST_VARDIR/tmp/tmp.dat;
---exec $NDB_TOOLS_DIR/ndb_select_all --ndb-connectstring="$NDB_CONNECTSTRING" -d sys --delimiter=',' SYSTAB_0 | grep 520093696 > $dump_file
+# To find the backupid, we must dump this data to a table, and SELECT
+# what we want into an outfile. This could be accomplished with grep, but
+# grep isn't Windows-portable
+
+--disable_query_log
+# create a table to help us out
+--disable_warnings # leave this on until done with the entire process
+# cleanup
+DROP TABLE IF EXISTS helper1;
+CREATE TABLE helper1(c1 VARCHAR(20));
+# dump raw data to file
+let $ndb_backup_file1= $MYSQLTEST_VARDIR/ndb_backup_tmp.dat;
+let $ndb_backup_file2= $MYSQLTEST_VARDIR/tmp.dat;
+--error 0,1
+--remove_file $ndb_backup_file1
+--exec $NDB_TOOLS_DIR/ndb_select_all --ndb-connectstring="$NDB_CONNECTSTRING" -d sys --delimiter=',' SYSTAB_0 > $ndb_backup_file1
+# load the table from the raw data file
+eval LOAD DATA INFILE '$ndb_backup_file1' INTO TABLE helper1;
+--remove_file $ndb_backup_file1
+# output what we need
+eval SELECT * FROM helper1 WHERE c1 LIKE '%520093696%'
+INTO OUTFILE '$ndb_backup_file2';
+# cleanup
+DROP TABLE helper1;
+--enable_warnings
+--enable_query_log
-CREATE TEMPORARY TABLE test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
+CREATE TEMPORARY TABLE IF NOT EXISTS test.backup_info
+(id INT, backup_id INT) ENGINE = MEMORY;
---replace_result $dump_file DUMP_FILE
-eval LOAD DATA INFILE '$dump_file' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
+--replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR>
+eval LOAD DATA INFILE '$ndb_backup_file2' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
+--remove_file $ndb_backup_file2
# Load backup id into environment variable
let the_backup_id=`SELECT backup_id from test.backup_info`;
-DROP TABLE test.backup_info;
-
-remove_file $dump_file;
+DROP TABLE test.backup_info;
diff --git a/mysql-test/include/wait_show_condition.inc b/mysql-test/include/wait_show_condition.inc
new file mode 100644
index 00000000000..253101d1e07
--- /dev/null
+++ b/mysql-test/include/wait_show_condition.inc
@@ -0,0 +1,78 @@
+# include/wait_show_condition.inc
+#
+# SUMMARY
+#
+# Waits until the show statement ($show_statement) has at least within one of
+# the rows of the result set for the field ($field) a value which fulfils
+# a condition ($condition), or the operation times out.
+#
+#
+# USAGE
+#
+# let $show_statement= SHOW PROCESSLIST;
+# let $field= State;
+# let $condition= = 'Updating';
+# --source include/wait_show_condition.inc
+#
+# OR
+#
+# let $wait_timeout= 60; # Override default of 30 seconds with 60.
+# let $show_statement= SHOW PROCESSLIST;
+# let $field= State;
+# let $condition= = 'Updating';
+# --source include/wait_show_condition.inc
+#
+# Please do not use this use routine if you can replace the SHOW statement
+# with a select. In such a case include/wait_condition.inc is recommended.
+#
+# Created: 2009-02-18 mleich
+#
+
+let $max_run_time= 30;
+if ($wait_timeout)
+{
+ let $max_run_time= $wait_timeout;
+}
+# Reset $wait_timeout so that its value won't be used on subsequent
+# calls, and default will be used instead.
+let $wait_timeout= 0;
+
+# The smallest timespan till UNIX_TIMESTAMP() gets incremented is ~0 seconds.
+# We add one second to avoid the case that somebody measures timespans on a
+# real clock with fractions of seconds, detects that n seconds are sufficient,
+# assigns n to this routine and suffers because he sometimes gets n - 1
+# seconds in reality.
+inc $max_run_time;
+
+let $found= 0;
+let $max_end_time= `SELECT UNIX_TIMESTAMP() + $max_run_time`;
+while (`SELECT UNIX_TIMESTAMP() <= $max_end_time AND $found = 0`)
+{
+ # Sleep a bit to avoid too heavy load.
+ real_sleep 0.2;
+ let $rowno= 1;
+ let $process_result= 1;
+ while (`SELECT $process_result = 1 AND $found = 0`)
+ {
+ let $field_value= query_get_value($show_statement, $field, $rowno);
+ if (`SELECT '$field_value' $condition`)
+ {
+ let $found= 1;
+ }
+ if (`SELECT '$field_value' = 'No such row'`)
+ {
+ # We are behind the last row of the result set.
+ let $process_result= 0;
+ }
+ inc $rowno;
+ }
+}
+if (!$found)
+{
+ echo # Timeout in include/wait_show_condition.inc for $wait_condition;
+ echo # show_statement : $show_statement;
+ echo # field : $field;
+ echo # condition : $condition;
+ echo # max_run_time : $max_run_time;
+}
+
diff --git a/mysql-test/include/wait_until_count_sessions.inc b/mysql-test/include/wait_until_count_sessions.inc
index 41348bee129..de4f0eeb652 100644
--- a/mysql-test/include/wait_until_count_sessions.inc
+++ b/mysql-test/include/wait_until_count_sessions.inc
@@ -2,14 +2,23 @@
#
# SUMMARY
#
-# Waits until the passed number ($count_sessions) of concurrent sessions was
-# observed via
+# Waits until the passed number ($count_sessions) of concurrent sessions or
+# a smaller number was observed via
# SHOW STATUS LIKE 'Threads_connected'
# or the operation times out.
-# Note: Starting with 5.1 we could also use
-# SELECT COUNT(*) FROM information_schema.processlist
-# I stay with "SHOW STATUS LIKE 'Threads_connected'" because this
-# runs in all versions 5.0+
+# Note:
+# 1. We wait for $current_sessions <= $count_sessions because in the use case
+# with count_sessions.inc before and wait_until_count_sessions.inc after
+# the core of the test it could happen that the disconnects of sessions
+# belonging to the preceeding test are not finished.
+# sessions at test begin($count_sessions) = m + n
+# sessions of the previous test which will be soon disconnected = n (n >= 0)
+# sessions at test end ($current sessions, assuming the test disconnects
+# all additional sessions) = m
+# 2. Starting with 5.1 we could also use
+# SELECT COUNT(*) FROM information_schema.processlist
+# I stay with "SHOW STATUS LIKE 'Threads_connected'" because this
+# runs in all versions 5.0+
#
#
# USAGE
@@ -19,20 +28,20 @@
#
# OR typical example of a test which uses more than one session
# Such a test could harm successing tests if there is no server shutdown
-# and start between.cw
+# and start between.
#
# If the testing box is slow than the disconnect of sessions belonging to
# the current test might happen when the successing test gets executed.
# This means the successing test might see activities like unexpected
# rows within the general log or the PROCESSLIST.
# Example from bug http://bugs.mysql.com/bug.php?id=40377
-# --- bzr_mysql-6.0-rpl/.../r/log_state.result
+# --- bzr_mysql-6.0-rpl/.../r/log_state.result
# +++ bzr_mysql-6.0-rpl/.../r/log_state.reject
# @@ -25,6 +25,7 @@
-# event_time user_host ... command_type argument
-# TIMESTAMP USER_HOST ... Query create table t1(f1 int)
-# TIMESTAMP USER_HOST ... Query select * from mysql.general_log
-# +TIMESTAMP USER_HOST ... Quit
+# event_time user_host ... command_type argument
+# TIMESTAMP USER_HOST ... Query create table t1(f1 int)
+# TIMESTAMP USER_HOST ... Query select * from mysql.general_log
+# +TIMESTAMP USER_HOST ... Quit
# ....
#
# What to do?
@@ -79,7 +88,11 @@
# backup.test, grant3.test
#
#
-# Created: 2009-01-14 mleich
+# Created:
+# 2009-01-14 mleich
+# Modified:
+# 2009-02-24 mleich Fix Bug#43114 wait_until_count_sessions too restrictive,
+# random PB failures
#
let $wait_counter= 100;
@@ -93,7 +106,7 @@ let $wait_timeout= 0;
while ($wait_counter)
{
let $current_sessions= query_get_value(SHOW STATUS LIKE 'Threads_connected', Value, 1);
- let $success= `SELECT $current_sessions = $count_sessions`;
+ let $success= `SELECT $current_sessions <= $count_sessions`;
if ($success)
{
let $wait_counter= 0;
@@ -107,7 +120,7 @@ while ($wait_counter)
if (!$success)
{
--echo # Timeout in wait_until_count_sessions.inc
- --echo # Number of sessions expected: $count_sessions found: $current_sessions
+ --echo # Number of sessions expected: <= $count_sessions found: $current_sessions
SHOW PROCESSLIST;
}
diff --git a/mysql-test/lib/My/ConfigFactory.pm b/mysql-test/lib/My/ConfigFactory.pm
index 567a05ac7a1..852f706c858 100644
--- a/mysql-test/lib/My/ConfigFactory.pm
+++ b/mysql-test/lib/My/ConfigFactory.pm
@@ -116,8 +116,8 @@ sub fix_tmpdir {
sub fix_log_error {
my ($self, $config, $group_name, $group)= @_;
- my $dir= dirname($group->value('datadir'));
- return "$dir/mysqld.err";
+ my $dir= $self->{ARGS}->{vardir};
+ return "$dir/log/$group_name.err";
}
sub fix_log {
@@ -203,7 +203,7 @@ my @mysqld_rules=
{ '#host' => \&fix_host },
{ 'port' => \&fix_port },
{ 'socket' => \&fix_socket },
- { 'log-error' => \&fix_log_error },
+ { '#log-error' => \&fix_log_error },
{ 'log' => \&fix_log },
{ 'log-slow-queries' => \&fix_log_slow_queries },
{ '#user' => sub { return shift->{ARGS}->{user} || ""; } },
@@ -389,7 +389,7 @@ sub post_check_embedded_group {
my @no_copy =
(
- 'log-error', # Embedded server writes stderr to mysqltest's log file
+ '#log-error', # Embedded server writes stderr to mysqltest's log file
'slave-net-timeout', # Embedded server are not build with replication
);
diff --git a/mysql-test/lib/My/Platform.pm b/mysql-test/lib/My/Platform.pm
index 3dd5c552b10..69ffdfbb4ce 100644
--- a/mysql-test/lib/My/Platform.pm
+++ b/mysql-test/lib/My/Platform.pm
@@ -113,8 +113,8 @@ sub check_socket_path_length {
# Create a tempfile name with same length as "path"
my $tmpdir = tempdir( CLEANUP => 0);
- my $len = length($path) - length($tmpdir);
- my $testfile = $tmpdir . "x" x ($len > 0 ? $len : 1);
+ my $len = length($path) - length($tmpdir) - 1;
+ my $testfile = $tmpdir . "/" . "x" x ($len > 0 ? $len : 1);
my $sock;
eval {
$sock= new IO::Socket::UNIX
@@ -126,17 +126,15 @@ sub check_socket_path_length {
die "Could not create UNIX domain socket: $!"
unless defined $sock;
- die "UNIX domain socket patch was truncated"
+ die "UNIX domain socket path was truncated"
unless ($testfile eq $sock->hostpath());
$truncated= 0; # Yes, it worked!
};
- #print "check_socket_path_length, failed: ", $@, '\n' if ($@);
$sock= undef; # Close socket
- unlink($testfile); # Remove the physical file
- rmdir($tmpdir); # Remove the tempdir
+ rmtree($tmpdir); # Remove the tempdir and any socket file created
return $truncated;
}
diff --git a/mysql-test/lib/My/SafeProcess.pm b/mysql-test/lib/My/SafeProcess.pm
index 0e3aa968052..5ef3286ad8e 100644
--- a/mysql-test/lib/My/SafeProcess.pm
+++ b/mysql-test/lib/My/SafeProcess.pm
@@ -117,6 +117,7 @@ sub new {
my $output = delete($opts{'output'});
my $error = delete($opts{'error'});
my $verbose = delete($opts{'verbose'});
+ my $nocore = delete($opts{'nocore'});
my $host = delete($opts{'host'});
my $shutdown = delete($opts{'shutdown'});
my $user_data= delete($opts{'user_data'});
@@ -137,6 +138,7 @@ sub new {
push(@safe_args, $safe_script) if defined $safe_script;
push(@safe_args, "--verbose") if $verbose > 0;
+ push(@safe_args, "--nocore") if $nocore;
# Point the safe_process at the right parent if running on cygwin
push(@safe_args, "--parent-pid=".Cygwin::pid_to_winpid($$)) if IS_CYGWIN;
diff --git a/mysql-test/lib/My/SafeProcess/safe_process.cc b/mysql-test/lib/My/SafeProcess/safe_process.cc
index 7932f3fd2d6..6ad45a3226e 100644
--- a/mysql-test/lib/My/SafeProcess/safe_process.cc
+++ b/mysql-test/lib/My/SafeProcess/safe_process.cc
@@ -45,6 +45,7 @@
#include <sys/types.h>
#include <sys/wait.h>
+#include <sys/resource.h>
#include <unistd.h>
#include <stdarg.h>
#include <stdio.h>
@@ -149,7 +150,8 @@ int main(int argc, char* const argv[] )
char* const* child_argv= 0;
pid_t own_pid= getpid();
pid_t parent_pid= getppid();
-
+ bool nocore = false;
+
/* Install signal handlers */
signal(SIGTERM, handle_signal);
signal(SIGINT, handle_signal);
@@ -181,6 +183,9 @@ int main(int argc, char* const argv[] )
start++; /* Step past = */
if ((parent_pid= atoi(start)) == 0)
die("Invalid value '%s' passed to --parent-id", start);
+ } else if ( strcmp(arg, "--nocore") == 0 )
+ {
+ nocore = true; // Don't allow the process to dump core
}
else
die("Unknown option: %s", arg);
@@ -218,6 +223,15 @@ int main(int argc, char* const argv[] )
// it and any childs(that hasn't changed group themself)
setpgid(0, 0);
+ if (nocore)
+ {
+ struct rlimit corelim = { 0, 0 };
+ if (setrlimit (RLIMIT_CORE, &corelim) < 0)
+ {
+ message("setrlimit failed, errno=%d", errno);
+ }
+ }
+
// Signal that child is ready
buf= 37;
write(pfd[1], &buf, 1);
diff --git a/mysql-test/lib/mtr_gcov.pl b/mysql-test/lib/mtr_gcov.pl
index 5049fdd6063..f531889b08d 100644
--- a/mysql-test/lib/mtr_gcov.pl
+++ b/mysql-test/lib/mtr_gcov.pl
@@ -22,40 +22,46 @@ use strict;
sub gcov_prepare ($) {
my ($dir)= @_;
+ print "Purging gcov information from '$dir'...\n";
- `find $dir -name \*.gcov \
- -or -name \*.da | xargs rm`;
+ system("find $dir -name \*.gcov -o -name \*.da"
+ . " -o -name \*.gcda | grep -v 'README.gcov\$' | xargs rm");
}
-my @mysqld_src_dirs=
- (
- "strings",
- "mysys",
- "include",
- "extra",
- "regex",
- "isam",
- "merge",
- "myisam",
- "myisammrg",
- "heap",
- "sql",
- );
-
+#
+# Collect gcov statistics.
+# Arguments:
+# $dir basedir, normally source directory
+# $gcov gcov utility program [path] name
+# $gcov_msg message file name
+# $gcov_err error file name
+#
sub gcov_collect ($$$) {
my ($dir, $gcov, $gcov_msg, $gcov_err)= @_;
+ # Get current directory to return to later.
my $start_dir= cwd();
- print "Collecting source coverage info...\n";
- -f $gcov_msg and unlink($gcov_msg);
- -f $gcov_err and unlink($gcov_err);
- foreach my $d ( @mysqld_src_dirs )
- {
- chdir("$dir/$d");
- foreach my $f ( (glob("*.h"), glob("*.cc"), glob("*.c")) )
- {
- `$gcov $f 2>>$gcov_err >>$gcov_msg`;
+ print "Collecting source coverage info using '$gcov'...\n";
+ -f "$start_dir/$gcov_msg" and unlink("$start_dir/$gcov_msg");
+ -f "$start_dir/$gcov_err" and unlink("$start_dir/$gcov_err");
+
+ my @dirs= `find "$dir" -type d -print | sort`;
+ #print "List of directories:\n@dirs\n";
+
+ foreach my $d ( @dirs ) {
+ my $dir_reported= 0;
+ chomp($d);
+ chdir($d) or next;
+
+ foreach my $f ( (glob("*.h"), glob("*.cc"), glob("*.c")) ) {
+ $f =~ /(.*)\.[ch]c?/;
+ -f "$1.gcno" or next;
+ if (!$dir_reported) {
+ print "Collecting in '$d'...\n";
+ $dir_reported= 1;
+ }
+ system("$gcov $f 2>>$start_dir/$gcov_err >>$start_dir/$gcov_msg");
}
chdir($start_dir);
}
diff --git a/mysql-test/lib/mtr_report.pm b/mysql-test/lib/mtr_report.pm
index ce3fba87385..9c6ab35ee5e 100644
--- a/mysql-test/lib/mtr_report.pm
+++ b/mysql-test/lib/mtr_report.pm
@@ -69,6 +69,8 @@ sub _mtr_report_test_name ($) {
print _name(), _timestamp();
printf "%-40s ", $tname;
+
+ return $tname;
}
@@ -105,20 +107,48 @@ sub mtr_report_test_passed ($) {
sub mtr_report_test ($) {
my ($tinfo)= @_;
- _mtr_report_test_name($tinfo);
+ my $test_name = _mtr_report_test_name($tinfo);
my $comment= $tinfo->{'comment'};
my $logfile= $tinfo->{'logfile'};
my $warnings= $tinfo->{'warnings'};
my $result= $tinfo->{'result'};
+ my $retry= $tinfo->{'retries'} ? "retry-" : "";
if ($result eq 'MTR_RES_FAILED'){
my $timest = format_time();
+ my $fail = "fail";
+
+ if ( $::opt_experimental )
+ {
+ # Find out if this test case is an experimental one, so we can treat
+ # the failure as an expected failure instead of a regression.
+ for my $exp ( @$::experimental_test_cases ) {
+ if ( $exp ne $test_name ) {
+ # if the expression is not the name of this test case, but has
+ # an asterisk at the end, determine if the characters up to
+ # but excluding the asterisk are the same
+ if ( $exp ne "" && substr($exp, -1, 1) eq "*" ) {
+ $exp = substr($exp, 0, length($exp) - 1);
+ if ( substr($test_name, 0, length($exp)) ne $exp ) {
+ # no match, try next entry
+ next;
+ }
+ # if yes, fall through to set the exp-fail status
+ } else {
+ # no match, try next entry
+ next;
+ }
+ }
+ $fail = "exp-fail";
+ last;
+ }
+ }
if ( $warnings )
{
- mtr_report("[ fail ] Found warnings/errors in server log file!");
+ mtr_report("[ $retry$fail ] Found warnings/errors in server log file!");
mtr_report(" Test ended at $timest");
mtr_report($warnings);
return;
@@ -126,14 +156,14 @@ sub mtr_report_test ($) {
my $timeout= $tinfo->{'timeout'};
if ( $timeout )
{
- mtr_report("[ fail ] timeout after $timeout seconds");
+ mtr_report("[ $retry$fail ] timeout after $timeout seconds");
mtr_report(" Test ended at $timest");
mtr_report("\n$tinfo->{'comment'}");
return;
}
else
{
- mtr_report("[ fail ]\n Test ended at $timest");
+ mtr_report("[ $retry$fail ]\n Test ended at $timest");
}
if ( $logfile )
@@ -176,7 +206,7 @@ sub mtr_report_test ($) {
{
my $timer_str= $tinfo->{timer} || "";
$tot_real_time += ($timer_str/1000);
- mtr_report("[ pass ] ", sprintf("%5s", $timer_str));
+ mtr_report("[ ${retry}pass ] ", sprintf("%5s", $timer_str));
# Show any problems check-testcase found
if ( defined $tinfo->{'check'} )
diff --git a/mysql-test/lib/mtr_unique.pm b/mysql-test/lib/mtr_unique.pm
index 2ac172883a2..294a5d7b4d6 100644
--- a/mysql-test/lib/mtr_unique.pm
+++ b/mysql-test/lib/mtr_unique.pm
@@ -188,6 +188,8 @@ sub mtr_release_unique_id($) {
flock SEM, LOCK_UN or warn "can't unlock $file.sem";
close SEM;
+
+ delete $mtr_unique_ids{$$};
}
diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl
index 50617428d0f..c5a68662d5b 100755
--- a/mysql-test/mysql-test-run.pl
+++ b/mysql-test/mysql-test-run.pl
@@ -110,8 +110,8 @@ my $opt_tmpdir; # Path to use for tmp/ dir
my $opt_tmpdir_pid;
END {
- if (defined $opt_tmpdir_pid and
- $opt_tmpdir_pid == $$){
+ if ( defined $opt_tmpdir_pid and $opt_tmpdir_pid == $$ )
+ {
# Remove the tempdir this process has created
mtr_verbose("Removing tmpdir '$opt_tmpdir");
rmtree($opt_tmpdir);
@@ -163,8 +163,9 @@ our $opt_force;
our $opt_mem= $ENV{'MTR_MEM'};
our $opt_gcov;
-our $opt_gcov_err;
-our $opt_gcov_msg;
+our $opt_gcov_exe= "gcov";
+our $opt_gcov_err= "mysql-test-gcov.msg";
+our $opt_gcov_msg= "mysql-test-gcov.err";
our $glob_debugger= 0;
our $opt_gdb;
@@ -180,12 +181,18 @@ our $opt_client_debugger;
my $config; # The currently running config
my $current_config_name; # The currently running config file template
+our $opt_experimental;
+our $experimental_test_cases;
+
my $baseport;
my $opt_build_thread= $ENV{'MTR_BUILD_THREAD'} || "auto";
+my $build_thread= 0;
my $opt_record;
my $opt_report_features;
+my $opt_skip_core;
+
our $opt_check_testcases= 1;
my $opt_mark_progress;
@@ -396,7 +403,7 @@ sub main {
mtr_print_line();
if ( $opt_gcov ) {
- gcov_collect($basedir, $opt_gcov,
+ gcov_collect($basedir, $opt_gcov_exe,
$opt_gcov_msg, $opt_gcov_err);
}
@@ -676,14 +683,9 @@ sub run_worker ($) {
report_option('name',"worker[$thread_num]");
# --------------------------------------------------------------------------
- # Use auto build thread in all but first worker
+ # Set different ports per thread
# --------------------------------------------------------------------------
- set_build_thread_ports($thread_num > 1 ? 'auto' : $opt_build_thread);
-
- if (check_ports_free()){
- # Some port was not free(which one has already been printed)
- mtr_error("Some port(s) was not free")
- }
+ set_build_thread_ports($thread_num);
# --------------------------------------------------------------------------
# Turn off verbosity in workers, unless explicitly specified
@@ -803,7 +805,7 @@ sub command_line_setup {
'big-test' => \$opt_big_test,
'combination=s' => \@opt_combinations,
'skip-combinations' => \&collect_option,
-
+ 'experimental=s' => \$opt_experimental,
'skip-im' => \&ignore_option,
# Specify ports
@@ -943,12 +945,12 @@ sub command_line_setup {
}
# Look for language files and charsetsdir, use same share
- my $path_share= mtr_path_exists("$basedir/share/mysql",
- "$basedir/sql/share",
- "$basedir/share");
+ $path_language= mtr_path_exists("$basedir/share/mysql/english",
+ "$basedir/sql/share/english",
+ "$basedir/share/english");
+
-
- $path_language= mtr_path_exists("$path_share/english");
+ my $path_share= dirname($path_language);
$path_charsetsdir= mtr_path_exists("$path_share/charsets");
if (using_extern())
@@ -970,6 +972,33 @@ sub command_line_setup {
mtr_print_thick_line('#');
}
+ if ( $opt_experimental )
+ {
+ # read the list of experimental test cases from the file specified on
+ # the command line
+ open(FILE, "<", $opt_experimental) or mtr_error("Can't read experimental file: $opt_experimental");
+ mtr_report("Using experimental file: $opt_experimental");
+ $experimental_test_cases = [];
+ while(<FILE>) {
+ chomp;
+ # remove comments (# foo) at the beginning of the line, or after a
+ # blank at the end of the line
+ s/( +|^)#.*$//;
+ # remove whitespace
+ s/^ +//;
+ s/ +$//;
+ # if nothing left, don't need to remember this line
+ if ( $_ eq "" ) {
+ next;
+ }
+ # remember what is left as the name of another test case that should be
+ # treated as experimental
+ print " - $_\n";
+ push @$experimental_test_cases, $_;
+ }
+ close FILE;
+ }
+
foreach my $arg ( @ARGV )
{
if ( $arg =~ /^--skip-/ )
@@ -1094,6 +1123,14 @@ sub command_line_setup {
}
# --------------------------------------------------------------------------
+ # Check parallel value
+ # --------------------------------------------------------------------------
+ if ($opt_parallel < 1)
+ {
+ mtr_error("0 or negative parallel value makes no sense, use positive number");
+ }
+
+ # --------------------------------------------------------------------------
# Record flag
# --------------------------------------------------------------------------
if ( $opt_record and ! @opt_cases )
@@ -1282,18 +1319,32 @@ sub command_line_setup {
# But a fairly safe range seems to be 5001 - 32767
#
sub set_build_thread_ports($) {
- my $build_thread= shift || 0;
+ my $thread= shift || 0;
- if ( lc($build_thread) eq 'auto' ) {
- #mtr_report("Requesting build thread... ");
- $build_thread= mtr_get_unique_id(250, 299);
- if ( !defined $build_thread ) {
- mtr_error("Could not get a unique build thread id");
+ if ( lc($opt_build_thread) eq 'auto' ) {
+ my $found_free = 0;
+ $build_thread = 250; # Start attempts from here
+ while (! $found_free)
+ {
+ $build_thread= mtr_get_unique_id($build_thread, 299);
+ if ( !defined $build_thread ) {
+ mtr_error("Could not get a unique build thread id");
+ }
+ $found_free= check_ports_free($build_thread);
+ # If not free, release and try from next number
+ mtr_release_unique_id($build_thread++) unless $found_free;
}
- #mtr_report(" - got $build_thread");
+ }
+ else
+ {
+ $build_thread = $opt_build_thread + $thread - 1;
}
$ENV{MTR_BUILD_THREAD}= $build_thread;
- $opt_build_thread= $build_thread;
+
+ if (! check_ports_free($build_thread)) {
+ # Some port was not free(which one has already been printed)
+ mtr_error("Some port(s) was not free")
+ }
# Calculate baseport
$baseport= $build_thread * 10 + 10000;
@@ -2447,22 +2498,18 @@ sub kill_leftovers ($) {
# Check that all the ports that are going to
# be used are free
#
-sub check_ports_free
+sub check_ports_free ($)
{
- my @ports_to_check;
- for ($baseport..$baseport+9){
- push(@ports_to_check, $_);
- }
- #mtr_report("Checking ports...");
- # print "@ports_to_check\n";
- foreach my $port (@ports_to_check){
- if (mtr_ping_port($port)){
- mtr_report(" - 'localhost:$port' was not free");
- return 1; # One port was not free
+ my $bthread= shift;
+ my $portbase = $bthread * 10 + 10000;
+ for ($portbase..$portbase+9){
+ if (mtr_ping_port($_)){
+ mtr_report(" - 'localhost:$_' was not free");
+ return 0; # One port was not free
}
}
- return 0; # All ports free
+ return 1; # All ports free
}
@@ -3481,7 +3528,10 @@ sub start_check_warnings ($$) {
my $name= "warnings-".$mysqld->name();
- extract_warning_lines($mysqld->value('log-error'));
+ my $log_error= $mysqld->value('#log-error');
+ # To be communicated to the test
+ $ENV{MTR_LOG_ERROR}= $log_error;
+ extract_warning_lines($log_error);
my $args;
mtr_init_args(\$args);
@@ -3956,6 +4006,7 @@ sub mysqld_arguments ($$$) {
mtr_add_arg($args, "%s", $arg);
}
}
+ $opt_skip_core = $found_skip_core;
if ( !$found_skip_core )
{
mtr_add_arg($args, "%s", "--core-file");
@@ -3995,6 +4046,12 @@ sub mysqld_start ($$) {
$path_vardir_trace, $mysqld->name());
}
+ if (IS_WINDOWS)
+ {
+ # Trick the server to send output to stderr, with --console
+ mtr_add_arg($args, "--console");
+ }
+
if ( $opt_gdb || $opt_manual_gdb )
{
gdb_arguments(\$args, \$exe, $mysqld->name());
@@ -4027,7 +4084,7 @@ sub mysqld_start ($$) {
# Remove the old pidfile if any
unlink($mysqld->value('pid-file'));
- my $output= $mysqld->value('log-error');
+ my $output= $mysqld->value('#log-error');
if ( $opt_valgrind and $opt_debug )
{
# When both --valgrind and --debug is selected, send
@@ -4047,6 +4104,7 @@ sub mysqld_start ($$) {
error => $output,
append => 1,
verbose => $opt_verbose,
+ nocore => $opt_skip_core,
host => undef,
shutdown => sub { mysqld_stop($mysqld) },
);
@@ -4099,12 +4157,6 @@ sub server_need_restart {
return 0;
}
- if ( $opt_embedded_server )
- {
- mtr_verbose_restart($server, "no start or restart for embedded server");
- return 0;
- }
-
if ( $tinfo->{'force_restart'} ) {
mtr_verbose_restart($server, "forced in .opt file");
return 1;
@@ -4334,7 +4386,7 @@ sub start_servers($) {
# Already started
# Write start of testcase to log file
- mark_log($mysqld->value('log-error'), $tinfo);
+ mark_log($mysqld->value('#log-error'), $tinfo);
next;
}
@@ -4393,7 +4445,7 @@ sub start_servers($) {
mkpath($tmpdir) unless -d $tmpdir;
# Write start of testcase to log file
- mark_log($mysqld->value('log-error'), $tinfo);
+ mark_log($mysqld->value('#log-error'), $tinfo);
# Run <tname>-master.sh
if ($mysqld->option('#!run-master-sh') and
@@ -4444,7 +4496,7 @@ sub start_servers($) {
$tinfo->{comment}=
"Failed to start ".$mysqld->name();
- my $logfile= $mysqld->value('log-error');
+ my $logfile= $mysqld->value('#log-error');
if ( defined $logfile and -f $logfile )
{
$tinfo->{logfile}= mtr_fromfile($logfile);
@@ -5057,6 +5109,8 @@ Misc options
to turn off.
sleep=SECONDS Passed to mysqltest, will be used as fixed sleep time
+ gcov Collect coverage information after the test.
+ The result is a gcov file per source and header file.
HERE
exit(1);
diff --git a/mysql-test/r/archive.result b/mysql-test/r/archive.result
index 8c26ea1ff82..02acccb234e 100644
--- a/mysql-test/r/archive.result
+++ b/mysql-test/r/archive.result
@@ -12695,3 +12695,22 @@ a b
1 NULL
2 NULL
DROP TABLE t1;
+#
+# BUG#32880 - Repairing Archive table fails with internal error 144
+#
+
+# Test with an existing table which is corrupted
+# Copy t1 from std_data
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` blob
+) ENGINE=ARCHIVE DEFAULT CHARSET=latin1
+CHECK TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 check error Corrupt
+REPAIR TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 repair error Corrupt
+DROP TABLE t1;
diff --git a/mysql-test/r/concurrent_innodb_safelog.result b/mysql-test/r/concurrent_innodb_safelog.result
index 92d274993d9..e6adaac1068 100644
--- a/mysql-test/r/concurrent_innodb_safelog.result
+++ b/mysql-test/r/concurrent_innodb_safelog.result
@@ -7,8 +7,6 @@ SELECT @@global.innodb_locks_unsafe_for_binlog;
0
# keep_locks == 1
GRANT USAGE ON test.* TO mysqltest@localhost;
-DO release_lock("hello");
-DO release_lock("hello2");
drop table if exists t1;
**
@@ -36,7 +34,7 @@ get_lock("hello",10)
** connection thread2
** Start transaction for thread 2
begin;
-** Update will cause a table scan and a new ULL will
+** Update will cause a table scan and a new ULL will
** be created and blocked on the first row where tipo=11.
update t1 set eta=1+get_lock("hello",10)*0 where tipo=11;
** connection thread1
@@ -51,9 +49,7 @@ update t1 set eta=2 where tipo=22;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
** Release user level name lock from thread 1. This will cause the ULL
** on thread 2 to end its wait.
-select release_lock("hello");
-release_lock("hello")
-1
+DO release_lock("hello");
** Table is now updated with a new eta on tipo=22 for thread 1.
select * from t1;
eta tipo c
@@ -70,9 +66,7 @@ eta tipo c
90 11 kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
** connection thread2
** Release the lock and collect result from update on thread 2
-select release_lock("hello");
-release_lock("hello")
-1
+DO release_lock("hello");
** Table should have eta updates where tipo=11 but updates made by
** thread 1 shouldn't be visible yet.
select * from t1;
@@ -194,9 +188,7 @@ begin;
update t1 set tipo=1 where tipo=2;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
** Release ULL. This will release the next waiting ULL on thread 2.
-select release_lock("hello");
-release_lock("hello")
-1
+DO release_lock("hello");
** The table should still be updated with updates for thread 1 only:
select * from t1;
eta tipo c
@@ -213,9 +205,7 @@ eta tipo c
90 11 kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
** connection thread2
** Release the lock and collect result from thread 2:
-select release_lock("hello");
-release_lock("hello")
-1
+DO release_lock("hello");
** Seen from thread 2 the table should have been updated on four
** places.
select * from t1;
@@ -319,9 +309,7 @@ update t1 set b=10+get_lock(concat("hello",a),10)*0 where a=2;
** commit since there are no on-going transactions.
insert into t1 values (1,1);
** Release the ULL (thread 2 updates will finish).
-select release_lock("hello2");
-release_lock("hello2")
-1
+DO release_lock("hello2");
** ..but thread 1 will still see t1 as if nothing has happend:
select * from t1;
a b
@@ -332,9 +320,7 @@ a b
1 1
** connection thread2
** Collect results from thread 2 and release the lock.
-select release_lock("hello2");
-release_lock("hello2")
-1
+DO release_lock("hello2");
** The table should look like the original+updates for thread 2,
** and consist of new rows:
select * from t1;
diff --git a/mysql-test/r/concurrent_innodb_unsafelog.result b/mysql-test/r/concurrent_innodb_unsafelog.result
index 2a6c15d38c1..e9c53d4cfa0 100644
--- a/mysql-test/r/concurrent_innodb_unsafelog.result
+++ b/mysql-test/r/concurrent_innodb_unsafelog.result
@@ -7,8 +7,6 @@ SELECT @@global.innodb_locks_unsafe_for_binlog;
1
# keep_locks == 0
GRANT USAGE ON test.* TO mysqltest@localhost;
-DO release_lock("hello");
-DO release_lock("hello2");
drop table if exists t1;
**
@@ -36,7 +34,7 @@ get_lock("hello",10)
** connection thread2
** Start transaction for thread 2
begin;
-** Update will cause a table scan and a new ULL will
+** Update will cause a table scan and a new ULL will
** be created and blocked on the first row where tipo=11.
update t1 set eta=1+get_lock("hello",10)*0 where tipo=11;
** connection thread1
@@ -50,9 +48,7 @@ begin;
update t1 set eta=2 where tipo=22;
** Release user level name lock from thread 1. This will cause the ULL
** on thread 2 to end its wait.
-select release_lock("hello");
-release_lock("hello")
-1
+DO release_lock("hello");
** Table is now updated with a new eta on tipo=22 for thread 1.
select * from t1;
eta tipo c
@@ -69,9 +65,7 @@ eta tipo c
90 11 kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
** connection thread2
** Release the lock and collect result from update on thread 2
-select release_lock("hello");
-release_lock("hello")
-1
+DO release_lock("hello");
** Table should have eta updates where tipo=11 but updates made by
** thread 1 shouldn't be visible yet.
select * from t1;
@@ -192,9 +186,7 @@ begin;
** do not match the WHERE condition are released.
update t1 set tipo=1 where tipo=2;
** Release ULL. This will release the next waiting ULL on thread 2.
-select release_lock("hello");
-release_lock("hello")
-1
+DO release_lock("hello");
** The table should still be updated with updates for thread 1 only:
select * from t1;
eta tipo c
@@ -211,9 +203,7 @@ eta tipo c
90 11 kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
** connection thread2
** Release the lock and collect result from thread 2:
-select release_lock("hello");
-release_lock("hello")
-1
+DO release_lock("hello");
** Seen from thread 2 the table should have been updated on four
** places.
select * from t1;
@@ -317,9 +307,7 @@ update t1 set b=10+get_lock(concat("hello",a),10)*0 where a=2;
** commit since there are no on-going transactions.
insert into t1 values (1,1);
** Release the ULL (thread 2 updates will finish).
-select release_lock("hello2");
-release_lock("hello2")
-1
+DO release_lock("hello2");
** ..but thread 1 will still see t1 as if nothing has happend:
select * from t1;
a b
@@ -330,9 +318,7 @@ a b
1 1
** connection thread2
** Collect results from thread 2 and release the lock.
-select release_lock("hello2");
-release_lock("hello2")
-1
+DO release_lock("hello2");
** The table should look like the original+updates for thread 2,
** and consist of new rows:
select * from t1;
diff --git a/mysql-test/r/connect.result b/mysql-test/r/connect.result
index 727433d3032..5e6c013bb38 100644
--- a/mysql-test/r/connect.result
+++ b/mysql-test/r/connect.result
@@ -188,7 +188,7 @@ DROP USER mysqltest_u1@localhost;
# -- End of Bug#33507.
-# -- Bug#35074: max_used_connections is not correct.
+# -- Bug#35074: max_used_connections is not correct.
FLUSH STATUS;
diff --git a/mysql-test/r/consistent_snapshot.result b/mysql-test/r/consistent_snapshot.result
index 90606abbe4e..694c996a58e 100644
--- a/mysql-test/r/consistent_snapshot.result
+++ b/mysql-test/r/consistent_snapshot.result
@@ -1,15 +1,23 @@
-drop table if exists t1;
-create table t1 (a int) engine=innodb;
-start transaction with consistent snapshot;
-insert into t1 values(1);
-select * from t1;
+DROP TABLE IF EXISTS t1;
+# Establish connection con1 (user=root)
+# Establish connection con2 (user=root)
+# Switch to connection con1
+CREATE TABLE t1 (a INT) ENGINE=innodb;
+START TRANSACTION WITH CONSISTENT SNAPSHOT;
+# Switch to connection con2
+INSERT INTO t1 VALUES(1);
+# Switch to connection con1
+SELECT * FROM t1;
a
-commit;
-delete from t1;
-start transaction;
-insert into t1 values(1);
-select * from t1;
+COMMIT;
+DELETE FROM t1;
+START TRANSACTION;
+# Switch to connection con2
+INSERT INTO t1 VALUES(1);
+# Switch to connection con1
+SELECT * FROM t1;
a
1
-commit;
-drop table t1;
+COMMIT;
+# Switch to connection default + close connections con1 and con2
+DROP TABLE t1;
diff --git a/mysql-test/r/create.result b/mysql-test/r/create.result
index 057a8600ca2..bd11a8725ef 100644
--- a/mysql-test/r/create.result
+++ b/mysql-test/r/create.result
@@ -1731,7 +1731,7 @@ t1 CREATE TABLE `t1` (
`HOST` varchar(64) NOT NULL DEFAULT '',
`DB` varchar(64) DEFAULT NULL,
`COMMAND` varchar(16) NOT NULL DEFAULT '',
- `TIME` bigint(7) NOT NULL DEFAULT '0',
+ `TIME` int(7) NOT NULL DEFAULT '0',
`STATE` varchar(64) DEFAULT NULL,
`INFO` longtext
) ENGINE=MyISAM DEFAULT CHARSET=utf8
@@ -1745,7 +1745,7 @@ t1 CREATE TEMPORARY TABLE `t1` (
`HOST` varchar(64) NOT NULL DEFAULT '',
`DB` varchar(64) DEFAULT NULL,
`COMMAND` varchar(16) NOT NULL DEFAULT '',
- `TIME` bigint(7) NOT NULL DEFAULT '0',
+ `TIME` int(7) NOT NULL DEFAULT '0',
`STATE` varchar(64) DEFAULT NULL,
`INFO` longtext
) ENGINE=MyISAM DEFAULT CHARSET=utf8
diff --git a/mysql-test/r/ddl_i18n_koi8r.result b/mysql-test/r/ddl_i18n_koi8r.result
index 34cea2a5a7d..af3a0899181 100644
--- a/mysql-test/r/ddl_i18n_koi8r.result
+++ b/mysql-test/r/ddl_i18n_koi8r.result
@@ -1729,18 +1729,18 @@ DELETE FROM mysqltest2.log|
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1` /*!40100 DEFAULT CHARACTER SET cp866 */;
USE `mysqltest1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `log` (
`msg` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-SET character_set_client = @saved_cs_client;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`c` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
INSERT INTO `t1` VALUES (1),(0),(1);
ALTER DATABASE mysqltest1 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
@@ -1808,18 +1808,18 @@ ALTER DATABASE mysqltest1 CHARACTER SET cp866 COLLATE cp866_general_ci ;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest2` /*!40100 DEFAULT CHARACTER SET cp866 */;
USE `mysqltest2`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `log` (
`msg` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-SET character_set_client = @saved_cs_client;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`c` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
INSERT INTO `t1` VALUES (1),(0),(1);
ALTER DATABASE mysqltest2 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
diff --git a/mysql-test/r/ddl_i18n_utf8.result b/mysql-test/r/ddl_i18n_utf8.result
index cf5dac3dc7c..10c2afcadc1 100644
--- a/mysql-test/r/ddl_i18n_utf8.result
+++ b/mysql-test/r/ddl_i18n_utf8.result
@@ -1729,18 +1729,18 @@ DELETE FROM mysqltest2.log|
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1` /*!40100 DEFAULT CHARACTER SET cp866 */;
USE `mysqltest1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `log` (
`msg` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-SET character_set_client = @saved_cs_client;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`c` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
INSERT INTO `t1` VALUES (1),(0),(1);
ALTER DATABASE mysqltest1 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
@@ -1808,18 +1808,18 @@ ALTER DATABASE mysqltest1 CHARACTER SET cp866 COLLATE cp866_general_ci ;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest2` /*!40100 DEFAULT CHARACTER SET cp866 */;
USE `mysqltest2`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `log` (
`msg` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-SET character_set_client = @saved_cs_client;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`c` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
INSERT INTO `t1` VALUES (1),(0),(1);
ALTER DATABASE mysqltest2 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
diff --git a/mysql-test/r/dirty_close.result b/mysql-test/r/dirty_close.result
index c4fc19a35f8..b49b72f1b95 100644
--- a/mysql-test/r/dirty_close.result
+++ b/mysql-test/r/dirty_close.result
@@ -1,9 +1,9 @@
-drop table if exists t1;
-create table t1 (n int);
-insert into t1 values (1),(2),(3);
-select * from t1;
+DROP TABLE IF EXISTS t1;
+CREATE TABLE t1 (n INT);
+INSERT INTO t1 VALUES (1),(2),(3);
+SELECT * FROM t1;
n
1
2
3
-drop table t1;
+DROP TABLE t1;
diff --git a/mysql-test/r/events_bugs.result b/mysql-test/r/events_bugs.result
index 83030a00179..50bfa97c59f 100644
--- a/mysql-test/r/events_bugs.result
+++ b/mysql-test/r/events_bugs.result
@@ -736,6 +736,17 @@ select replace(@full_mode, 'ALLOW_INVALID_DATES', 'INVALID_DATES') into @full_mo
select name from mysql.event where name = 'p' and sql_mode = @full_mode;
name
drop event e1;
+SET @old_server_id = @@GLOBAL.server_id;
+SET GLOBAL server_id = (1 << 32) - 1;
+SELECT @@GLOBAL.server_id;
+@@GLOBAL.server_id
+4294967295
+CREATE EVENT ev1 ON SCHEDULE EVERY 1 DAY DO SELECT 1;
+SELECT event_name, originator FROM INFORMATION_SCHEMA.EVENTS;
+event_name originator
+ev1 4294967295
+DROP EVENT ev1;
+SET GLOBAL server_id = @old_server_id;
DROP DATABASE events_test;
SET GLOBAL event_scheduler= 'ON';
SET @@global.concurrent_insert= @concurrent_insert;
diff --git a/mysql-test/r/explain.result b/mysql-test/r/explain.result
index 3de741b5efb..a81ff554ca2 100644
--- a/mysql-test/r/explain.result
+++ b/mysql-test/r/explain.result
@@ -155,6 +155,10 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
Warnings:
Note 1003 select 1 AS `1` from (select count(distinct `test`.`t1`.`a`) AS `COUNT(DISTINCT t1.a)` from `test`.`t1` join `test`.`t2` group by `test`.`t1`.`a`) `s1`
DROP TABLE t1,t2;
+CREATE TABLE t1 (a INT PRIMARY KEY);
+EXPLAIN EXTENDED SELECT COUNT(a) FROM t1 USE KEY(a);
+ERROR 42000: Key 'a' doesn't exist in table 't1'
+DROP TABLE t1;
#
# Bug#37870: Usage of uninitialized value caused failed assertion.
#
@@ -182,3 +186,4 @@ dt
2001-01-01 01:01:01
2001-01-01 01:01:01
drop tables t1, t2;
+End of 5.1 tests.
diff --git a/mysql-test/r/flush_block_commit.result b/mysql-test/r/flush_block_commit.result
index d5b10868358..d2197beaaab 100644
--- a/mysql-test/r/flush_block_commit.result
+++ b/mysql-test/r/flush_block_commit.result
@@ -1,39 +1,57 @@
-drop table if exists t1;
-create table t1 (a int) engine=innodb;
-begin;
-insert into t1 values(1);
-flush tables with read lock;
-select * from t1;
+# Establish connection con1 (user=root)
+# Establish connection con2 (user=root)
+# Establish connection con3 (user=root)
+# Switch to connection con1
+DROP TABLE IF EXISTS t1;
+CREATE TABLE t1 (a INT) ENGINE=innodb;
+BEGIN;
+INSERT INTO t1 VALUES(1);
+# Switch to connection con2
+FLUSH TABLES WITH READ LOCK;
+SELECT * FROM t1;
a
-commit;
-select * from t1;
+# Switch to connection con1
+COMMIT;
+# Switch to connection con2
+SELECT * FROM t1;
a
-unlock tables;
-begin;
-select * from t1 for update;
+UNLOCK TABLES;
+# Switch to connection con1
+# Switch to connection con1
+BEGIN;
+SELECT * FROM t1 FOR UPDATE;
a
1
-begin;
-select * from t1 for update;
-flush tables with read lock;
-commit;
+# Switch to connection con2
+BEGIN;
+SELECT * FROM t1 FOR UPDATE;
+# Switch to connection con3
+FLUSH TABLES WITH READ LOCK;
+# Switch to connection con1
+COMMIT;
+# Switch to connection con2
a
1
-unlock tables;
-commit;
-begin;
-insert into t1 values(10);
-flush tables with read lock;
-commit;
-unlock tables;
-flush tables with read lock;
-unlock tables;
-begin;
-select * from t1;
+# Switch to connection con3
+UNLOCK TABLES;
+# Switch to connection con2
+COMMIT;
+# Switch to connection con1
+BEGIN;
+INSERT INTO t1 VALUES(10);
+FLUSH TABLES WITH READ LOCK;
+COMMIT;
+UNLOCK TABLES;
+# Switch to connection con2
+FLUSH TABLES WITH READ LOCK;
+UNLOCK TABLES;
+BEGIN;
+SELECT * FROM t1;
a
1
10
-show create database test;
+SHOW CREATE DATABASE test;
Database Create Database
test CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */
-drop table t1;
+DROP TABLE t1;
+# Switch to connection default and close connections con1, con2, con3
diff --git a/mysql-test/r/flush_block_commit_notembedded.result b/mysql-test/r/flush_block_commit_notembedded.result
index 16fb143ee4c..c7fd7a11877 100644
--- a/mysql-test/r/flush_block_commit_notembedded.result
+++ b/mysql-test/r/flush_block_commit_notembedded.result
@@ -1,15 +1,23 @@
-create table t1 (a int) engine=innodb;
-reset master;
-set autocommit=0;
-insert t1 values (1);
-flush tables with read lock;
-show master status;
+# Establish connection con1 (user=root)
+# Establish connection con2 (user=root)
+# Switch to connection con1
+CREATE TABLE t1 (a INT) ENGINE=innodb;
+RESET MASTER;
+SET AUTOCOMMIT=0;
+INSERT t1 VALUES (1);
+# Switch to connection con2
+FLUSH TABLES WITH READ LOCK;
+SHOW MASTER STATUS;
File Position Binlog_Do_DB Binlog_Ignore_DB
master-bin.000001 106
-commit;
-show master status;
+# Switch to connection con1
+COMMIT;
+# Switch to connection con2
+SHOW MASTER STATUS;
File Position Binlog_Do_DB Binlog_Ignore_DB
master-bin.000001 106
-unlock tables;
-drop table t1;
-set autocommit=1;
+UNLOCK TABLES;
+# Switch to connection con1
+DROP TABLE t1;
+SET AUTOCOMMIT=1;
+# Switch to connection default and close connections con1 and con2
diff --git a/mysql-test/r/flush_read_lock_kill.result b/mysql-test/r/flush_read_lock_kill.result
index 0b599f343f7..b16a8b114b3 100644
--- a/mysql-test/r/flush_read_lock_kill.result
+++ b/mysql-test/r/flush_read_lock_kill.result
@@ -1,12 +1,12 @@
-set @old_concurrent_insert= @@global.concurrent_insert;
-set @@global.concurrent_insert= 0;
-drop table if exists t1;
-create table t1 (kill_id int);
-insert into t1 values(connection_id());
-flush tables with read lock;
-select ((@id := kill_id) - kill_id) from t1;
+SET @old_concurrent_insert= @@global.concurrent_insert;
+SET @@global.concurrent_insert= 0;
+DROP TABLE IF EXISTS t1;
+CREATE TABLE t1 (kill_id INT);
+INSERT INTO t1 VALUES(connection_id());
+FLUSH TABLES WITH READ LOCK;
+SELECT ((@id := kill_id) - kill_id) FROM t1;
((@id := kill_id) - kill_id)
0
-kill connection @id;
-drop table t1;
-set @@global.concurrent_insert= @old_concurrent_insert;
+KILL CONNECTION @id;
+DROP TABLE t1;
+SET @@global.concurrent_insert= @old_concurrent_insert;
diff --git a/mysql-test/r/func_math.result b/mysql-test/r/func_math.result
index 74136816a95..c3d2db2d553 100644
--- a/mysql-test/r/func_math.result
+++ b/mysql-test/r/func_math.result
@@ -407,6 +407,36 @@ SELECT a DIV 2 FROM t1 UNION SELECT a DIV 2 FROM t1;
a DIV 2
0
DROP TABLE t1;
+CREATE TABLE t1 (a DOUBLE);
+INSERT INTO t1 VALUES (-1.1), (1.1),
+(-1.5), (1.5),
+(-1.9), (1.9),
+(-2.1), (2.1),
+(-2.5), (2.5),
+(-2.9), (2.9),
+# Check numbers with absolute values > 2^53 - 1
+# (see comments for MAX_EXACT_INTEGER)
+(-1e16 - 0.5), (1e16 + 0.5),
+(-1e16 - 1.5), (1e16 + 1.5);
+SELECT a, ROUND(a) FROM t1;
+a ROUND(a)
+-1.1 -1
+1.1 1
+-1.5 -2
+1.5 2
+-1.9 -2
+1.9 2
+-2.1 -2
+2.1 2
+-2.5 -2
+2.5 2
+-2.9 -3
+2.9 3
+-1e+16 -10000000000000000
+1e+16 10000000000000000
+-1e+16 -10000000000000002
+1e+16 10000000000000002
+DROP TABLE t1;
End of 5.0 tests
SELECT 1e308 + 1e308;
1e308 + 1e308
diff --git a/mysql-test/r/grant.result b/mysql-test/r/grant.result
index e7e5e1e7165..de80a83d538 100644
--- a/mysql-test/r/grant.result
+++ b/mysql-test/r/grant.result
@@ -459,7 +459,7 @@ Privilege Context Comment
Alter Tables To alter the table
Alter routine Functions,Procedures To alter or drop stored functions/procedures
Create Databases,Tables,Indexes To create new databases and tables
-Create routine Functions,Procedures To use CREATE FUNCTION/PROCEDURE
+Create routine Databases To use CREATE FUNCTION/PROCEDURE
Create temporary tables Databases To use CREATE TEMPORARY TABLE
Create view Tables To create new views
Create user Server Admin To create new users
diff --git a/mysql-test/r/group_by.result b/mysql-test/r/group_by.result
index 48f97aeb428..742d4b90807 100644
--- a/mysql-test/r/group_by.result
+++ b/mysql-test/r/group_by.result
@@ -1691,3 +1691,15 @@ FROM t1;
ERROR 21000: Subquery returns more than 1 row
DROP TABLE t1;
SET @@sql_mode = @old_sql_mode;
+SET @old_sql_mode = @@sql_mode;
+SET @@sql_mode='ONLY_FULL_GROUP_BY';
+CREATE TABLE t1(i INT);
+INSERT INTO t1 VALUES (1), (10);
+SELECT COUNT(i) FROM t1;
+COUNT(i)
+2
+SELECT COUNT(i) FROM t1 WHERE i > 1;
+COUNT(i)
+1
+DROP TABLE t1;
+SET @@sql_mode = @old_sql_mode;
diff --git a/mysql-test/r/group_min_max.result b/mysql-test/r/group_min_max.result
index adda0053687..b17884c4f7a 100644
--- a/mysql-test/r/group_min_max.result
+++ b/mysql-test/r/group_min_max.result
@@ -2448,3 +2448,18 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
Warnings:
Note 1003 select sql_buffer_result `test`.`t1`.`a` AS `a`,(max(`test`.`t1`.`b`) + 1) AS `max(b)+1` from `test`.`t1` where (`test`.`t1`.`a` = 0) group by `test`.`t1`.`a`
drop table t1;
+CREATE TABLE t1 (a int, b int, c int, d int,
+KEY foo (c,d,a,b), KEY bar (c,a,b,d));
+INSERT INTO t1 VALUES (1, 1, 1, 1), (1, 1, 1, 2), (1, 1, 1, 3), (1, 1, 1, 4);
+INSERT INTO t1 SELECT * FROM t1;
+INSERT INTO t1 SELECT * FROM t1;
+INSERT INTO t1 SELECT a,b,c+1,d FROM t1;
+EXPLAIN SELECT DISTINCT c FROM t1 WHERE d=4;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range NULL foo 10 NULL 9 Using where; Using index for group-by
+SELECT DISTINCT c FROM t1 WHERE d=4;
+c
+1
+2
+DROP TABLE t1;
+End of 5.0 tests
diff --git a/mysql-test/r/handler_innodb.result b/mysql-test/r/handler_innodb.result
index 3e4cef99480..59a46cabe5f 100644
--- a/mysql-test/r/handler_innodb.result
+++ b/mysql-test/r/handler_innodb.result
@@ -730,3 +730,12 @@ unlock tables;
drop table t1;
handler t1 read a next;
ERROR 42S02: Unknown table 't1' in HANDLER
+drop table if exists t1;
+create table t1 (a int);
+insert into t1 values (1);
+handler t1 open;
+alter table t1 engine=memory;
+handler t1 read a next;
+ERROR HY000: Table storage engine for 't1' doesn't have this option
+handler t1 close;
+drop table t1;
diff --git a/mysql-test/r/handler_myisam.result b/mysql-test/r/handler_myisam.result
index 0b27b07c4d2..afbf2d9fb6d 100644
--- a/mysql-test/r/handler_myisam.result
+++ b/mysql-test/r/handler_myisam.result
@@ -728,3 +728,12 @@ unlock tables;
drop table t1;
handler t1 read a next;
ERROR 42S02: Unknown table 't1' in HANDLER
+drop table if exists t1;
+create table t1 (a int);
+insert into t1 values (1);
+handler t1 open;
+alter table t1 engine=memory;
+handler t1 read a next;
+ERROR HY000: Table storage engine for 't1' doesn't have this option
+handler t1 close;
+drop table t1;
diff --git a/mysql-test/r/information_schema.result b/mysql-test/r/information_schema.result
index 5dd0f159428..9a75e478264 100644
--- a/mysql-test/r/information_schema.result
+++ b/mysql-test/r/information_schema.result
@@ -1720,4 +1720,9 @@ SELECT CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='t1';
CREATE_OPTIONS
KEY_BLOCK_SIZE=1
DROP TABLE t1;
+SET TIMESTAMP=@@TIMESTAMP + 10000000;
+SELECT 'OK' AS TEST_RESULT FROM INFORMATION_SCHEMA.PROCESSLIST WHERE time < 0;
+TEST_RESULT
+OK
+SET TIMESTAMP=DEFAULT;
End of 5.1 tests.
diff --git a/mysql-test/r/information_schema_db.result b/mysql-test/r/information_schema_db.result
index 83b8217b570..475839569c7 100644
--- a/mysql-test/r/information_schema_db.result
+++ b/mysql-test/r/information_schema_db.result
@@ -200,7 +200,7 @@ Field Type Null Key Default Extra
f1 char(4) YES NULL
show create view v2;
View Create View character_set_client collation_connection
-v2 CREATE ALGORITHM=UNDEFINED DEFINER=`testdb_2`@`localhost` SQL SECURITY DEFINER VIEW `test`.`v2` AS select `v1`.`f1` AS `f1` from `testdb_1`.`v1` latin1 latin1_swedish_ci
+v2 CREATE ALGORITHM=UNDEFINED DEFINER=`testdb_2`@`localhost` SQL SECURITY DEFINER VIEW `v2` AS select `v1`.`f1` AS `f1` from `testdb_1`.`v1` latin1 latin1_swedish_ci
show create view testdb_1.v1;
ERROR 42000: SHOW VIEW command denied to user 'testdb_2'@'localhost' for table 'v1'
select table_name from information_schema.columns a
diff --git a/mysql-test/r/innodb-autoinc.result b/mysql-test/r/innodb-autoinc.result
index 1e4b088c6cd..ade4db35ce6 100644
--- a/mysql-test/r/innodb-autoinc.result
+++ b/mysql-test/r/innodb-autoinc.result
@@ -579,3 +579,291 @@ c1
18446744073709551610
18446744073709551615
DROP TABLE t1;
+SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1;
+SET @@INSERT_ID=1;
+SHOW VARIABLES LIKE "%auto_inc%";
+Variable_name Value
+auto_increment_increment 1
+auto_increment_offset 1
+CREATE TABLE t1 (c1 DOUBLE NOT NULL AUTO_INCREMENT, c2 INT, PRIMARY KEY (c1)) ENGINE=InnoDB;
+INSERT INTO t1 VALUES(NULL, 1);
+INSERT INTO t1 VALUES(NULL, 2);
+SELECT * FROM t1;
+c1 c2
+1 1
+2 2
+ALTER TABLE t1 CHANGE c1 c1 SERIAL;
+SELECT * FROM t1;
+c1 c2
+1 1
+2 2
+INSERT INTO t1 VALUES(NULL, 3);
+INSERT INTO t1 VALUES(NULL, 4);
+SELECT * FROM t1;
+c1 c2
+1 1
+2 2
+3 3
+4 4
+DROP TABLE IF EXISTS t1;
+CREATE TABLE t1 (c1 FLOAT NOT NULL AUTO_INCREMENT, c2 INT, PRIMARY KEY (c1)) ENGINE=InnoDB;
+INSERT INTO t1 VALUES(NULL, 1);
+INSERT INTO t1 VALUES(NULL, 2);
+SELECT * FROM t1;
+c1 c2
+1 1
+2 2
+ALTER TABLE t1 CHANGE c1 c1 SERIAL;
+SELECT * FROM t1;
+c1 c2
+1 1
+2 2
+INSERT INTO t1 VALUES(NULL, 3);
+INSERT INTO t1 VALUES(NULL, 4);
+SELECT * FROM t1;
+c1 c2
+1 1
+2 2
+3 3
+4 4
+DROP TABLE t1;
+SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=5;
+DROP TABLE IF EXISTS t1;
+Warnings:
+Note 1051 Unknown table 't1'
+DROP TABLE IF EXISTS t2;
+Warnings:
+Note 1051 Unknown table 't2'
+CREATE TABLE t1 (
+a INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+b INT(10) UNSIGNED NOT NULL,
+c ENUM('FALSE','TRUE') DEFAULT NULL,
+PRIMARY KEY (a)) ENGINE = InnoDB;
+CREATE TABLE t2 (
+m INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+n INT(10) UNSIGNED NOT NULL,
+o enum('FALSE','TRUE') DEFAULT NULL,
+PRIMARY KEY (m)) ENGINE = InnoDB;
+INSERT INTO t2 (n,o) VALUES
+(1 , 'true'), (1 , 'false'), (2 , 'true'), (2 , 'false'), (3 , 'true'),
+(3 , 'false'), (4 , 'true'), (4 , 'false'), (5 , 'true'), (5 , 'false');
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `m` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `n` int(10) unsigned NOT NULL,
+ `o` enum('FALSE','TRUE') DEFAULT NULL,
+ PRIMARY KEY (`m`)
+) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=latin1
+INSERT INTO t1 (b,c) SELECT n,o FROM t2 ;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `b` int(10) unsigned NOT NULL,
+ `c` enum('FALSE','TRUE') DEFAULT NULL,
+ PRIMARY KEY (`a`)
+) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1
+INSERT INTO t1 (b,c) SELECT n,o FROM t2 ;
+SELECT * FROM t1;
+a b c
+1 1 TRUE
+2 1 FALSE
+3 2 TRUE
+4 2 FALSE
+5 3 TRUE
+6 3 FALSE
+7 4 TRUE
+8 4 FALSE
+9 5 TRUE
+10 5 FALSE
+13 1 TRUE
+14 1 FALSE
+15 2 TRUE
+16 2 FALSE
+17 3 TRUE
+18 3 FALSE
+19 4 TRUE
+20 4 FALSE
+21 5 TRUE
+22 5 FALSE
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `b` int(10) unsigned NOT NULL,
+ `c` enum('FALSE','TRUE') DEFAULT NULL,
+ PRIMARY KEY (`a`)
+) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=latin1
+INSERT INTO t1 (b,c) SELECT n,o FROM t2 WHERE o = 'false';
+SELECT * FROM t1;
+a b c
+1 1 TRUE
+2 1 FALSE
+3 2 TRUE
+4 2 FALSE
+5 3 TRUE
+6 3 FALSE
+7 4 TRUE
+8 4 FALSE
+9 5 TRUE
+10 5 FALSE
+13 1 TRUE
+14 1 FALSE
+15 2 TRUE
+16 2 FALSE
+17 3 TRUE
+18 3 FALSE
+19 4 TRUE
+20 4 FALSE
+21 5 TRUE
+22 5 FALSE
+23 1 FALSE
+24 2 FALSE
+25 3 FALSE
+26 4 FALSE
+27 5 FALSE
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `b` int(10) unsigned NOT NULL,
+ `c` enum('FALSE','TRUE') DEFAULT NULL,
+ PRIMARY KEY (`a`)
+) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=latin1
+INSERT INTO t1 (b,c) SELECT n,o FROM t2 WHERE o = 'false';
+SELECT * FROM t1;
+a b c
+1 1 TRUE
+2 1 FALSE
+3 2 TRUE
+4 2 FALSE
+5 3 TRUE
+6 3 FALSE
+7 4 TRUE
+8 4 FALSE
+9 5 TRUE
+10 5 FALSE
+13 1 TRUE
+14 1 FALSE
+15 2 TRUE
+16 2 FALSE
+17 3 TRUE
+18 3 FALSE
+19 4 TRUE
+20 4 FALSE
+21 5 TRUE
+22 5 FALSE
+23 1 FALSE
+24 2 FALSE
+25 3 FALSE
+26 4 FALSE
+27 5 FALSE
+30 1 FALSE
+31 2 FALSE
+32 3 FALSE
+33 4 FALSE
+34 5 FALSE
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `b` int(10) unsigned NOT NULL,
+ `c` enum('FALSE','TRUE') DEFAULT NULL,
+ PRIMARY KEY (`a`)
+) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=latin1
+INSERT INTO t1 (b,c) SELECT n,o FROM t2 WHERE o = 'false';
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `b` int(10) unsigned NOT NULL,
+ `c` enum('FALSE','TRUE') DEFAULT NULL,
+ PRIMARY KEY (`a`)
+) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=latin1
+INSERT INTO t1 (b,c) SELECT n,o FROM t2 WHERE o = 'false';
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `b` int(10) unsigned NOT NULL,
+ `c` enum('FALSE','TRUE') DEFAULT NULL,
+ PRIMARY KEY (`a`)
+) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=latin1
+INSERT INTO t1 (b,c) SELECT n,o FROM t2 WHERE o = 'false';
+SELECT * FROM t1;
+a b c
+1 1 TRUE
+2 1 FALSE
+3 2 TRUE
+4 2 FALSE
+5 3 TRUE
+6 3 FALSE
+7 4 TRUE
+8 4 FALSE
+9 5 TRUE
+10 5 FALSE
+13 1 TRUE
+14 1 FALSE
+15 2 TRUE
+16 2 FALSE
+17 3 TRUE
+18 3 FALSE
+19 4 TRUE
+20 4 FALSE
+21 5 TRUE
+22 5 FALSE
+23 1 FALSE
+24 2 FALSE
+25 3 FALSE
+26 4 FALSE
+27 5 FALSE
+30 1 FALSE
+31 2 FALSE
+32 3 FALSE
+33 4 FALSE
+34 5 FALSE
+37 1 FALSE
+38 2 FALSE
+39 3 FALSE
+40 4 FALSE
+41 5 FALSE
+44 1 FALSE
+45 2 FALSE
+46 3 FALSE
+47 4 FALSE
+48 5 FALSE
+51 1 FALSE
+52 2 FALSE
+53 3 FALSE
+54 4 FALSE
+55 5 FALSE
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `b` int(10) unsigned NOT NULL,
+ `c` enum('FALSE','TRUE') DEFAULT NULL,
+ PRIMARY KEY (`a`)
+) ENGINE=InnoDB AUTO_INCREMENT=58 DEFAULT CHARSET=latin1
+DROP TABLE t1;
+DROP TABLE t2;
+DROP TABLE IF EXISTS t1;
+Warnings:
+Note 1051 Unknown table 't1'
+DROP TABLE IF EXISTS t2;
+Warnings:
+Note 1051 Unknown table 't2'
+CREATE TABLE t1(
+c1 INT(10) UNSIGNED NOT NULL AUTO_INCREMENT
+PRIMARY KEY) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL);
+CREATE TABLE t2(
+c1 TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT
+PRIMARY KEY) ENGINE=InnoDB;
+INSERT INTO t2 SELECT c1 FROM t1;
+Got one of the listed errors
+INSERT INTO t2 SELECT NULL FROM t1;
+Got one of the listed errors
+DROP TABLE t1;
+DROP TABLE t2;
diff --git a/mysql-test/r/innodb_bug42419.result b/mysql-test/r/innodb_bug42419.result
new file mode 100644
index 00000000000..f304bb634cb
--- /dev/null
+++ b/mysql-test/r/innodb_bug42419.result
@@ -0,0 +1,17 @@
+CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b INT) ENGINE = InnoDB;
+INSERT INTO t1 VALUES (1,1),(2,2),(3,3);
+COMMIT;
+SET AUTOCOMMIT = 0;
+CREATE TEMPORARY TABLE t1_tmp ( b INT );
+INSERT INTO t1_tmp (b) SELECT b FROM t1 WHERE a = 3;
+INSERT INTO t1_tmp (b) SELECT b FROM t1 WHERE a = 2;
+SET AUTOCOMMIT = 0;
+CREATE TEMPORARY TABLE t2_tmp ( a int, new_a int );
+INSERT INTO t2_tmp VALUES (1,51),(2,52),(3,53);
+UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 1;
+UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 2;
+INSERT INTO t1_tmp (b) SELECT b FROM t1 WHERE a = 1;
+ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
+Reap the server message for connection user2 UPDATE t1 ...
+UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 3;
+DROP TABLE t1;
diff --git a/mysql-test/r/innodb_mysql.result b/mysql-test/r/innodb_mysql.result
index 32a828cf82d..6fcc9415d12 100644
--- a/mysql-test/r/innodb_mysql.result
+++ b/mysql-test/r/innodb_mysql.result
@@ -1683,24 +1683,6 @@ CREATE INDEX i1 on t1 (a(3));
SELECT * FROM t1 WHERE a = 'abcde';
a
DROP TABLE t1;
-connect(localhost,root,,test,12500,/home/kgeorge/mysql/work/B42419-merge-5.1-bugteam/mysql-test/var/tmp/mysqld.1.sock);
-connect(localhost,root,,test,12500,/home/kgeorge/mysql/work/B42419-merge-5.1-bugteam/mysql-test/var/tmp/mysqld.1.sock);
-CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT)
-ENGINE=InnoDB;
-INSERT INTO t1 VALUES (1,1),(2,2),(3,3);
-SET AUTOCOMMIT = 0;
-CREATE TEMPORARY TABLE t1_tmp (b INT);
-INSERT INTO t1_tmp SELECT b FROM t1 WHERE a = 3;
-INSERT INTO t1_tmp SELECT b FROM t1 WHERE a = 2;
-SET AUTOCOMMIT = 0;
-CREATE TEMPORARY TABLE t2_tmp ( a INT, new_a INT);
-INSERT INTO t2_tmp VALUES (1,51),(2,52),(3,53);
-UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 1;
-UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 2;
-INSERT INTO t1_tmp SELECT b FROM t1 WHERE a = 1;
-ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
-UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 3;
-DROP TABLE t1;
CREATE TABLE foo (a int, b int, c char(10),
PRIMARY KEY (c(3)),
KEY b (b)
diff --git a/mysql-test/r/key_cache.result b/mysql-test/r/key_cache.result
index 9ada5dc0784..08d8059f61b 100644
--- a/mysql-test/r/key_cache.result
+++ b/mysql-test/r/key_cache.result
@@ -276,8 +276,6 @@ Variable_name Value
Key_blocks_unused KEY_BLOCKS_UNUSED
set global keycache2.key_buffer_size=0;
set global keycache3.key_buffer_size=100;
-Warnings:
-Warning 1292 Truncated incorrect key_buffer_size value: '100'
set global keycache3.key_buffer_size=0;
create table t1 (mytext text, FULLTEXT (mytext));
insert t1 values ('aaabbb');
diff --git a/mysql-test/r/lock.result b/mysql-test/r/lock.result
index 6152e403637..7ec07fb5273 100644
--- a/mysql-test/r/lock.result
+++ b/mysql-test/r/lock.result
@@ -166,4 +166,31 @@ ERROR HY000: View's SELECT refers to a temporary table 't2'
Cleanup.
drop table t2, t3;
+#
+# Bug#39843 DELETE requires write access to table in subquery in where clause
+#
+DROP TABLE IF EXISTS t1,t2;
+CREATE TABLE t1 (
+table1_rowid SMALLINT NOT NULL
+);
+CREATE TABLE t2 (
+table2_rowid SMALLINT NOT NULL
+);
+INSERT INTO t1 VALUES (1);
+INSERT INTO t2 VALUES (1);
+LOCK TABLES t1 WRITE, t2 READ;
+# Sub-select should not try to aquire a write lock.
+DELETE FROM t1
+WHERE EXISTS
+(
+SELECT 'x'
+FROM t2
+WHERE t1.table1_rowid = t2.table2_rowid
+) ;
+# While implementing the patch we didn't break old behavior;
+# The following sub-select should still requires a write lock:
+SELECT * FROM t1 WHERE 1 IN (SELECT * FROM t2 FOR UPDATE);
+ERROR HY000: Table 't2' was locked with a READ lock and can't be updated
+UNLOCK TABLES;
+DROP TABLE t1,t2;
End of 5.1 tests.
diff --git a/mysql-test/r/lock_multi.result b/mysql-test/r/lock_multi.result
index a0e3d9fad06..50e37d28dd6 100644
--- a/mysql-test/r/lock_multi.result
+++ b/mysql-test/r/lock_multi.result
@@ -51,10 +51,10 @@ Field Type Null Key Default Extra
a int(11) YES NULL
unlock tables;
drop table t1;
-use mysql;
+USE mysql;
LOCK TABLES columns_priv WRITE, db WRITE, host WRITE, user WRITE;
FLUSH TABLES;
-use mysql;
+USE mysql;
SELECT user.Select_priv FROM user, db WHERE user.user = db.user LIMIT 1;
OPTIMIZE TABLES columns_priv, db, host, user;
Table Op Msg_type Msg_text
@@ -65,7 +65,7 @@ mysql.user optimize status OK
UNLOCK TABLES;
Select_priv
N
-use test;
+USE test;
use test;
CREATE TABLE t1 (c1 int);
LOCK TABLE t1 WRITE;
@@ -133,8 +133,8 @@ DROP TABLE t1;
End of 5.0 tests
create table t1 (i int);
lock table t1 read;
-update t1 set i= 10;;
-select * from t1;;
+update t1 set i= 10;
+select * from t1;
kill query ID;
i
ERROR 70100: Query execution was interrupted
diff --git a/mysql-test/r/log_tables.result b/mysql-test/r/log_tables.result
index 376120abcda..f8321520880 100644
--- a/mysql-test/r/log_tables.result
+++ b/mysql-test/r/log_tables.result
@@ -56,7 +56,7 @@ general_log CREATE TABLE `general_log` (
`event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`thread_id` int(11) NOT NULL,
- `server_id` int(11) NOT NULL,
+ `server_id` int(10) unsigned NOT NULL,
`command_type` varchar(64) NOT NULL,
`argument` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'
@@ -65,7 +65,7 @@ Field Type Null Key Default Extra
event_time timestamp NO CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP
user_host mediumtext NO NULL
thread_id int(11) NO NULL
-server_id int(11) NO NULL
+server_id int(10) unsigned NO NULL
command_type varchar(64) NO NULL
argument mediumtext NO NULL
show create table mysql.slow_log;
@@ -80,7 +80,7 @@ slow_log CREATE TABLE `slow_log` (
`db` varchar(512) NOT NULL,
`last_insert_id` int(11) NOT NULL,
`insert_id` int(11) NOT NULL,
- `server_id` int(11) NOT NULL,
+ `server_id` int(10) unsigned NOT NULL,
`sql_text` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
show fields from mysql.slow_log;
@@ -94,7 +94,7 @@ rows_examined int(11) NO NULL
db varchar(512) NO NULL
last_insert_id int(11) NO NULL
insert_id int(11) NO NULL
-server_id int(11) NO NULL
+server_id int(10) unsigned NO NULL
sql_text mediumtext NO NULL
flush logs;
flush tables;
@@ -167,7 +167,7 @@ general_log CREATE TABLE `general_log` (
`event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`thread_id` int(11) NOT NULL,
- `server_id` int(11) NOT NULL,
+ `server_id` int(10) unsigned NOT NULL,
`command_type` varchar(64) NOT NULL,
`argument` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'
@@ -183,7 +183,7 @@ slow_log CREATE TABLE `slow_log` (
`db` varchar(512) NOT NULL,
`last_insert_id` int(11) NOT NULL,
`insert_id` int(11) NOT NULL,
- `server_id` int(11) NOT NULL,
+ `server_id` int(10) unsigned NOT NULL,
`sql_text` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
alter table mysql.general_log engine=myisam;
@@ -194,7 +194,7 @@ general_log CREATE TABLE `general_log` (
`event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`thread_id` int(11) NOT NULL,
- `server_id` int(11) NOT NULL,
+ `server_id` int(10) unsigned NOT NULL,
`command_type` varchar(64) NOT NULL,
`argument` mediumtext NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='General log'
@@ -210,7 +210,7 @@ slow_log CREATE TABLE `slow_log` (
`db` varchar(512) NOT NULL,
`last_insert_id` int(11) NOT NULL,
`insert_id` int(11) NOT NULL,
- `server_id` int(11) NOT NULL,
+ `server_id` int(10) unsigned NOT NULL,
`sql_text` mediumtext NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Slow log'
set global general_log='ON';
@@ -268,7 +268,7 @@ CREATE TABLE `general_log` (
ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`thread_id` int(11) NOT NULL,
-`server_id` int(11) NOT NULL,
+`server_id` int(10) unsigned NOT NULL,
`command_type` varchar(64) NOT NULL,
`argument` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log';
@@ -283,7 +283,7 @@ ON UPDATE CURRENT_TIMESTAMP,
`db` varchar(512) NOT NULL,
`last_insert_id` int(11) NOT NULL,
`insert_id` int(11) NOT NULL,
-`server_id` int(11) NOT NULL,
+`server_id` int(10) unsigned NOT NULL,
`sql_text` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log';
set global general_log='ON';
diff --git a/mysql-test/r/merge.result b/mysql-test/r/merge.result
index 3910536ee5d..d844abc1847 100644
--- a/mysql-test/r/merge.result
+++ b/mysql-test/r/merge.result
@@ -2103,4 +2103,16 @@ a
UNLOCK TABLES;
# drop the created tables
DROP TABLE t1, t2, t3;
+# insert duplicate value in child table while merge table doesn't have key
+create table t1 (
+col1 int(10),
+primary key (col1)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+CREATE TABLE m1 (
+col1 int(10) NOT NULL
+) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(t1);
+insert into m1 (col1) values (1);
+insert into m1 (col1) values (1);
+ERROR 23000: Duplicate entry '' for key '*UNKNOWN*'
+drop table m1, t1;
End of 5.1 tests
diff --git a/mysql-test/r/mysql.result b/mysql-test/r/mysql.result
index 25b66fe7fc6..dd2c9190c08 100644
--- a/mysql-test/r/mysql.result
+++ b/mysql-test/r/mysql.result
@@ -188,6 +188,21 @@ delimiter
2
@z:='1' @z=database()
1 NULL
+1
+1
+1
+1
+set @old_max_allowed_packet = @@global.max_allowed_packet;
+set @@global.max_allowed_packet = 2 * 1024 * 1024 + 1024;
+set @@max_allowed_packet = @@global.max_allowed_packet;
+CREATE TABLE t1(data LONGBLOB);
+INSERT INTO t1 SELECT REPEAT('1', 2*1024*1024);
+SELECT LENGTH(data) FROM t1;
+LENGTH(data)
+2097152
+DROP TABLE t1;
+set @@global.max_allowed_packet = @old_max_allowed_packet;
+set @@max_allowed_packet = @@global.max_allowed_packet;
End of 5.0 tests
WARNING: --server-arg option not supported in this configuration.
Warning (Code 1286): Unknown table engine 'nonexistent'
diff --git a/mysql-test/r/mysqlbinlog.result b/mysql-test/r/mysqlbinlog.result
index 974b4952799..34d695a0272 100644
--- a/mysql-test/r/mysqlbinlog.result
+++ b/mysql-test/r/mysqlbinlog.result
@@ -391,22 +391,28 @@ DELIMITER ;
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
CREATE TABLE t1 (c1 CHAR(10));
-flush logs;
+FLUSH LOGS;
INSERT INTO t1 VALUES ('0123456789');
-flush logs;
+FLUSH LOGS;
DROP TABLE t1;
-# Query thread_id=REMOVED exec_time=REMOVED error_code=REMOVED
-flush logs;
-create table t1(a int);
-insert into t1 values(connection_id());
-flush logs;
-drop table t1;
+We expect this value to be 1
+The bug being tested was that 'Query' lines were not preceded by '#'
+If the line is in the table, it had to have been preceded by a '#'
+
+SELECT COUNT(*) AS `BUG#28293_expect_1` FROM patch WHERE a LIKE '%Query%';
+BUG#28293_expect_1
1
-drop table t1;
+DROP TABLE patch;
+FLUSH LOGS;
+CREATE TABLE t1(a INT);
+INSERT INTO t1 VALUES(connection_id());
+FLUSH LOGS;
+DROP TABLE t1;
+1
+DROP TABLE t1;
shell> mysqlbinlog std_data/corrupt-relay-bin.000624 > var/tmp/bug31793.sql
-End of 5.0 tests
-flush logs;
-BUG#31611: Security risk with BINLOG statement
+FLUSH LOGS;
+Bug#31611 Security risk with BINLOG statement
SET BINLOG_FORMAT=ROW;
CREATE DATABASE mysqltest1;
CREATE USER untrusted@localhost;
@@ -429,7 +435,7 @@ a b
1 root@localhost
DROP DATABASE mysqltest1;
DROP USER untrusted@localhost;
-BUG#32580: mysqlbinlog cannot read binlog event with user variables
+Bug#32580 mysqlbinlog cannot read binlog event with user variables
USE test;
SET BINLOG_FORMAT = STATEMENT;
FLUSH LOGS;
@@ -454,4 +460,15 @@ an_int 1000
a_decimal 907.79
a_string Just a test
DROP TABLE t1;
+SET @@global.server_id= 4294967295;
+RESET MASTER;
+FLUSH LOGS;
+SELECT
+(@a:=LOAD_FILE("MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug37313.binlog"))
+IS NOT NULL;
+(@a:=LOAD_FILE("MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug37313.binlog"))
+IS NOT NULL
+1
+*** Unsigned server_id 4294967295 is found: 1 ***
+SET @@global.server_id= 1;
End of 5.1 tests
diff --git a/mysql-test/r/mysqlcheck.result b/mysql-test/r/mysqlcheck.result
index 6f7fcb7efde..704cd7ac3f4 100644
--- a/mysql-test/r/mysqlcheck.result
+++ b/mysql-test/r/mysqlcheck.result
@@ -149,7 +149,7 @@ SET NAMES DEFAULT;
mysqlcheck --default-character-set="latin1" --databases test
test.?
Error : Table doesn't exist
-error : Corrupt
+status : Operation failed
mysqlcheck --default-character-set="utf8" --databases test
test.Ñ OK
SET NAMES utf8;
diff --git a/mysql-test/r/mysqldump-max.result b/mysql-test/r/mysqldump-max.result
index c1c61cd7fe8..c300f3d7996 100644
--- a/mysql-test/r/mysqldump-max.result
+++ b/mysql-test/r/mysqldump-max.result
@@ -93,73 +93,73 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET l
USE `test`;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`id` int(8) DEFAULT NULL,
`name` varchar(32) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
INSERT DELAYED IGNORE INTO `t1` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
DROP TABLE IF EXISTS `t2`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t2` (
`id` int(8) DEFAULT NULL,
`name` varchar(32) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
INSERT DELAYED IGNORE INTO `t2` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
/*!40000 ALTER TABLE `t2` ENABLE KEYS */;
DROP TABLE IF EXISTS `t3`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t3` (
`id` int(8) DEFAULT NULL,
`name` varchar(32) DEFAULT NULL
) ENGINE=MEMORY DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t3` DISABLE KEYS */;
INSERT DELAYED IGNORE INTO `t3` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
/*!40000 ALTER TABLE `t3` ENABLE KEYS */;
DROP TABLE IF EXISTS `t4`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t4` (
`id` int(8) DEFAULT NULL,
`name` varchar(32) DEFAULT NULL
) ENGINE=MEMORY DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t4` DISABLE KEYS */;
INSERT DELAYED IGNORE INTO `t4` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
/*!40000 ALTER TABLE `t4` ENABLE KEYS */;
DROP TABLE IF EXISTS `t5`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t5` (
`id` int(8) DEFAULT NULL,
`name` varchar(32) DEFAULT NULL
) ENGINE=ARCHIVE DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t5` DISABLE KEYS */;
INSERT DELAYED IGNORE INTO `t5` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
/*!40000 ALTER TABLE `t5` ENABLE KEYS */;
DROP TABLE IF EXISTS `t6`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t6` (
`id` int(8) DEFAULT NULL,
`name` varchar(32) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t6` DISABLE KEYS */;
INSERT IGNORE INTO `t6` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
@@ -190,73 +190,73 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET l
USE `test`;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`id` int(8) DEFAULT NULL,
`name` varchar(32) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
INSERT DELAYED INTO `t1` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
DROP TABLE IF EXISTS `t2`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t2` (
`id` int(8) DEFAULT NULL,
`name` varchar(32) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
INSERT DELAYED INTO `t2` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
/*!40000 ALTER TABLE `t2` ENABLE KEYS */;
DROP TABLE IF EXISTS `t3`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t3` (
`id` int(8) DEFAULT NULL,
`name` varchar(32) DEFAULT NULL
) ENGINE=MEMORY DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t3` DISABLE KEYS */;
INSERT DELAYED INTO `t3` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
/*!40000 ALTER TABLE `t3` ENABLE KEYS */;
DROP TABLE IF EXISTS `t4`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t4` (
`id` int(8) DEFAULT NULL,
`name` varchar(32) DEFAULT NULL
) ENGINE=MEMORY DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t4` DISABLE KEYS */;
INSERT DELAYED INTO `t4` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
/*!40000 ALTER TABLE `t4` ENABLE KEYS */;
DROP TABLE IF EXISTS `t5`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t5` (
`id` int(8) DEFAULT NULL,
`name` varchar(32) DEFAULT NULL
) ENGINE=ARCHIVE DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t5` DISABLE KEYS */;
INSERT DELAYED INTO `t5` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
/*!40000 ALTER TABLE `t5` ENABLE KEYS */;
DROP TABLE IF EXISTS `t6`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t6` (
`id` int(8) DEFAULT NULL,
`name` varchar(32) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t6` DISABLE KEYS */;
INSERT INTO `t6` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
diff --git a/mysql-test/r/mysqldump.result b/mysql-test/r/mysqldump.result
index 4e97f5bc509..1d02adf4504 100644
--- a/mysql-test/r/mysqldump.result
+++ b/mysql-test/r/mysqldump.result
@@ -34,12 +34,12 @@ DROP TABLE t1;
CREATE TABLE t1 (a decimal(64, 20));
INSERT INTO t1 VALUES ("1234567890123456789012345678901234567890"),
("0987654321098765432109876543210987654321");
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` decimal(64,20) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
INSERT INTO `t1` VALUES ('1234567890123456789012345678901234567890.00000000000000000000'),('987654321098765432109876543210987654321.00000000000000000000');
DROP TABLE t1;
#
@@ -49,12 +49,12 @@ CREATE TABLE t1 (a double);
INSERT INTO t1 VALUES ('-9e999999');
Warnings:
Warning 1264 Out of range value for column 'a' at row 1
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` double DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
INSERT INTO `t1` VALUES (RES);
DROP TABLE t1;
#
@@ -70,21 +70,21 @@ INSERT INTO t1 VALUES ('1.2345', 2.3456);
INSERT INTO t1 VALUES ("1.2345", 2.3456);
ERROR 42S22: Unknown column '1.2345' in 'field list'
SET SQL_MODE=@OLD_SQL_MODE;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` decimal(10,5) DEFAULT NULL,
`b` float DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
INSERT INTO `t1` VALUES ('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456);
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` decimal(10,5) DEFAULT NULL,
`b` float DEFAULT NULL
);
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
INSERT INTO `t1` VALUES ('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456);
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
@@ -98,13 +98,13 @@ INSERT INTO `t1` VALUES ('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456)
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` decimal(10,5) DEFAULT NULL,
`b` float DEFAULT NULL
);
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -127,13 +127,13 @@ UNLOCK TABLES;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` decimal(10,5) DEFAULT NULL,
`b` float DEFAULT NULL
);
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
INSERT INTO `t1` VALUES ('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456);
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -209,12 +209,12 @@ INSERT INTO t1 VALUES (_koi8r x'C1C2C3C4C5'), (NULL);
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` varchar(255) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=koi8r;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -245,12 +245,9 @@ INSERT INTO t1 VALUES (1), (2);
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,MYSQL40' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) TYPE=MyISAM;
-SET character_set_client = @saved_cs_client;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -271,12 +268,9 @@ UNLOCK TABLES;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,MYSQL323' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) TYPE=MyISAM;
-SET character_set_client = @saved_cs_client;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -295,12 +289,12 @@ DROP TABLE t1;
# Bug#2592 mysqldump doesn't quote "tricky" names correctly
#
create table ```a` (i int);
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE ```a` (
`i` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
drop table ```a`;
#
# Bug#2591 mysqldump quotes names inconsistently
@@ -318,12 +312,12 @@ create table t1(a int);
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -346,12 +340,12 @@ UNLOCK TABLES;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ANSI' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS "t1";
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE "t1" (
"a" int(11) DEFAULT NULL
);
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES "t1" WRITE;
/*!40000 ALTER TABLE "t1" DISABLE KEYS */;
@@ -377,12 +371,12 @@ set global sql_mode='ANSI_QUOTES';
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -405,12 +399,12 @@ UNLOCK TABLES;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ANSI' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS "t1";
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE "t1" (
"a" int(11) DEFAULT NULL
);
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES "t1" WRITE;
/*!40000 ALTER TABLE "t1" DISABLE KEYS */;
@@ -440,12 +434,12 @@ insert into t1 values (1),(2),(3);
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -534,12 +528,12 @@ INSERT INTO t1 VALUES (_latin1 'ÄÖÜß');
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` char(10) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -570,12 +564,9 @@ UNLOCK TABLES;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,MYSQL323' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
CREATE TABLE `t1` (
`a` char(10) DEFAULT NULL
) TYPE=MyISAM;
-SET character_set_client = @saved_cs_client;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -596,12 +587,9 @@ UNLOCK TABLES;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,MYSQL323' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
CREATE TABLE `t1` (
`a` char(10) DEFAULT NULL
) TYPE=MyISAM;
-SET character_set_client = @saved_cs_client;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -622,12 +610,9 @@ UNLOCK TABLES;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,MYSQL323' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
CREATE TABLE `t1` (
`a` char(10) DEFAULT NULL
) TYPE=MyISAM;
-SET character_set_client = @saved_cs_client;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -661,12 +646,12 @@ INSERT INTO t2 VALUES (4),(5),(6);
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t2`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t2` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t2` WRITE;
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
@@ -702,12 +687,12 @@ INSERT INTO `t1` VALUES (0x602010000280100005E71A);
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`b` blob
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -743,12 +728,12 @@ INSERT INTO t1 VALUES (4),(5),(6);
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -777,12 +762,12 @@ UNLOCK TABLES;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
INSERT DELAYED IGNORE INTO `t1` VALUES (1),(2),(3),(4),(5),(6);
@@ -1146,8 +1131,8 @@ insert into t1 (F_8d3bba7425e7c98c50f52ca1b52d3735) values (1);
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`F_c4ca4238a0b923820dcc509a6f75849b` int(11) DEFAULT NULL,
`F_c81e728d9d4c2f636f067f89cc14862c` int(11) DEFAULT NULL,
@@ -1480,7 +1465,7 @@ CREATE TABLE `t1` (
`F_6faa8040da20ef399b63a72d0e4ab575` int(11) DEFAULT NULL,
`F_fe73f687e5bc5280214e0486b273a5f9` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -1521,12 +1506,12 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET l
USE `test`;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -1565,19 +1550,19 @@ INSERT INTO t2 VALUES (1), (2);
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `t2`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t2` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
@@ -1600,19 +1585,19 @@ SET character_set_client = @saved_cs_client;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `t2`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t2` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
@@ -1812,26 +1797,26 @@ create table t3(a int);
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t3`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t3` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `t2`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t2` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
@@ -1861,12 +1846,12 @@ mysqldump: Got error: 1064: You have an error in your SQL syntax; check the manu
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -1897,15 +1882,15 @@ insert into t1 values (0815, 4711, 2006);
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ANSI' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS "t1";
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE "t1" (
"a b" int(11) NOT NULL DEFAULT '0',
"c""d" int(11) NOT NULL DEFAULT '0',
"e`f" int(11) NOT NULL DEFAULT '0',
PRIMARY KEY ("a b","c""d","e`f")
);
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES "t1" WRITE;
/*!40000 ALTER TABLE "t1" DISABLE KEYS */;
@@ -1931,15 +1916,15 @@ UNLOCK TABLES;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a b` int(11) NOT NULL DEFAULT '0',
`c"d` int(11) NOT NULL DEFAULT '0',
`e``f` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`a b`,`c"d`,`e``f`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -1985,13 +1970,13 @@ create view v2 as select * from t2 where a like 'a%' with check option;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t2`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t2` (
`a` varchar(30) DEFAULT NULL,
KEY `a` (`a`(5))
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t2` WRITE;
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
@@ -2081,12 +2066,12 @@ create view v1 as select * from t1;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -2153,13 +2138,13 @@ create view v2 as select * from t2 where a like 'a%' with check option;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t2`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t2` (
`a` varchar(30) DEFAULT NULL,
KEY `a` (`a`(5))
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t2` WRITE;
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
@@ -2220,12 +2205,12 @@ INSERT INTO t1 VALUES ('\'');
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` char(10) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -2266,14 +2251,14 @@ select v3.a from v3, v1 where v1.a=v3.a and v3.b=3 limit 1;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
`c` varchar(30) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -2425,13 +2410,13 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET l
USE `test`;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL,
`b` bigint(20) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -2497,12 +2482,12 @@ DELIMITER ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
DROP TABLE IF EXISTS `t2`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t2` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t2` WRITE;
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
@@ -2554,13 +2539,13 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET l
USE `test`;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL,
`b` bigint(20) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -2568,12 +2553,12 @@ INSERT INTO `t1` VALUES (1,NULL),(2,NULL),(4,NULL),(11,NULL);
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
DROP TABLE IF EXISTS `t2`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t2` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t2` WRITE;
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
@@ -2699,12 +2684,12 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET l
USE `test`;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -2850,13 +2835,13 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET l
USE `test`;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`d` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY `d` (`d`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -2887,13 +2872,13 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET l
USE `test`;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`d` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY `d` (`d`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -2940,12 +2925,12 @@ a2
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ANSI' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS "t1 test";
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE "t1 test" (
"a1" int(11) DEFAULT NULL
);
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES "t1 test" WRITE;
/*!40000 ALTER TABLE "t1 test" DISABLE KEYS */;
@@ -2969,12 +2954,12 @@ DELIMITER ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
DROP TABLE IF EXISTS "t2 test";
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE "t2 test" (
"a2" int(11) DEFAULT NULL
);
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES "t2 test" WRITE;
/*!40000 ALTER TABLE "t2 test" DISABLE KEYS */;
@@ -3023,14 +3008,14 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET l
USE `test`;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL,
`b` varchar(32) DEFAULT NULL,
`c` varchar(32) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -3154,12 +3139,12 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET l
USE `test`;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -3213,13 +3198,13 @@ insert into t1 values ('','');
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` binary(1) DEFAULT NULL,
`b` blob
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -3248,13 +3233,13 @@ UNLOCK TABLES;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` binary(1) DEFAULT NULL,
`b` blob
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -3427,12 +3412,12 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqldump_test_db` /*!40100 DEFAULT CH
USE `mysqldump_test_db`;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -3489,14 +3474,14 @@ create view nasishnasifu as select mysqldump_tables.basetable.id from mysqldump_
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqldump_tables` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `mysqldump_tables`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `basetable` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`tag` varchar(64) DEFAULT NULL,
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqldump_views` /*!40100 DEFAULT CHARACTER SET latin1 */;
@@ -3520,7 +3505,7 @@ USE `mysqldump_views`;
/*!50001 SET collation_connection = latin1_swedish_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */
-/*!50001 VIEW `mysqldump_views`.`nasishnasifu` AS select `mysqldump_tables`.`basetable`.`id` AS `id` from `mysqldump_tables`.`basetable` */;
+/*!50001 VIEW `nasishnasifu` AS select `mysqldump_tables`.`basetable`.`id` AS `id` from `mysqldump_tables`.`basetable` */;
/*!50001 SET character_set_client = @saved_cs_client */;
/*!50001 SET character_set_results = @saved_cs_results */;
/*!50001 SET collation_connection = @saved_col_connection */;
@@ -3663,31 +3648,31 @@ CREATE TABLE t1 (a INT) ENGINE=merge UNION=(t2, t3);
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 UNION=(`t2`,`t3`);
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `t2`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t2` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t2` WRITE;
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
/*!40000 ALTER TABLE `t2` ENABLE KEYS */;
UNLOCK TABLES;
DROP TABLE IF EXISTS `t3`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t3` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t3` WRITE;
/*!40000 ALTER TABLE `t3` DISABLE KEYS */;
@@ -3767,13 +3752,13 @@ drop database mysqldump_test_db;
#
CREATE TABLE t1 (c1 INT, c2 LONGBLOB);
INSERT INTO t1 SET c1=11, c2=REPEAT('q',509);
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`c1` int(11) DEFAULT NULL,
`c2` longblob
);
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
INSERT INTO `t1` VALUES (11,0x7171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171);
DROP TABLE t1;
#
@@ -3830,6 +3815,154 @@ DROP TABLE t1,t2;
-- Dump completed on DATE
+SET @@GLOBAL.CONCURRENT_INSERT = @OLD_CONCURRENT_INSERT;
+#
+# Bug #42635: mysqldump includes views that were excluded using
+# the --ignore-table option
+#
+create database db42635;
+use db42635;
+create table t1 (id int);
+create view db42635.v1 (c) as select * from db42635.t1;
+create view db42635.v2 (c) as select * from db42635.t1;
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8 */;
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+DROP TABLE IF EXISTS `t1`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `t1` (
+ `id` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+LOCK TABLES `t1` WRITE;
+/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
+/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
+UNLOCK TABLES;
+DROP TABLE IF EXISTS `v2`;
+/*!50001 DROP VIEW IF EXISTS `v2`*/;
+SET @saved_cs_client = @@character_set_client;
+SET character_set_client = utf8;
+/*!50001 CREATE TABLE `v2` (
+ `c` int(11)
+) ENGINE=MyISAM */;
+SET character_set_client = @saved_cs_client;
+/*!50001 DROP TABLE `v2`*/;
+/*!50001 DROP VIEW IF EXISTS `v2`*/;
+/*!50001 SET @saved_cs_client = @@character_set_client */;
+/*!50001 SET @saved_cs_results = @@character_set_results */;
+/*!50001 SET @saved_col_connection = @@collation_connection */;
+/*!50001 SET character_set_client = latin1 */;
+/*!50001 SET character_set_results = latin1 */;
+/*!50001 SET collation_connection = latin1_swedish_ci */;
+/*!50001 CREATE ALGORITHM=UNDEFINED */
+/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */
+/*!50001 VIEW `v2` AS select `t1`.`id` AS `c` from `t1` */;
+/*!50001 SET character_set_client = @saved_cs_client */;
+/*!50001 SET character_set_results = @saved_cs_results */;
+/*!50001 SET collation_connection = @saved_col_connection */;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+
+use test;
+drop database db42635;
+#
+# Bug#33550 mysqldump 4.0 compatibility broken
+#
+SET NAMES utf8;
+CREATE TABLE `straße` ( f1 INT );
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,MYSQL323' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+DROP TABLE IF EXISTS `straße`;
+CREATE TABLE `straße` (
+ `f1` int(11) DEFAULT NULL
+) TYPE=MyISAM;
+
+LOCK TABLES `straße` WRITE;
+/*!40000 ALTER TABLE `straße` DISABLE KEYS */;
+/*!40000 ALTER TABLE `straße` ENABLE KEYS */;
+UNLOCK TABLES;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,MYSQL323' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+DROP TABLE IF EXISTS `straße`;
+CREATE TABLE `straße` (
+ `f1` int(11) DEFAULT NULL
+) TYPE=MyISAM;
+
+LOCK TABLES `straße` WRITE;
+/*!40000 ALTER TABLE `straße` DISABLE KEYS */;
+/*!40000 ALTER TABLE `straße` ENABLE KEYS */;
+UNLOCK TABLES;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+
+DROP TABLE `straße`;
+CREATE TABLE `כדשגכחךלדגכחשךדגחכךלדגכ` ( f1 INT );
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,MYSQL323' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+DROP TABLE IF EXISTS `כדשגכחךלדגכחשךדגחכךלדגכ`;
+CREATE TABLE `כדשגכחךלדגכחשךדגחכךלדגכ` (
+ `f1` int(11) DEFAULT NULL
+) TYPE=MyISAM;
+
+LOCK TABLES `כדשגכחךלדגכחשךדגחכךלדגכ` WRITE;
+/*!40000 ALTER TABLE `כדשגכחךלדגכחשךדגחכךלדגכ` DISABLE KEYS */;
+/*!40000 ALTER TABLE `כדשגכחךלדגכחשךדגחכךלדגכ` ENABLE KEYS */;
+UNLOCK TABLES;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,MYSQL323' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+DROP TABLE `כדשגכחךלדגכחשךדגחכךלדגכ`;
+SET NAMES latin1;
#
# End of 5.0 tests
#
@@ -3850,13 +3983,13 @@ INSERT INTO t1 VALUES (3,4), (4,5);
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -3945,12 +4078,12 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqldump_test_db` /*!40100 DEFAULT CH
USE `mysqldump_test_db`;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -4047,12 +4180,12 @@ create database `test-database`;
use `test-database`;
create table test (a int);
DROP TABLE IF EXISTS `test`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `test` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `test` WRITE;
/*!40000 ALTER TABLE `test` DISABLE KEYS */;
/*!40000 ALTER TABLE `test` ENABLE KEYS */;
diff --git a/mysql-test/r/mysqltest.result b/mysql-test/r/mysqltest.result
index 1a65f90bd65..a9c20e34517 100644
--- a/mysql-test/r/mysqltest.result
+++ b/mysql-test/r/mysqltest.result
@@ -215,7 +215,6 @@ source database
"MySQL: The world's most popular ;open source database"
echo message echo message
-mysqltest: At line 1: command "false" failed
mysqltest: At line 1: Missing argument in exec
MySQL
"MySQL"
@@ -383,7 +382,6 @@ mysqltest: At line 1: The argument to dec must be a variable (start with $)
mysqltest: At line 1: End of line junk detected: "1000"
mysqltest: At line 1: Missing arguments to system, nothing to do!
mysqltest: At line 1: Missing arguments to system, nothing to do!
-mysqltest: At line 1: system command 'false' failed
system command 'NonExistsinfComamdn 2> /dev/null' failed
test
test2
@@ -745,10 +743,12 @@ select 1;
-- a comment for the server;
mysqltest: At line 1: Found line beginning with -- that didn't contain a valid mysqltest command, check your syntax or use # if you intended to write a comment
con1
+con2
default
con1
-default
-con1
+con2
con1
+con2
+con2
-closed_connection-
End of tests
diff --git a/mysql-test/r/openssl_1.result b/mysql-test/r/openssl_1.result
index cab1f7a0755..c408c14b716 100644
--- a/mysql-test/r/openssl_1.result
+++ b/mysql-test/r/openssl_1.result
@@ -98,12 +98,12 @@ INSERT INTO t1 VALUES (1), (2);
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
);
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -132,12 +132,12 @@ UNLOCK TABLES;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
);
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
@@ -166,12 +166,12 @@ UNLOCK TABLES;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `t1`;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
);
-SET character_set_client = @saved_cs_client;
+/*!40101 SET character_set_client = @saved_cs_client */;
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
diff --git a/mysql-test/r/partition.result b/mysql-test/r/partition.result
index cec4e60d139..c5733e33569 100644
--- a/mysql-test/r/partition.result
+++ b/mysql-test/r/partition.result
@@ -1,5 +1,9 @@
SET @old_general_log= @@global.general_log;
drop table if exists t1, t2;
+CREATE TABLE t1 (a INT, FOREIGN KEY (a) REFERENCES t0 (a))
+ENGINE=MyISAM
+PARTITION BY HASH (a);
+ERROR HY000: Foreign key clause is not yet supported in conjunction with partitioning
CREATE TABLE t1 (
pk INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (pk)
diff --git a/mysql-test/r/partition_error.result b/mysql-test/r/partition_error.result
index 547ce1ca316..511806d64bd 100644
--- a/mysql-test/r/partition_error.result
+++ b/mysql-test/r/partition_error.result
@@ -1,4 +1,13 @@
drop table if exists t1;
+CREATE TABLE t1 (a INTEGER NOT NULL, PRIMARY KEY (a));
+INSERT INTO t1 VALUES (1),(1);
+ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
+DROP TABLE t1;
+CREATE TABLE t1 (a INTEGER NOT NULL, PRIMARY KEY (a))
+PARTITION BY KEY (a) PARTITIONS 2;
+INSERT INTO t1 VALUES (1),(1);
+ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
+DROP TABLE t1;
CREATE TABLE t1 (a INT)
PARTITION BY HASH (a)
( PARTITION p0 ENGINE=MyISAM,
diff --git a/mysql-test/r/partition_mgm_err.result b/mysql-test/r/partition_mgm_err.result
index db89c6ef6e7..f8403988f47 100644
--- a/mysql-test/r/partition_mgm_err.result
+++ b/mysql-test/r/partition_mgm_err.result
@@ -25,13 +25,13 @@ ALTER TABLE t1 DROP PARTITION x10, x1, x2, x3;
ERROR HY000: Error in list of partitions to DROP
ALTER TABLE t1 REORGANIZE PARTITION x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 INTO
(PARTITION x11 VALUES LESS THAN (22));
-ERROR HY000: More partitions to reorganise than there are partitions
+ERROR HY000: More partitions to reorganize than there are partitions
ALTER TABLE t1 REORGANIZE PARTITION x0,x1,x2 INTO
(PARTITION x3 VALUES LESS THAN (6));
ERROR HY000: Duplicate partition name x3
ALTER TABLE t1 REORGANIZE PARTITION x0, x2 INTO
(PARTITION x11 VALUES LESS THAN (2));
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE t1 REORGANIZE PARTITION x0, x1, x1 INTO
(PARTITION x11 VALUES LESS THAN (4));
ERROR HY000: Error in list of partitions to REORGANIZE
diff --git a/mysql-test/r/preload.result b/mysql-test/r/preload.result
index 24a6e594a14..7ed0c62f33a 100644
--- a/mysql-test/r/preload.result
+++ b/mysql-test/r/preload.result
@@ -144,7 +144,7 @@ Key_reads 0
load index into cache t3, t2 key (primary,b) ;
Table Op Msg_type Msg_text
test.t3 preload_keys Error Table 'test.t3' doesn't exist
-test.t3 preload_keys error Corrupt
+test.t3 preload_keys status Operation failed
test.t2 preload_keys status OK
show status like "key_read%";
Variable_name Value
@@ -159,7 +159,7 @@ Key_reads 0
load index into cache t3 key (b), t2 key (c) ;
Table Op Msg_type Msg_text
test.t3 preload_keys Error Table 'test.t3' doesn't exist
-test.t3 preload_keys error Corrupt
+test.t3 preload_keys status Operation failed
test.t2 preload_keys Error Key 'c' doesn't exist in table 't2'
test.t2 preload_keys status Operation failed
show status like "key_read%";
diff --git a/mysql-test/r/ps.result b/mysql-test/r/ps.result
index 05b2d18889b..1f8a077af40 100644
--- a/mysql-test/r/ps.result
+++ b/mysql-test/r/ps.result
@@ -235,7 +235,7 @@ execute stmt1;
prepare stmt1 from "insert into t1 select i from t1";
execute stmt1;
execute stmt1;
-prepare stmt1 from "select * from t1 into outfile 'f1.txt'";
+prepare stmt1 from "select * from t1 into outfile '<MYSQLTEST_VARDIR>/tmp/f1.txt'";
execute stmt1;
deallocate prepare stmt1;
drop table t1;
@@ -803,6 +803,8 @@ select @@max_prepared_stmt_count;
@@max_prepared_stmt_count
16382
set global max_prepared_stmt_count=-1;
+Warnings:
+Warning 1292 Truncated incorrect max_prepared_stmt_count value: '-1'
select @@max_prepared_stmt_count;
@@max_prepared_stmt_count
0
@@ -1394,13 +1396,13 @@ execute stmt;
Table Op Msg_type Msg_text
test.t1 repair status OK
test.t4 repair Error Table 'test.t4' doesn't exist
-test.t4 repair error Corrupt
+test.t4 repair status Operation failed
test.t3 repair status OK
execute stmt;
Table Op Msg_type Msg_text
test.t1 repair status OK
test.t4 repair Error Table 'test.t4' doesn't exist
-test.t4 repair error Corrupt
+test.t4 repair status Operation failed
test.t3 repair status OK
prepare stmt from "optimize table t1, t3, t4";
execute stmt;
@@ -1408,23 +1410,23 @@ Table Op Msg_type Msg_text
test.t1 optimize status OK
test.t3 optimize status OK
test.t4 optimize Error Table 'test.t4' doesn't exist
-test.t4 optimize error Corrupt
+test.t4 optimize status Operation failed
execute stmt;
Table Op Msg_type Msg_text
test.t1 optimize status Table is already up to date
test.t3 optimize status Table is already up to date
test.t4 optimize Error Table 'test.t4' doesn't exist
-test.t4 optimize error Corrupt
+test.t4 optimize status Operation failed
prepare stmt from "analyze table t4, t1";
execute stmt;
Table Op Msg_type Msg_text
test.t4 analyze Error Table 'test.t4' doesn't exist
-test.t4 analyze error Corrupt
+test.t4 analyze status Operation failed
test.t1 analyze status Table is already up to date
execute stmt;
Table Op Msg_type Msg_text
test.t4 analyze Error Table 'test.t4' doesn't exist
-test.t4 analyze error Corrupt
+test.t4 analyze status Operation failed
test.t1 analyze status Table is already up to date
deallocate prepare stmt;
drop table t1, t2, t3;
diff --git a/mysql-test/r/read_only.result b/mysql-test/r/read_only.result
index 558e0356c5a..7b28da5a577 100644
--- a/mysql-test/r/read_only.result
+++ b/mysql-test/r/read_only.result
@@ -128,7 +128,7 @@ set global read_only=0;
drop table t1,t2;
drop user test@localhost;
#
-# Bug #27440 read_only allows create and drop database
+# Bug#27440 read_only allows create and drop database
#
set global read_only= 1;
drop database if exists mysqltest_db1;
diff --git a/mysql-test/r/repair.result b/mysql-test/r/repair.result
index 609733b2b02..0cb2dff6f64 100644
--- a/mysql-test/r/repair.result
+++ b/mysql-test/r/repair.result
@@ -27,7 +27,7 @@ drop table t1;
repair table t1 use_frm;
Table Op Msg_type Msg_text
test.t1 repair Error Table 'test.t1' doesn't exist
-test.t1 repair error Corrupt
+test.t1 repair status Operation failed
create table t1 engine=myisam SELECT 1,"table 1";
flush tables;
repair table t1;
diff --git a/mysql-test/r/select.result b/mysql-test/r/select.result
index 621c11906cb..0771c7fb370 100644
--- a/mysql-test/r/select.result
+++ b/mysql-test/r/select.result
@@ -4416,4 +4416,32 @@ date_nokey
Warnings:
Warning 1292 Incorrect date value: '10:41:7' for column 'date_nokey' at row 1
DROP TABLE A,C;
+CREATE TABLE t1 (a INT NOT NULL, b INT);
+INSERT INTO t1 VALUES (1, 1);
+EXPLAIN EXTENDED SELECT * FROM t1 WHERE (a=a AND a=a) OR b > 2;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t1 system NULL NULL NULL NULL 1 100.00
+Warnings:
+Note 1003 select '1' AS `a`,'1' AS `b` from `test`.`t1` where 1
+SELECT * FROM t1 WHERE (a=a AND a=a) OR b > 2;
+a b
+1 1
+DROP TABLE t1;
+CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL, c INT NOT NULL);
+EXPLAIN EXTENDED SELECT * FROM t1 WHERE (a=a AND b=b AND c=c) OR b > 20;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t1 system NULL NULL NULL NULL 0 0.00 const row not found
+Warnings:
+Note 1003 select '0' AS `a`,'0' AS `b`,'0' AS `c` from `test`.`t1` where 1
+EXPLAIN EXTENDED SELECT * FROM t1 WHERE (a=a AND a=a AND b=b) OR b > 20;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t1 system NULL NULL NULL NULL 0 0.00 const row not found
+Warnings:
+Note 1003 select '0' AS `a`,'0' AS `b`,'0' AS `c` from `test`.`t1` where 1
+EXPLAIN EXTENDED SELECT * FROM t1 WHERE (a=a AND b=b AND a=a) OR b > 20;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t1 system NULL NULL NULL NULL 0 0.00 const row not found
+Warnings:
+Note 1003 select '0' AS `a`,'0' AS `b`,'0' AS `c` from `test`.`t1` where 1
+DROP TABLE t1;
End of 5.1 tests
diff --git a/mysql-test/r/show_check.result b/mysql-test/r/show_check.result
index c8ea9d79a13..e6550bee954 100644
--- a/mysql-test/r/show_check.result
+++ b/mysql-test/r/show_check.result
@@ -545,9 +545,9 @@ mysqltest CREATE DATABASE `mysqltest` /*!40100 DEFAULT CHARACTER SET latin1 */
drop table mysqltest.t1;
drop database mysqltest;
set names binary;
-delete from mysql.user
+delete from mysql.user
where user='mysqltest_1' || user='mysqltest_2' || user='mysqltest_3';
-delete from mysql.db
+delete from mysql.db
where user='mysqltest_1' || user='mysqltest_2' || user='mysqltest_3';
flush privileges;
CREATE TABLE t1 (i int, KEY (i)) ENGINE=MEMORY;
@@ -664,7 +664,7 @@ show create table t1;
ERROR HY000: Incorrect information in file: './test/t1.frm'
drop table if exists t1;
-# Bug#12183: SHOW OPEN TABLES behavior doesn't match grammar.
+# Bug#12183 SHOW OPEN TABLES behavior doesn't match grammar.
DROP DATABASE IF EXISTS mysqltest1;
CREATE DATABASE mysqltest1;
@@ -784,7 +784,7 @@ show status like 'slow_queries';
Variable_name Value
Slow_queries 1
create table t1 (a int);
-create trigger tr1 before insert on t1 for each row
+create trigger tr1 before insert on t1 for each row
begin
end;
create view v1 as select a from t1;
@@ -1010,7 +1010,7 @@ def TRIGGERS DATABASE_COLLATION Database Collation 253 96 17 N 1 0 33
Trigger Event Table Statement Timing Created sql_mode Definer character_set_client collation_connection Database Collation
t1_bi INSERT t1 SET @a = 1 BEFORE NULL root@localhost binary binary latin1_swedish_ci
----------------------------------------------------------------
-SELECT
+SELECT
TRIGGER_CATALOG,
TRIGGER_SCHEMA,
TRIGGER_NAME,
@@ -1198,7 +1198,7 @@ CREATE DATABASE mysqltest1;
use mysqltest1;
CREATE TABLE t1(ËÏÌÏÎËÁ1 INT);
----> Dumping mysqltest1 to show_check.mysqltest1.sql
+---> Dumping mysqltest1 to outfile1
DROP DATABASE mysqltest1;
diff --git a/mysql-test/r/skip_name_resolve.result b/mysql-test/r/skip_name_resolve.result
index 8ef52e75238..8aa9877a8e9 100644
--- a/mysql-test/r/skip_name_resolve.result
+++ b/mysql-test/r/skip_name_resolve.result
@@ -5,10 +5,7 @@ GRANT USAGE ON *.* TO 'mysqltest_1'@'127.0.0.1/255.255.255.255'
GRANT ALL PRIVILEGES ON `test`.* TO 'mysqltest_1'@'127.0.0.1/255.255.255.255'
REVOKE ALL ON test.* FROM mysqltest_1@'127.0.0.1/255.255.255.255';
DROP USER mysqltest_1@'127.0.0.1/255.255.255.255';
-select user();
-user()
+SELECT USER();
+USER()
#
-show processlist;
-Id User Host db Command Time State Info
-<id> root <host> test <command> <time> <state> <info>
-<id> root <host> test <command> <time> <state> <info>
+SHOW PROCESSLIST;
diff --git a/mysql-test/r/sp-security.result b/mysql-test/r/sp-security.result
index 66177395ac9..65c94577a57 100644
--- a/mysql-test/r/sp-security.result
+++ b/mysql-test/r/sp-security.result
@@ -342,12 +342,12 @@ GRANT SUPER ON *.* TO mysqltest_2@localhost;
GRANT ALL PRIVILEGES ON mysqltest.* TO mysqltest_2@localhost;
---> connection: mysqltest_2_con
-use mysqltest;
+USE mysqltest;
CREATE PROCEDURE wl2897_p1() SELECT 1;
CREATE FUNCTION wl2897_f1() RETURNS INT RETURN 1;
---> connection: mysqltest_1_con
-use mysqltest;
+USE mysqltest;
CREATE DEFINER=root@localhost PROCEDURE wl2897_p2() SELECT 2;
ERROR 42000: Access denied; you need the SUPER privilege for this operation
CREATE DEFINER=root@localhost FUNCTION wl2897_f2() RETURNS INT RETURN 2;
@@ -363,7 +363,7 @@ Warnings:
Note 1449 The user specified as a definer ('a @ b @ c'@'localhost') does not exist
---> connection: con1root
-use mysqltest;
+USE mysqltest;
SHOW CREATE PROCEDURE wl2897_p1;
Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation
wl2897_p1 CREATE DEFINER=`mysqltest_2`@`localhost` PROCEDURE `wl2897_p1`()
@@ -393,7 +393,7 @@ CREATE USER mysqltest_2@localhost;
GRANT ALL PRIVILEGES ON mysqltest.* TO mysqltest_2@localhost;
---> connection: mysqltest_1_con
-use mysqltest;
+USE mysqltest;
CREATE PROCEDURE bug13198_p1()
SELECT 1;
CREATE FUNCTION bug13198_f1() RETURNS INT
@@ -406,7 +406,7 @@ bug13198_f1()
1
---> connection: mysqltest_2_con
-use mysqltest;
+USE mysqltest;
CALL bug13198_p1();
1
1
@@ -418,7 +418,7 @@ bug13198_f1()
DROP USER mysqltest_1@localhost;
---> connection: mysqltest_2_con
-use mysqltest;
+USE mysqltest;
CALL bug13198_p1();
ERROR HY000: The user specified as a definer ('mysqltest_1'@'localhost') does not exist
SELECT bug13198_f1();
@@ -435,7 +435,7 @@ Host User Password
localhost user19857 *82DC221D557298F6CE9961037DB1C90604792F5C
---> connection: mysqltest_2_con
-use test;
+USE test;
CREATE PROCEDURE sp19857() DETERMINISTIC
BEGIN
DECLARE a INT;
diff --git a/mysql-test/r/strict.result b/mysql-test/r/strict.result
index 1255284f4fe..241f4198bf7 100644
--- a/mysql-test/r/strict.result
+++ b/mysql-test/r/strict.result
@@ -1305,7 +1305,7 @@ set @@sql_mode='traditional';
create table t1 (i int)
comment '123456789*123456789*123456789*123456789*123456789*
123456789*123456789*123456789*123456789*123456789*';
-ERROR HY000: Too long comment for table 't1'
+ERROR HY000: Comment for table 't1' is too long (max = 60)
create table t1 (
i int comment
'123456789*123456789*123456789*123456789*
@@ -1315,7 +1315,7 @@ i int comment
123456789*123456789*123456789*123456789*
123456789*123456789*123456789*123456789*
123456789*123456789*123456789*123456789*');
-ERROR HY000: Too long comment for field 'i'
+ERROR HY000: Comment for field 'i' is too long (max = 255)
set @@sql_mode= @org_mode;
create table t1
(i int comment
@@ -1327,7 +1327,7 @@ create table t1
123456789*123456789*123456789*123456789*
123456789*123456789*123456789*123456789*');
Warnings:
-Warning 1105 Unknown error
+Warning 1629 Comment for field 'i' is too long (max = 255)
select column_name, column_comment from information_schema.columns where
table_schema = 'test' and table_name = 't1';
column_name column_comment
diff --git a/mysql-test/r/system_mysql_db.result b/mysql-test/r/system_mysql_db.result
index 0106c9459e7..e252331cd1a 100644
--- a/mysql-test/r/system_mysql_db.result
+++ b/mysql-test/r/system_mysql_db.result
@@ -227,7 +227,7 @@ event CREATE TABLE `event` (
`on_completion` enum('DROP','PRESERVE') NOT NULL DEFAULT 'DROP',
`sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') NOT NULL DEFAULT '',
`comment` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
- `originator` int(10) NOT NULL,
+ `originator` int(10) unsigned NOT NULL,
`time_zone` char(64) CHARACTER SET latin1 NOT NULL DEFAULT 'SYSTEM',
`character_set_client` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`collation_connection` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
@@ -241,7 +241,7 @@ general_log CREATE TABLE `general_log` (
`event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`thread_id` int(11) NOT NULL,
- `server_id` int(11) NOT NULL,
+ `server_id` int(10) unsigned NOT NULL,
`command_type` varchar(64) NOT NULL,
`argument` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'
@@ -257,7 +257,7 @@ slow_log CREATE TABLE `slow_log` (
`db` varchar(512) NOT NULL,
`last_insert_id` int(11) NOT NULL,
`insert_id` int(11) NOT NULL,
- `server_id` int(11) NOT NULL,
+ `server_id` int(10) unsigned NOT NULL,
`sql_text` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
show tables;
diff --git a/mysql-test/r/trigger-compat.result b/mysql-test/r/trigger-compat.result
index 1609707fb09..2bcd919e0db 100644
--- a/mysql-test/r/trigger-compat.result
+++ b/mysql-test/r/trigger-compat.result
@@ -12,9 +12,7 @@ GRANT CREATE, TRIGGER ON mysqltest_db1.* TO mysqltest_dfn@localhost;
---> connection: wl2818_definer_con
CREATE TABLE t1(num_value INT);
CREATE TABLE t2(user_str TEXT);
-CREATE TRIGGER wl2818_trg1 BEFORE INSERT ON t1
-FOR EACH ROW
-INSERT INTO t2 VALUES(CURRENT_USER());
+CREATE TRIGGER wl2818_trg1 BEFORE INSERT ON t1 FOR EACH ROW INSERT INTO t2 VALUES(CURRENT_USER());
---> patching t1.TRG...
diff --git a/mysql-test/r/variables.result b/mysql-test/r/variables.result
index d3b3a6f2663..f27d0b9fdd5 100644
--- a/mysql-test/r/variables.result
+++ b/mysql-test/r/variables.result
@@ -27,6 +27,7 @@ set @my_slow_launch_time =@@global.slow_launch_time;
set @my_storage_engine =@@global.storage_engine;
set @my_thread_cache_size =@@global.thread_cache_size;
set @my_max_allowed_packet =@@global.max_allowed_packet;
+set @my_join_buffer_size =@@global.join_buffer_size;
set @`test`=1;
select @test, @`test`, @TEST, @`TEST`, @"teSt";
@test @`test` @TEST @`TEST` @"teSt"
@@ -299,59 +300,107 @@ set @@rand_seed1=10000000,@@rand_seed2=1000000;
select ROUND(RAND(),5);
ROUND(RAND(),5)
0.02887
-show variables like '%alloc%';
+
+==+ Testing %alloc% system variables +==
+==+ NOTE: These values *must* be a multiple of 1024 +==
+==+ Other values will be rounded down to nearest multiple +==
+
+==+ Show initial values +==
+SHOW VARIABLES WHERE variable_name IN ('range_alloc_block_size',
+'query_alloc_block_size', 'query_prealloc_size',
+'transaction_alloc_block_size', 'transaction_prealloc_size');
Variable_name Value
query_alloc_block_size 8192
query_prealloc_size 8192
range_alloc_block_size 4096
transaction_alloc_block_size 8192
transaction_prealloc_size 4096
-select * from information_schema.session_variables where variable_name like '%alloc%' order by 1;
+==+ information_schema data +==
+SELECT * FROM information_schema.session_variables
+WHERE variable_name IN ('range_alloc_block_size',
+'query_alloc_block_size', 'query_prealloc_size',
+'transaction_alloc_block_size', 'transaction_prealloc_size') ORDER BY 1;
VARIABLE_NAME VARIABLE_VALUE
QUERY_ALLOC_BLOCK_SIZE 8192
QUERY_PREALLOC_SIZE 8192
RANGE_ALLOC_BLOCK_SIZE 4096
TRANSACTION_ALLOC_BLOCK_SIZE 8192
TRANSACTION_PREALLOC_SIZE 4096
-set @@range_alloc_block_size=1024*16;
+Testing values that are multiples of 1024
+set @@range_alloc_block_size=1024*15+1024;
+set @@query_alloc_block_size=1024*15+1024*2;
+set @@query_prealloc_size=1024*18-1024;
+set @@transaction_alloc_block_size=1024*21-1024*1;
+set @@transaction_prealloc_size=1024*21-2048;
+==+ Check manipulated values ==+
+select @@query_alloc_block_size;
+@@query_alloc_block_size
+17408
+SHOW VARIABLES WHERE variable_name IN ('range_alloc_block_size',
+'query_alloc_block_size', 'query_prealloc_size',
+'transaction_alloc_block_size', 'transaction_prealloc_size');
+Variable_name Value
+query_alloc_block_size 17408
+query_prealloc_size 17408
+range_alloc_block_size 16384
+transaction_alloc_block_size 20480
+transaction_prealloc_size 19456
+==+ information_schema data +==
+SELECT * FROM information_schema.session_variables
+WHERE variable_name IN ('range_alloc_block_size',
+'query_alloc_block_size', 'query_prealloc_size',
+'transaction_alloc_block_size', 'transaction_prealloc_size') ORDER BY 1;
+VARIABLE_NAME VARIABLE_VALUE
+QUERY_ALLOC_BLOCK_SIZE 17408
+QUERY_PREALLOC_SIZE 17408
+RANGE_ALLOC_BLOCK_SIZE 16384
+TRANSACTION_ALLOC_BLOCK_SIZE 20480
+TRANSACTION_PREALLOC_SIZE 19456
+==+ Manipulate variable values +==
+Testing values that are not 1024 multiples
+set @@range_alloc_block_size=1024*16+1023;
set @@query_alloc_block_size=1024*17+2;
-set @@query_prealloc_size=1024*18;
+set @@query_prealloc_size=1024*18-1023;
set @@transaction_alloc_block_size=1024*20-1;
set @@transaction_prealloc_size=1024*21-1;
select @@query_alloc_block_size;
@@query_alloc_block_size
17408
-show variables like '%alloc%';
+==+ Check manipulated values ==+
+SHOW VARIABLES WHERE variable_name IN ('range_alloc_block_size',
+'query_alloc_block_size', 'query_prealloc_size',
+'transaction_alloc_block_size', 'transaction_prealloc_size');
Variable_name Value
query_alloc_block_size 17408
-query_prealloc_size 18432
+query_prealloc_size 17408
range_alloc_block_size 16384
transaction_alloc_block_size 19456
transaction_prealloc_size 20480
-select * from information_schema.session_variables where variable_name like '%alloc%' order by 1;
+==+ information_schema data +==
+SELECT * FROM information_schema.session_variables
+WHERE variable_name IN ('range_alloc_block_size',
+'query_alloc_block_size', 'query_prealloc_size',
+'transaction_alloc_block_size', 'transaction_prealloc_size') ORDER BY 1;
VARIABLE_NAME VARIABLE_VALUE
QUERY_ALLOC_BLOCK_SIZE 17408
-QUERY_PREALLOC_SIZE 18432
+QUERY_PREALLOC_SIZE 17408
RANGE_ALLOC_BLOCK_SIZE 16384
TRANSACTION_ALLOC_BLOCK_SIZE 19456
TRANSACTION_PREALLOC_SIZE 20480
+==+ Set values back to the default values +==
set @@range_alloc_block_size=default;
set @@query_alloc_block_size=default, @@query_prealloc_size=default;
set transaction_alloc_block_size=default, @@transaction_prealloc_size=default;
-show variables like '%alloc%';
+==+ Check the values now that they are reset +==
+SHOW VARIABLES WHERE variable_name IN ('range_alloc_block_size',
+'query_alloc_block_size', 'query_prealloc_size',
+'transaction_alloc_block_size', 'transaction_prealloc_size');
Variable_name Value
query_alloc_block_size 8192
query_prealloc_size 8192
range_alloc_block_size 4096
transaction_alloc_block_size 8192
transaction_prealloc_size 4096
-select * from information_schema.session_variables where variable_name like '%alloc%' order by 1;
-VARIABLE_NAME VARIABLE_VALUE
-QUERY_ALLOC_BLOCK_SIZE 8192
-QUERY_PREALLOC_SIZE 8192
-RANGE_ALLOC_BLOCK_SIZE 4096
-TRANSACTION_ALLOC_BLOCK_SIZE 8192
-TRANSACTION_PREALLOC_SIZE 4096
SELECT @@version LIKE 'non-existent';
@@version LIKE 'non-existent'
0
@@ -705,7 +754,7 @@ VARIABLE_NAME VARIABLE_VALUE
MYISAM_DATA_POINTER_SIZE 7
SET GLOBAL table_open_cache=-1;
Warnings:
-Warning 1292 Truncated incorrect table_open_cache value: '0'
+Warning 1292 Truncated incorrect table_open_cache value: '-1'
SHOW VARIABLES LIKE 'table_open_cache';
Variable_name Value
table_open_cache 1
@@ -970,6 +1019,11 @@ show variables like 'hostname';
Variable_name Value
hostname #
End of 5.0 tests
+set join_buffer_size=1;
+Warnings:
+Warning 1292 Truncated incorrect join_buffer_size value: '1'
+set @save_join_buffer_size=@@join_buffer_size;
+set join_buffer_size=@save_join_buffer_size;
set global binlog_cache_size =@my_binlog_cache_size;
set global connect_timeout =@my_connect_timeout;
set global delayed_insert_timeout =@my_delayed_insert_timeout;
@@ -1000,6 +1054,7 @@ set global slow_launch_time =@my_slow_launch_time;
set global storage_engine =@my_storage_engine;
set global thread_cache_size =@my_thread_cache_size;
set global max_allowed_packet =@my_max_allowed_packet;
+set global join_buffer_size =@my_join_buffer_size;
show global variables where Variable_name='table_definition_cache' or
Variable_name='table_lock_wait_timeout';
Variable_name Value
@@ -1341,3 +1396,75 @@ SET @@session.thread_stack= 7;
ERROR HY000: Variable 'thread_stack' is a read only variable
SET @@global.thread_stack= 7;
ERROR HY000: Variable 'thread_stack' is a read only variable
+SELECT @@global.expire_logs_days INTO @old_eld;
+SET GLOBAL expire_logs_days = -1;
+Warnings:
+Warning 1292 Truncated incorrect expire_logs_days value: '-1'
+needs to've been adjusted (0)
+SELECT @@global.expire_logs_days;
+@@global.expire_logs_days
+0
+SET GLOBAL expire_logs_days = 11;
+SET @old_mode=@@sql_mode;
+SET SESSION sql_mode = 'TRADITIONAL';
+SET GLOBAL expire_logs_days = 100;
+ERROR 42000: Variable 'expire_logs_days' can't be set to the value of '100'
+needs to be unchanged (11)
+SELECT @@global.expire_logs_days;
+@@global.expire_logs_days
+11
+SET SESSION sql_mode = @old_mode;
+SET GLOBAL expire_logs_days = 100;
+Warnings:
+Warning 1292 Truncated incorrect expire_logs_days value: '100'
+needs to've been adjusted (99)
+SELECT @@global.expire_logs_days;
+@@global.expire_logs_days
+99
+SET GLOBAL expire_logs_days = 11;
+SET GLOBAL expire_logs_days = 99;
+needs to pass with no warnings (99)
+SELECT @@global.expire_logs_days;
+@@global.expire_logs_days
+99
+SET GLOBAL expire_logs_days = @old_eld;
+SET GLOBAL auto_increment_offset=-1;
+Warnings:
+Warning 1292 Truncated incorrect auto_increment_offset value: '-1'
+SET GLOBAL auto_increment_offset=0;
+Warnings:
+Warning 1292 Truncated incorrect auto_increment_offset value: '0'
+select @@storage_engine;
+Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
+def @@storage_engine 253 6 6 N 1 31 8
+@@storage_engine
+MyISAM
+SET @old_server_id = @@GLOBAL.server_id;
+SET GLOBAL server_id = (1 << 32) - 1;
+SELECT @@GLOBAL.server_id;
+@@GLOBAL.server_id
+4294967295
+SET GLOBAL server_id = (1 << 32);
+Warnings:
+Warning 1292 Truncated incorrect server_id value: '4294967296'
+SELECT @@GLOBAL.server_id;
+@@GLOBAL.server_id
+4294967295
+SET GLOBAL server_id = (1 << 60);
+Warnings:
+Warning 1292 Truncated incorrect server_id value: '1152921504606846976'
+SELECT @@GLOBAL.server_id;
+@@GLOBAL.server_id
+4294967295
+SET GLOBAL server_id = 0;
+SELECT @@GLOBAL.server_id;
+@@GLOBAL.server_id
+0
+SET GLOBAL server_id = -1;
+Warnings:
+Warning 1292 Truncated incorrect server_id value: '-1'
+SELECT @@GLOBAL.server_id;
+@@GLOBAL.server_id
+0
+SET GLOBAL server_id = @old_server_id;
+End of 5.1 tests
diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result
index 38d05ae84fe..0905fc0109b 100644
--- a/mysql-test/r/view.result
+++ b/mysql-test/r/view.result
@@ -1673,9 +1673,9 @@ INSERT INTO t2 VALUES (4,3,'n');
INSERT INTO t2 VALUES (6,1,'n');
INSERT INTO t2 VALUES (8,1,'y');
CREATE VIEW v1 AS SELECT * FROM t1;
-SELECT a.col1,a.col2,b.col2,b.col3
+SELECT a.col1,a.col2,b.col2,b.col3
FROM t1 a LEFT JOIN t2 b ON a.col1=b.col1
-WHERE b.col2 IS NULL OR
+WHERE b.col2 IS NULL OR
b.col2=(SELECT MAX(col2) FROM t2 b WHERE b.col1=a.col1);
col1 col2 col2 col3
1 trudy 2 y
@@ -1687,9 +1687,9 @@ col1 col2 col2 col3
7 carsten NULL NULL
8 ranger 1 y
10 matt NULL NULL
-SELECT a.col1,a.col2,b.col2,b.col3
+SELECT a.col1,a.col2,b.col2,b.col3
FROM v1 a LEFT JOIN t2 b ON a.col1=b.col1
-WHERE b.col2 IS NULL OR
+WHERE b.col2 IS NULL OR
b.col2=(SELECT MAX(col2) FROM t2 b WHERE b.col1=a.col1);
col1 col2 col2 col3
1 trudy 2 y
@@ -1743,7 +1743,7 @@ A A
2 2
3 3
create table t3 as select a a,a b from t2;
-create view v2 as select * from t3 where
+create view v2 as select * from t3 where
a in (select * from t1) or b in (select * from t2);
select * from v2 A, v2 B where A.a = B.b;
a b a b
@@ -1999,7 +1999,7 @@ dkjhgd
drop view v1;
create table t1 (f59 int, f60 int, f61 int);
insert into t1 values (19,41,32);
-create view v1 as select f59, f60 from t1 where f59 in
+create view v1 as select f59, f60 from t1 where f59 in
(select f59 from t1);
update v1 set f60=2345;
ERROR HY000: The target table v1 of the UPDATE is not updatable
@@ -2115,7 +2115,7 @@ pid int NOT NULL
INSERT INTO t1 VALUES(1,'a','b'), (2,'c','d');
INSERT INTO t2 values (1,1), (2,1), (2,2);
CREATE VIEW v1 AS SELECT t1.*,t2.pid FROM t1,t2 WHERE t1.aid = t2.aid;
-SELECT pid,GROUP_CONCAT(CONCAT(fn,' ',ln) ORDER BY 1) FROM t1,t2
+SELECT pid,GROUP_CONCAT(CONCAT(fn,' ',ln) ORDER BY 1) FROM t1,t2
WHERE t1.aid = t2.aid GROUP BY pid;
pid GROUP_CONCAT(CONCAT(fn,' ',ln) ORDER BY 1)
1 a b,c d
@@ -2217,7 +2217,7 @@ group_name varchar(32) NOT NULL
) engine = InnoDB;
create table t2 (
r_object_id char(16) NOT NULL,
-i_position int(11) NOT NULL,
+i_position int(11) NOT NULL,
users_names varchar(32) default NULL
) Engine = InnoDB;
create view v1 as select r_object_id, group_name from t1;
@@ -2230,7 +2230,7 @@ insert into t1 values('120001a080000542','tstgroup1');
insert into t2 values('120001a080000542',-1, 'guser01');
insert into t2 values('120001a080000542',-2, 'guser02');
select v1.r_object_id, v2.users_names from v1, v2
-where (v1.group_name='tstgroup1') and v2.r_object_id=v1.r_object_id
+where (v1.group_name='tstgroup1') and v2.r_object_id=v1.r_object_id
order by users_names;
r_object_id users_names
120001a080000542 guser01
@@ -2380,8 +2380,8 @@ create table t4 (x int, y int, z int);
create view v1 as
select t1.x
from (
-(t1 join t2 on ((t1.y = t2.y)))
-join
+(t1 join t2 on ((t1.y = t2.y)))
+join
(t3 left join t4 on (t3.y = t4.y) and (t3.z = t4.z))
);
prepare stmt1 from "select count(*) from v1 where x = ?";
@@ -2557,12 +2557,12 @@ Warnings:
Warning 1052 Column 'x' in group statement is ambiguous
DROP VIEW v1;
DROP TABLE t1;
-drop table if exists t1;
-drop view if exists v1;
-create table t1 (id int);
-create view v1 as select * from t1;
-drop table t1;
-show create view v1;
+drop table if exists t1;
+drop view if exists v1;
+create table t1 (id int);
+create view v1 as select * from t1;
+drop table t1;
+show create view v1;
drop view v1;
//
View Create View character_set_client collation_connection
@@ -2609,7 +2609,7 @@ DROP VIEW v2;
DROP TABLE t1, t2;
CREATE TABLE t1 (id int NOT NULL PRIMARY KEY,
td date DEFAULT NULL, KEY idx(td));
-INSERT INTO t1 VALUES
+INSERT INTO t1 VALUES
(1, '2005-01-01'), (2, '2005-01-02'), (3, '2005-01-02'),
(4, '2005-01-03'), (5, '2005-01-04'), (6, '2005-01-05'),
(7, '2005-01-05'), (8, '2005-01-05'), (9, '2005-01-06');
@@ -2973,10 +2973,10 @@ drop view v1;
drop table t1;
CREATE TABLE t1(pk int PRIMARY KEY);
CREATE TABLE t2(pk int PRIMARY KEY, fk int, ver int, org int);
-CREATE ALGORITHM=MERGE VIEW v1 AS
+CREATE ALGORITHM=MERGE VIEW v1 AS
SELECT t1.*
-FROM t1 JOIN t2
-ON t2.fk = t1.pk AND
+FROM t1 JOIN t2
+ON t2.fk = t1.pk AND
t2.ver = (SELECT MAX(t.ver) FROM t2 t WHERE t.org = t2.org);
SHOW WARNINGS;
Level Code Message
@@ -3306,7 +3306,7 @@ name char(10) NOT NULL
INSERT INTO t1 (lid, name) VALUES
(1, 'YES'), (2, 'NO');
CREATE TABLE t2 (
-id int NOT NULL PRIMARY KEY,
+id int NOT NULL PRIMARY KEY,
gid int NOT NULL,
lid int NOT NULL,
dt date
@@ -3405,8 +3405,8 @@ CREATE TABLE t1 (id int);
CREATE TABLE t2 (id int, c int DEFAULT 0);
INSERT INTO t1 (id) VALUES (1);
INSERT INTO t2 (id) VALUES (1);
-CREATE VIEW v1 AS
-SELECT t2.c FROM t1, t2
+CREATE VIEW v1 AS
+SELECT t2.c FROM t1, t2
WHERE t1.id=t2.id AND 1 IN (SELECT id FROM t1) WITH CHECK OPTION;
UPDATE v1 SET c=1;
DROP VIEW v1;
@@ -3514,7 +3514,7 @@ role_name varchar(100) default NULL,
app_name varchar(40) NOT NULL,
INDEX idx_app_name(app_name)
);
-CREATE VIEW v1 AS
+CREATE VIEW v1 AS
SELECT profile.person_id AS person_id
FROM t1 profile, t2 userrole, t3 role
WHERE userrole.person_id = profile.person_id AND
@@ -3526,7 +3526,7 @@ INSERT INTO t1 VALUES
(-717462680,'ENTS Ta','0'), (-904346964,'ndard SQL\n','0');
INSERT INTO t2 VALUES
(1,3,6),(2,4,7),(3,5,8),(4,6,9),(5,1,6),(6,1,7),(7,1,8),(8,1,9),(9,1,10);
-INSERT INTO t3 VALUES
+INSERT INTO t3 VALUES
(1,'NUCANS_APP_USER','NUCANSAPP'),(2,'NUCANS_TRGAPP_USER','NUCANSAPP'),
(3,'IA_INTAKE_COORDINATOR','IACANS'),(4,'IA_SCREENER','IACANS'),
(5,'IA_SUPERVISOR','IACANS'),(6,'IA_READONLY','IACANS'),
@@ -3552,7 +3552,7 @@ i
2
3
4
-select table_name, is_updatable from information_schema.views
+select table_name, is_updatable from information_schema.views
where table_name = 'v1';
table_name is_updatable
v1 NO
@@ -3598,8 +3598,8 @@ DROP VIEW v2;
DROP VIEW v3;
DROP TABLE t1;
#
-# Bug#29477: Not all fields of the target table were checked to have
-# a default value when inserting into a view.
+# Bug#29477 Not all fields of the target table were checked to have
+# a default value when inserting into a view.
#
create table t1(f1 int, f2 int not null);
create view v1 as select f1 from t1;
@@ -3616,7 +3616,7 @@ drop table t1;
create table t1 (a int, key(a));
create table t2 (c int);
create view v1 as select a b from t1;
-create view v2 as select 1 a from t2, v1 where c in
+create view v2 as select 1 a from t2, v1 where c in
(select 1 from t1 where b = a);
insert into t1 values (1), (1);
insert into t2 values (1), (1);
@@ -3638,7 +3638,7 @@ MAX(a) COUNT(DISTINCT a)
DROP VIEW v1;
DROP TABLE t1;
# -----------------------------------------------------------------
-# -- Bug#34337: Server crash when Altering a view using a table name.
+# -- Bug#34337 Server crash when Altering a view using a table name.
# -----------------------------------------------------------------
DROP TABLE IF EXISTS t1;
@@ -3655,8 +3655,8 @@ DROP TABLE t1;
# -- End of test case for Bug#34337.
# -----------------------------------------------------------------
-# -- Bug#35193: VIEW query is rewritten without "FROM DUAL",
-# -- causing syntax error
+# -- Bug#35193 VIEW query is rewritten without "FROM DUAL",
+# -- causing syntax error
# -----------------------------------------------------------------
CREATE VIEW v1 AS SELECT 1 FROM DUAL WHERE 1;
@@ -3723,7 +3723,7 @@ DROP DATABASE `d-1`;
USE test;
#
-# Bug#26676: VIEW using old table schema in a session.
+# Bug#26676 VIEW using old table schema in a session.
#
DROP VIEW IF EXISTS v1;
@@ -3765,7 +3765,7 @@ DROP TABLE t1;
# End of test case for Bug#26676.
# -----------------------------------------------------------------
-# -- Bug#32538: View definition picks up character set, but not collation
+# -- Bug#32538 View definition picks up character set, but not collation
# -----------------------------------------------------------------
DROP VIEW IF EXISTS v1;
diff --git a/mysql-test/r/view_grant.result b/mysql-test/r/view_grant.result
index 1821e50e294..7e280fa2fe5 100644
--- a/mysql-test/r/view_grant.result
+++ b/mysql-test/r/view_grant.result
@@ -28,7 +28,7 @@ create view v2 as select * from mysqltest.t2;
ERROR 42000: ANY command denied to user 'mysqltest_1'@'localhost' for table 't2'
show create view v1;
View Create View character_set_client collation_connection
-v1 CREATE ALGORITHM=UNDEFINED DEFINER=`mysqltest_1`@`localhost` SQL SECURITY DEFINER VIEW `test`.`v1` AS select `mysqltest`.`t1`.`a` AS `a`,`mysqltest`.`t1`.`b` AS `b` from `mysqltest`.`t1` latin1 latin1_swedish_ci
+v1 CREATE ALGORITHM=UNDEFINED DEFINER=`mysqltest_1`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `mysqltest`.`t1`.`a` AS `a`,`mysqltest`.`t1`.`b` AS `b` from `mysqltest`.`t1` latin1 latin1_swedish_ci
grant create view,drop,select on test.* to mysqltest_1@localhost;
use test;
alter view v1 as select * from mysqltest.t1;
@@ -309,7 +309,7 @@ grant create view,select on test.* to mysqltest_1@localhost;
create view v1 as select * from mysqltest.t1;
show create view v1;
View Create View character_set_client collation_connection
-v1 CREATE ALGORITHM=UNDEFINED DEFINER=`mysqltest_1`@`localhost` SQL SECURITY DEFINER VIEW `test`.`v1` AS select `mysqltest`.`t1`.`a` AS `a`,`mysqltest`.`t1`.`b` AS `b` from `mysqltest`.`t1` latin1 latin1_swedish_ci
+v1 CREATE ALGORITHM=UNDEFINED DEFINER=`mysqltest_1`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `mysqltest`.`t1`.`a` AS `a`,`mysqltest`.`t1`.`b` AS `b` from `mysqltest`.`t1` latin1 latin1_swedish_ci
revoke select on mysqltest.t1 from mysqltest_1@localhost;
select * from v1;
ERROR HY000: View 'test.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
@@ -646,7 +646,7 @@ CREATE DATABASE test2;
CREATE TABLE test1.t0 (a VARCHAR(20));
CREATE TABLE test2.t1 (a VARCHAR(20));
CREATE VIEW test2.t3 AS SELECT * FROM test1.t0;
-CREATE OR REPLACE VIEW test.v1 AS
+CREATE OR REPLACE VIEW test.v1 AS
SELECT ta.a AS col1, tb.a AS col2 FROM test2.t3 ta, test2.t1 tb;
DROP VIEW test.v1;
DROP VIEW test2.t3;
@@ -790,7 +790,7 @@ v3 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VI
DROP USER u26813@localhost;
DROP DATABASE db26813;
#
-# Bug#29908: A user can gain additional access through the ALTER VIEW.
+# Bug#29908 A user can gain additional access through the ALTER VIEW.
#
CREATE DATABASE mysqltest_29908;
USE mysqltest_29908;
@@ -921,6 +921,32 @@ c4
DROP DATABASE mysqltest1;
DROP DATABASE mysqltest2;
DROP USER mysqltest_u1@localhost;
+CREATE DATABASE db1;
+USE db1;
+CREATE TABLE t1(f1 INT, f2 INT);
+CREATE VIEW v1 AS SELECT f1, f2 FROM t1;
+GRANT SELECT (f1) ON t1 TO foo;
+GRANT SELECT (f1) ON v1 TO foo;
+USE db1;
+SELECT f1 FROM t1;
+f1
+SELECT f2 FROM t1;
+ERROR 42000: SELECT command denied to user 'foo'@'localhost' for column 'f2' in table 't1'
+SELECT * FROM t1;
+ERROR 42000: SELECT command denied to user 'foo'@'localhost' for table 't1'
+SELECT f1 FROM v1;
+f1
+SELECT f2 FROM v1;
+ERROR 42000: SELECT command denied to user 'foo'@'localhost' for column 'f2' in table 'v1'
+SELECT * FROM v1;
+ERROR 42000: SELECT command denied to user 'foo'@'localhost' for table 'v1'
+USE test;
+REVOKE SELECT (f1) ON db1.t1 FROM foo;
+REVOKE SELECT (f1) ON db1.v1 FROM foo;
+DROP USER foo;
+DROP VIEW db1.v1;
+DROP TABLE db1.t1;
+DROP DATABASE db1;
End of 5.0 tests.
DROP VIEW IF EXISTS v1;
DROP TABLE IF EXISTS t1;
@@ -956,6 +982,27 @@ Warnings:
Warning 1356 View 'test.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
DROP VIEW v1;
DROP TABLE t1;
+CREATE USER mysqluser1@localhost;
+CREATE DATABASE mysqltest1;
+USE mysqltest1;
+CREATE TABLE t1 ( a INT );
+CREATE TABLE t2 ( b INT );
+INSERT INTO t1 VALUES (1), (2);
+INSERT INTO t2 VALUES (1), (2);
+GRANT CREATE VIEW ON mysqltest1.* TO mysqluser1@localhost;
+GRANT SELECT ON t1 TO mysqluser1@localhost;
+GRANT INSERT ON t2 TO mysqluser1@localhost;
+This would lead to failed assertion.
+CREATE VIEW v1 AS SELECT a, b FROM t1, t2;
+SELECT * FROM v1;
+ERROR 42000: SELECT command denied to user 'mysqluser1'@'localhost' for table 'v1'
+SELECT b FROM v1;
+ERROR 42000: SELECT command denied to user 'mysqluser1'@'localhost' for table 'v1'
+DROP TABLE t1, t2;
+DROP VIEW v1;
+DROP DATABASE mysqltest1;
+DROP USER mysqluser1@localhost;
+USE test;
End of 5.1 tests.
CREATE USER mysqluser1@localhost;
CREATE DATABASE mysqltest1;
@@ -996,3 +1043,4 @@ DROP VIEW v1, v2;
DROP DATABASE mysqltest1;
DROP VIEW test.v3;
DROP USER mysqluser1@localhost;
+USE test;
diff --git a/mysql-test/std_data/bug32880.ARN b/mysql-test/std_data/bug32880.ARN
new file mode 100644
index 00000000000..643b0dfbad5
--- /dev/null
+++ b/mysql-test/std_data/bug32880.ARN
Binary files differ
diff --git a/mysql-test/std_data/bug32880.ARZ b/mysql-test/std_data/bug32880.ARZ
new file mode 100644
index 00000000000..4e151822647
--- /dev/null
+++ b/mysql-test/std_data/bug32880.ARZ
Binary files differ
diff --git a/mysql-test/std_data/bug32880.frm b/mysql-test/std_data/bug32880.frm
new file mode 100644
index 00000000000..66a4c7d7538
--- /dev/null
+++ b/mysql-test/std_data/bug32880.frm
Binary files differ
diff --git a/mysql-test/suite/binlog/r/binlog_auto_increment_bug33029.result b/mysql-test/suite/binlog/r/binlog_auto_increment_bug33029.result
index 8df0568a755..8226469fcf7 100644
--- a/mysql-test/suite/binlog/r/binlog_auto_increment_bug33029.result
+++ b/mysql-test/suite/binlog/r/binlog_auto_increment_bug33029.result
@@ -38,4 +38,5 @@ DROP PROCEDURE IF EXISTS p2;
DROP FUNCTION IF EXISTS f1;
DROP TRIGGER IF EXISTS tr1;
stop slave sql_thread;
+reset slave;
SET @@global.relay_log_purge= @old_relay_log_purge;
diff --git a/mysql-test/suite/binlog/r/binlog_sql_mode.result b/mysql-test/suite/binlog/r/binlog_sql_mode.result
new file mode 100644
index 00000000000..e306040502d
--- /dev/null
+++ b/mysql-test/suite/binlog/r/binlog_sql_mode.result
@@ -0,0 +1,46 @@
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+SET @old_sql_mode= @@global.sql_mode;
+SET @old_binlog_format=@@session.binlog_format;
+SET SESSION sql_mode=8;
+Initialization
+RESET MASTER;
+CREATE TABLE t1 (id INT);
+CREATE PROCEDURE testProc() SELECT * FROM t1;
+CREATE VIEW testView as SELECT * from t1;
+CREATE FUNCTION testFunc()
+RETURNS INT
+BEGIN
+return 1;
+END;|
+CREATE TRIGGER testTrig BEFORE INSERT ON t1
+FOR EACH ROW BEGIN
+UPDATE t1 SET id = id +1;
+END;|
+CREATE EVENT testEvent ON SCHEDULE
+EVERY 1 DAY
+DO
+BEGIN
+UPDATE t1 SET id = id +1;
+END;|
+Chceck Result
+select
+(@a:=load_file("MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug39526.binlog"))
+is not null;
+(@a:=load_file("MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug39526.binlog"))
+is not null
+1
+*** String sql_mode=0 is found: 0 ***
+Clean Up
+DROP PROCEDURE testProc;
+DROP FUNCTION testFunc;
+DROP TRIGGER testTrig;
+DROP EVENT testEvent;
+DROP VIEW testView;
+DROP TABLE t1;
+SET @@global.sql_mode= @old_sql_mode;
+SET @@session.binlog_format=@old_binlog_format;
diff --git a/mysql-test/suite/binlog/r/binlog_unsafe.result b/mysql-test/suite/binlog/r/binlog_unsafe.result
index 7c0980ba77c..a0809c79fa2 100644
--- a/mysql-test/suite/binlog/r/binlog_unsafe.result
+++ b/mysql-test/suite/binlog/r/binlog_unsafe.result
@@ -227,3 +227,86 @@ UPDATE t1 SET b = '%s%s%s%s%s%s%s%s%s%s%s%s%s%s' WHERE a = 'a' LIMIT 1;
Warnings:
Warning 1592 Statement is not safe to log in statement format.
DROP TABLE t1;
+DROP TABLE IF EXISTS t1, t2;
+CREATE TABLE t1(i INT PRIMARY KEY);
+CREATE TABLE t2(i INT PRIMARY KEY);
+CREATE TABLE t3(i INT, ch CHAR(50));
+"Should issue message Statement is not safe to log in statement format."
+INSERT INTO t1 SELECT * FROM t2 LIMIT 1;
+Warnings:
+Warning 1592 Statement is not safe to log in statement format.
+CREATE FUNCTION func6()
+RETURNS INT
+BEGIN
+INSERT INTO t1 VALUES (10);
+INSERT INTO t1 VALUES (11);
+INSERT INTO t1 VALUES (12);
+RETURN 0;
+END|
+"Should issue message Statement is not safe to log in statement format only once"
+INSERT INTO t3 VALUES(func6(), UUID());
+Warnings:
+Warning 1592 Statement is not safe to log in statement format.
+"Check whether SET @@SQL_LOG_BIN = 0/1 doesn't work in substatements"
+CREATE FUNCTION fun_check_log_bin() RETURNS INT
+BEGIN
+SET @@SQL_LOG_BIN = 0;
+INSERT INTO t1 VALUES(@@global.sync_binlog);
+RETURN 100;
+END|
+"One unsafe warning should be issued in the following statement"
+SELECT fun_check_log_bin();
+fun_check_log_bin()
+100
+Warnings:
+Warning 1592 Statement is not safe to log in statement format.
+"SQL_LOG_BIN should be ON still"
+SHOW VARIABLES LIKE "SQL_LOG_BIN";
+Variable_name Value
+sql_log_bin ON
+set @save_log_bin = @@SESSION.SQL_LOG_BIN;
+set @@SESSION.SQL_LOG_BIN = 0;
+"Should NOT have any warning message issued in the following statements"
+INSERT INTO t1 SELECT * FROM t2 LIMIT 1;
+DROP TABLE t1,t2;
+"Should NOT have any warning message issued in the following func7() and trig"
+CREATE TABLE t1 (a INT);
+CREATE TABLE t2 (a CHAR(40));
+CREATE TABLE trigger_table (a CHAR(7));
+CREATE FUNCTION func7()
+RETURNS INT
+BEGIN
+INSERT INTO t1 VALUES (@@global.sync_binlog);
+INSERT INTO t1 VALUES (@@session.insert_id);
+INSERT INTO t2 SELECT UUID();
+INSERT INTO t2 VALUES (@@session.sql_mode);
+INSERT INTO t2 VALUES (@@global.init_slave);
+RETURN 0;
+END|
+SHOW VARIABLES LIKE "SQL_LOG_BIN";
+Variable_name Value
+sql_log_bin OFF
+SELECT func7();
+func7()
+0
+---- Insert from trigger ----
+CREATE TRIGGER trig
+BEFORE INSERT ON trigger_table
+FOR EACH ROW
+BEGIN
+INSERT INTO t1 VALUES (@@global.sync_binlog);
+INSERT INTO t1 VALUES (@@session.insert_id);
+INSERT INTO t1 VALUES (@@global.auto_increment_increment);
+INSERT INTO t2 SELECT UUID();
+INSERT INTO t2 VALUES (@@session.sql_mode);
+INSERT INTO t2 VALUES (@@global.init_slave);
+INSERT INTO t2 VALUES (@@hostname);
+END|
+INSERT INTO trigger_table VALUES ('bye.');
+DROP FUNCTION fun_check_log_bin;
+DROP FUNCTION func6;
+DROP FUNCTION func7;
+DROP TRIGGER trig;
+DROP TABLE t1, t2, t3, trigger_table;
+set @@SESSION.SQL_LOG_BIN = @save_log_bin;
+"End of tests"
diff --git a/mysql-test/suite/binlog/t/binlog_auto_increment_bug33029.test b/mysql-test/suite/binlog/t/binlog_auto_increment_bug33029.test
index f20cc33f820..5297767675c 100644
--- a/mysql-test/suite/binlog/t/binlog_auto_increment_bug33029.test
+++ b/mysql-test/suite/binlog/t/binlog_auto_increment_bug33029.test
@@ -52,9 +52,10 @@ DROP FUNCTION IF EXISTS f1;
DROP TRIGGER IF EXISTS tr1;
enable_warnings;
-remove_file $MYSQLD_DATADIR/slave-relay-bin.000001;
-remove_file $MYSQLD_DATADIR/slave-relay-bin.index;
stop slave sql_thread;
+reset slave;
source include/wait_for_slave_sql_to_stop.inc;
+remove_file $MYSQLD_DATADIR/slave-relay-bin.000001;
+remove_file $MYSQLD_DATADIR/slave-relay-bin.index;
SET @@global.relay_log_purge= @old_relay_log_purge;
diff --git a/mysql-test/suite/binlog/t/binlog_sql_mode.test b/mysql-test/suite/binlog/t/binlog_sql_mode.test
new file mode 100644
index 00000000000..1777f8cb561
--- /dev/null
+++ b/mysql-test/suite/binlog/t/binlog_sql_mode.test
@@ -0,0 +1,76 @@
+# ==== Purpose ====
+#
+# Test that sql_mode can correct restore before generating the binlog event
+# when creating CREATEable objects.
+#
+# ==== Method ====
+#
+# Scan binlog file to check if the sql_mode is still set to 0 before generating binlog event
+#
+
+-- source include/master-slave.inc
+-- source include/have_log_bin.inc
+
+# BUG#39526 sql_mode not retained in binary log for CREATE PROCEDURE
+
+SET @old_sql_mode= @@global.sql_mode;
+SET @old_binlog_format=@@session.binlog_format;
+let $MYSQLD_DATADIR= `select @@datadir`;
+SET SESSION sql_mode=8;
+
+--echo Initialization
+
+RESET MASTER;
+CREATE TABLE t1 (id INT);
+
+CREATE PROCEDURE testProc() SELECT * FROM t1;
+CREATE VIEW testView as SELECT * from t1;
+
+DELIMITER |;
+CREATE FUNCTION testFunc()
+ RETURNS INT
+ BEGIN
+ return 1;
+ END;|
+DELIMITER ;|
+
+DELIMITER |;
+CREATE TRIGGER testTrig BEFORE INSERT ON t1
+ FOR EACH ROW BEGIN
+ UPDATE t1 SET id = id +1;
+ END;|
+DELIMITER ;|
+
+DELIMITER |;
+CREATE EVENT testEvent ON SCHEDULE
+ EVERY 1 DAY
+ DO
+ BEGIN
+ UPDATE t1 SET id = id +1;
+ END;|
+DELIMITER ;|
+
+--echo Chceck Result
+
+let $MYSQLD_DATADIR= `select @@datadir`;
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug39526.binlog
+--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
+eval select
+(@a:=load_file("$MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug39526.binlog"))
+is not null;
+let $s_mode_unsigned= `select @a like "%@@session.sql_mode=0%" /* must return 0 */`;
+echo *** String sql_mode=0 is found: $s_mode_unsigned ***;
+
+--remove_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug39526.binlog
+
+--echo Clean Up
+
+DROP PROCEDURE testProc;
+DROP FUNCTION testFunc;
+DROP TRIGGER testTrig;
+DROP EVENT testEvent;
+DROP VIEW testView;
+DROP TABLE t1;
+
+SET @@global.sql_mode= @old_sql_mode;
+SET @@session.binlog_format=@old_binlog_format;
diff --git a/mysql-test/suite/binlog/t/binlog_unsafe.test b/mysql-test/suite/binlog/t/binlog_unsafe.test
index f58233d4fef..642dc3a46f7 100644
--- a/mysql-test/suite/binlog/t/binlog_unsafe.test
+++ b/mysql-test/suite/binlog/t/binlog_unsafe.test
@@ -8,6 +8,7 @@
# executed cannot be determined (e.g., INSERT DELAYED). Such
# statements should be marked unsafe. All unsafe statements should
# give a warning.
+# Yet the warning/error message isn't issued when SQL_LOG_BIN is turned off.
#
# This test verifies that a warning is generated for statements that
# should be unsafe, when they are executed under statement mode
@@ -32,14 +33,19 @@
# We try to insert the variables that should not be unsafe into a
# table, and verify that *no* warning is issued.
#
-#
+# Execute a unsafe statement calling a trigger or stored function
+# or neither when SQL_LOG_BIN is turned ON, a warning/error should be issued
+# Execute a unsafe statement calling a trigger or stored function
+# or neither when @@SQL_LOG_BIN is turned OFF,
+# no warning/error is issued
+
# ==== Related bugs and worklogs ====
#
# WL#3339: Issue warnings when statement-based replication may fail
# BUG#31168: @@hostname does not replicate
# BUG#34732: mysqlbinlog does not print default values for auto_increment variables
# BUG#34768: nondeterministic INSERT using LIMIT logged in stmt mode if binlog_format=mixed
-#
+# BUG#41980, SBL, INSERT .. SELECT .. LIMIT = ERROR, even when @@SQL_LOG_BIN is 0
#
# ==== Related test cases ====
#
@@ -271,3 +277,96 @@ INSERT INTO t1 VALUES ('a','b');
UPDATE t1 SET b = '%s%s%s%s%s%s%s%s%s%s%s%s%s%s' WHERE a = 'a' LIMIT 1;
DROP TABLE t1;
+#
+#For bug#41980, SBL, INSERT .. SELECT .. LIMIT = ERROR, even when @@SQL_LOG_BIN is 0
+#
+
+--disable_warnings
+DROP TABLE IF EXISTS t1, t2;
+--enable_warnings
+CREATE TABLE t1(i INT PRIMARY KEY);
+CREATE TABLE t2(i INT PRIMARY KEY);
+CREATE TABLE t3(i INT, ch CHAR(50));
+
+--echo "Should issue message Statement is not safe to log in statement format."
+INSERT INTO t1 SELECT * FROM t2 LIMIT 1;
+
+DELIMITER |;
+CREATE FUNCTION func6()
+RETURNS INT
+BEGIN
+ INSERT INTO t1 VALUES (10);
+ INSERT INTO t1 VALUES (11);
+ INSERT INTO t1 VALUES (12);
+ RETURN 0;
+END|
+DELIMITER ;|
+--echo "Should issue message Statement is not safe to log in statement format only once"
+INSERT INTO t3 VALUES(func6(), UUID());
+
+--echo "Check whether SET @@SQL_LOG_BIN = 0/1 doesn't work in substatements"
+DELIMITER |;
+CREATE FUNCTION fun_check_log_bin() RETURNS INT
+BEGIN
+ SET @@SQL_LOG_BIN = 0;
+ INSERT INTO t1 VALUES(@@global.sync_binlog);
+ RETURN 100;
+END|
+DELIMITER ;|
+--echo "One unsafe warning should be issued in the following statement"
+SELECT fun_check_log_bin();
+--echo "SQL_LOG_BIN should be ON still"
+SHOW VARIABLES LIKE "SQL_LOG_BIN";
+
+set @save_log_bin = @@SESSION.SQL_LOG_BIN;
+set @@SESSION.SQL_LOG_BIN = 0;
+--echo "Should NOT have any warning message issued in the following statements"
+INSERT INTO t1 SELECT * FROM t2 LIMIT 1;
+DROP TABLE t1,t2;
+
+--echo "Should NOT have any warning message issued in the following func7() and trig"
+CREATE TABLE t1 (a INT);
+CREATE TABLE t2 (a CHAR(40));
+CREATE TABLE trigger_table (a CHAR(7));
+DELIMITER |;
+CREATE FUNCTION func7()
+RETURNS INT
+BEGIN
+ INSERT INTO t1 VALUES (@@global.sync_binlog);
+ INSERT INTO t1 VALUES (@@session.insert_id);
+ INSERT INTO t2 SELECT UUID();
+ INSERT INTO t2 VALUES (@@session.sql_mode);
+ INSERT INTO t2 VALUES (@@global.init_slave);
+ RETURN 0;
+END|
+DELIMITER ;|
+SHOW VARIABLES LIKE "SQL_LOG_BIN";
+SELECT func7();
+
+--echo ---- Insert from trigger ----
+
+DELIMITER |;
+CREATE TRIGGER trig
+BEFORE INSERT ON trigger_table
+FOR EACH ROW
+BEGIN
+ INSERT INTO t1 VALUES (@@global.sync_binlog);
+ INSERT INTO t1 VALUES (@@session.insert_id);
+ INSERT INTO t1 VALUES (@@global.auto_increment_increment);
+ INSERT INTO t2 SELECT UUID();
+ INSERT INTO t2 VALUES (@@session.sql_mode);
+ INSERT INTO t2 VALUES (@@global.init_slave);
+ INSERT INTO t2 VALUES (@@hostname);
+END|
+DELIMITER ;|
+
+INSERT INTO trigger_table VALUES ('bye.');
+
+#clean up
+DROP FUNCTION fun_check_log_bin;
+DROP FUNCTION func6;
+DROP FUNCTION func7;
+DROP TRIGGER trig;
+DROP TABLE t1, t2, t3, trigger_table;
+set @@SESSION.SQL_LOG_BIN = @save_log_bin;
+--echo "End of tests"
diff --git a/mysql-test/suite/funcs_1/r/innodb_func_view.result b/mysql-test/suite/funcs_1/r/innodb_func_view.result
index 1547c5461be..4beb0c8aaf2 100644
--- a/mysql-test/suite/funcs_1/r/innodb_func_view.result
+++ b/mysql-test/suite/funcs_1/r/innodb_func_view.result
@@ -5245,7 +5245,7 @@ WHERE select_id = 1 OR select_id IS NULL order by id;
sqrt(my_bigint) my_bigint id
NULL NULL 1
NULL -9223372036854775808 2
-3037000499.976 9223372036854775807 3
+3037000499.97605 9223372036854775807 3
0 0 4
NULL -1 5
2 4 6
@@ -5259,7 +5259,7 @@ WHERE select_id = 1 OR select_id IS NULL) order by id;
sqrt(my_bigint) my_bigint id
NULL NULL 1
NULL -9223372036854775808 2
-3037000499.976 9223372036854775807 3
+3037000499.97605 9223372036854775807 3
0 0 4
NULL -1 5
2 4 6
diff --git a/mysql-test/suite/funcs_1/r/innodb_views.result b/mysql-test/suite/funcs_1/r/innodb_views.result
index bc0b101f90a..a335e135a4f 100644
--- a/mysql-test/suite/funcs_1/r/innodb_views.result
+++ b/mysql-test/suite/funcs_1/r/innodb_views.result
@@ -21367,7 +21367,7 @@ ERROR 42S02: Table 'test.v1' doesn't exist
CHECK TABLE v1;
Table Op Msg_type Msg_text
test.v1 check Error Table 'test.v1' doesn't exist
-test.v1 check error Corrupt
+test.v1 check status Operation failed
DESCRIBE v1;
ERROR 42S02: Table 'test.v1' doesn't exist
EXPLAIN SELECT * FROM v1;
@@ -22824,7 +22824,7 @@ f1 f2
ABC 3
SELECT * FROM v1 order by 2;
f1 my_sqrt
-ABC 1.7320508075689
+ABC 1.73205080756888
ALTER TABLE t1 CHANGE COLUMN f2 f2 VARCHAR(30);
INSERT INTO t1 SET f1 = 'ABC', f2 = 'DEF';
DESCRIBE t1;
@@ -22842,7 +22842,7 @@ ABC DEF
SELECT * FROM v1 order by 2;
f1 my_sqrt
ABC 0
-ABC 1.7320508075689
+ABC 1.73205080756888
SELECT SQRT('DEF');
SQRT('DEF')
0
@@ -22862,7 +22862,7 @@ my_sqrt double YES NULL
SELECT * FROM v2 order by 2;
f1 my_sqrt
ABC 0
-ABC 1.7320508075689
+ABC 1.73205080756888
CREATE TABLE t2 AS SELECT f1, SQRT(f2) my_sqrt FROM t1;
SELECT * FROM t2 order by 2;
f1 ABC
diff --git a/mysql-test/suite/funcs_1/r/is_columns_innodb.result b/mysql-test/suite/funcs_1/r/is_columns_innodb.result
index 27a00ebf10d..73a74e4d7a2 100644
--- a/mysql-test/suite/funcs_1/r/is_columns_innodb.result
+++ b/mysql-test/suite/funcs_1/r/is_columns_innodb.result
@@ -485,7 +485,7 @@ NULL test tb1 f6 6 NULL YES mediumtext 16777215 16777215 NULL NULL latin1 latin1
NULL test tb1 f7 7 NULL YES longtext 4294967295 4294967295 NULL NULL latin1 latin1_swedish_ci longtext select,insert,update,references
NULL test tb1 f8 8 NULL YES tinyblob 255 255 NULL NULL NULL NULL tinyblob select,insert,update,references
NULL test tb1 f9 9 NULL YES blob 65535 65535 NULL NULL NULL NULL blob select,insert,update,references
-NULL test tb2 f100 42 00000000000000000008.8 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb2 f100 42 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test tb2 f101 43 2000-01-01 NO date NULL NULL NULL NULL NULL NULL date select,insert,update,references
NULL test tb2 f102 44 00:00:20 NO time NULL NULL NULL NULL NULL NULL time select,insert,update,references
NULL test tb2 f103 45 0002-02-02 00:00:00 NO datetime NULL NULL NULL NULL NULL NULL datetime select,insert,update,references
@@ -510,32 +510,32 @@ NULL test tb2 f70 12 NULL YES decimal NULL NULL 63 30 NULL NULL decimal(63,30) u
NULL test tb2 f71 13 NULL YES decimal NULL NULL 10 0 NULL NULL decimal(10,0) unsigned zerofill select,insert,update,references
NULL test tb2 f72 14 NULL YES decimal NULL NULL 63 30 NULL NULL decimal(63,30) unsigned zerofill select,insert,update,references
NULL test tb2 f73 15 NULL YES double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test tb2 f74 16 NULL YES double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test tb2 f75 17 NULL YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test tb2 f76 18 NULL YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb2 f74 16 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test tb2 f75 17 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb2 f76 18 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test tb2 f77 19 7.7 YES double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test tb2 f78 20 7.7 YES double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test tb2 f79 21 00000000000000000007.7 YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test tb2 f80 22 00000000000000000008.8 YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb2 f78 20 7.7 YES double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test tb2 f79 21 00000000000000000007.7 YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb2 f80 22 00000000000000000008.8 YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test tb2 f81 23 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
-NULL test tb2 f82 24 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb2 f83 25 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb2 f84 26 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f82 24 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb2 f83 25 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f84 26 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test tb2 f85 27 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
NULL test tb2 f86 28 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
-NULL test tb2 f87 29 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb2 f88 30 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb2 f89 31 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb2 f90 32 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb2 f91 33 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb2 f92 34 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f87 29 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb2 f88 30 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb2 f89 31 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f90 32 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f91 33 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f92 34 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test tb2 f93 35 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
NULL test tb2 f94 36 8.8 NO double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test tb2 f95 37 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb2 f96 38 8.8 NO double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test tb2 f97 39 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb2 f98 40 00000000000000000008.8 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test tb2 f99 41 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f95 37 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb2 f96 38 8.8 NO double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test tb2 f97 39 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f98 40 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb2 f99 41 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test tb3 f118 1 a NO char 1 1 NULL NULL latin1 latin1_swedish_ci char(1) select,insert,update,references
NULL test tb3 f119 2  NO char 1 1 NULL NULL latin1 latin1_bin char(1) select,insert,update,references
NULL test tb3 f120 3  NO char 1 1 NULL NULL latin1 latin1_swedish_ci char(1) select,insert,update,references
@@ -609,33 +609,33 @@ NULL test tb4 f187 12 000000000000000000000000000000009.000000000000000000000000
NULL test tb4 f188 13 0000000009 NO decimal NULL NULL 10 0 NULL NULL decimal(10,0) unsigned zerofill select,insert,update,references
NULL test tb4 f189 14 000000000000000000000000000000009.000000000000000000000000000000 NO decimal NULL NULL 63 30 NULL NULL decimal(63,30) unsigned zerofill select,insert,update,references
NULL test tb4 f190 15 88.8 NO double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test tb4 f191 16 88.8 NO double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test tb4 f192 17 00000000000000000088.8 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test tb4 f193 18 00000000000000000088.8 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb4 f191 16 88.8 NO double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test tb4 f192 17 00000000000000000088.8 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb4 f193 18 00000000000000000088.8 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test tb4 f194 19 55.5 NO double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test tb4 f195 20 55.5 NO double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test tb4 f196 21 00000000000000000055.5 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test tb4 f197 22 00000000000000000055.5 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb4 f195 20 55.5 NO double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test tb4 f196 21 00000000000000000055.5 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb4 f197 22 00000000000000000055.5 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test tb4 f198 23 NULL YES float NULL NULL 12 NULL NULL NULL float select,insert,update,references
-NULL test tb4 f199 24 NULL YES float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb4 f200 25 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb4 f201 26 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f199 24 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb4 f200 25 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f201 26 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test tb4 f202 27 NULL YES float NULL NULL 12 NULL NULL NULL float select,insert,update,references
NULL test tb4 f203 28 NULL YES float NULL NULL 12 NULL NULL NULL float select,insert,update,references
-NULL test tb4 f204 29 NULL YES float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb4 f205 30 NULL YES float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb4 f206 31 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb4 f207 32 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb4 f208 33 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb4 f209 34 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f204 29 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb4 f205 30 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb4 f206 31 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f207 32 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f208 33 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f209 34 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test tb4 f210 35 NULL YES float NULL NULL 12 NULL NULL NULL float select,insert,update,references
NULL test tb4 f211 36 NULL YES double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test tb4 f212 37 NULL YES float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb4 f213 38 NULL YES double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test tb4 f214 39 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb4 f215 40 NULL YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test tb4 f216 41 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb4 f217 42 NULL YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb4 f212 37 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb4 f213 38 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test tb4 f214 39 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f215 40 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb4 f216 41 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f217 42 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test tb4 f218 43 NULL YES date NULL NULL NULL NULL NULL NULL date select,insert,update,references
NULL test tb4 f219 44 NULL YES time NULL NULL NULL NULL NULL NULL time select,insert,update,references
NULL test tb4 f220 45 NULL YES datetime NULL NULL NULL NULL NULL NULL datetime select,insert,update,references
@@ -652,7 +652,7 @@ NULL test tb4 f238 55 NULL YES varchar 0 0 NULL NULL latin1 latin1_swedish_ci va
NULL test tb4 f239 56 NULL YES varchar 20000 20000 NULL NULL latin1 latin1_bin varchar(20000) select,insert,update,references
NULL test tb4 f240 57 NULL YES varchar 2000 2000 NULL NULL latin1 latin1_swedish_ci varchar(2000) select,insert,update,references
NULL test tb4 f241 58 NULL YES char 100 100 NULL NULL latin1 latin1_swedish_ci char(100) select,insert,update,references
-NULL test1 tb2 f100 42 00000000000000000008.8 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test1 tb2 f100 42 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test1 tb2 f101 43 2000-01-01 NO date NULL NULL NULL NULL NULL NULL date select,insert,update,references
NULL test1 tb2 f102 44 00:00:20 NO time NULL NULL NULL NULL NULL NULL time select,insert,update,references
NULL test1 tb2 f103 45 0002-02-02 00:00:00 NO datetime NULL NULL NULL NULL NULL NULL datetime select,insert,update,references
@@ -677,32 +677,32 @@ NULL test1 tb2 f70 12 NULL YES decimal NULL NULL 63 30 NULL NULL decimal(63,30)
NULL test1 tb2 f71 13 NULL YES decimal NULL NULL 10 0 NULL NULL decimal(10,0) unsigned zerofill select,insert,update,references
NULL test1 tb2 f72 14 NULL YES decimal NULL NULL 63 30 NULL NULL decimal(63,30) unsigned zerofill select,insert,update,references
NULL test1 tb2 f73 15 NULL YES double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test1 tb2 f74 16 NULL YES double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test1 tb2 f75 17 NULL YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test1 tb2 f76 18 NULL YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test1 tb2 f74 16 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test1 tb2 f75 17 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test1 tb2 f76 18 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test1 tb2 f77 19 7.7 YES double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test1 tb2 f78 20 7.7 YES double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test1 tb2 f79 21 00000000000000000007.7 YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test1 tb2 f80 22 00000000000000000008.8 YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test1 tb2 f78 20 7.7 YES double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test1 tb2 f79 21 00000000000000000007.7 YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test1 tb2 f80 22 00000000000000000008.8 YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test1 tb2 f81 23 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
-NULL test1 tb2 f82 24 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test1 tb2 f83 25 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test1 tb2 f84 26 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f82 24 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test1 tb2 f83 25 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f84 26 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test1 tb2 f85 27 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
NULL test1 tb2 f86 28 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
-NULL test1 tb2 f87 29 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test1 tb2 f88 30 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test1 tb2 f89 31 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test1 tb2 f90 32 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test1 tb2 f91 33 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test1 tb2 f92 34 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f87 29 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test1 tb2 f88 30 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test1 tb2 f89 31 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f90 32 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f91 33 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f92 34 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test1 tb2 f93 35 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
NULL test1 tb2 f94 36 8.8 NO double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test1 tb2 f95 37 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test1 tb2 f96 38 8.8 NO double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test1 tb2 f97 39 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test1 tb2 f98 40 00000000000000000008.8 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test1 tb2 f99 41 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f95 37 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test1 tb2 f96 38 8.8 NO double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test1 tb2 f97 39 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f98 40 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test1 tb2 f99 41 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test4 t6 f1 1 NULL YES char 20 20 NULL NULL latin1 latin1_swedish_ci char(20) select,insert,update,references
NULL test4 t6 f2 2 NULL YES char 25 25 NULL NULL latin1 latin1_swedish_ci char(25) select,insert,update,references
NULL test4 t6 f3 3 NULL YES date NULL NULL NULL NULL NULL NULL date select,insert,update,references
@@ -762,11 +762,7 @@ NULL date NULL NULL
NULL datetime NULL NULL
NULL decimal NULL NULL
NULL double NULL NULL
-NULL double unsigned NULL NULL
-NULL double unsigned zerofill NULL NULL
NULL float NULL NULL
-NULL float unsigned NULL NULL
-NULL float unsigned zerofill NULL NULL
NULL int NULL NULL
NULL mediumint NULL NULL
NULL smallint NULL NULL
@@ -910,33 +906,33 @@ NULL test tb2 f70 decimal NULL NULL NULL NULL decimal(63,30) unsigned zerofill
NULL test tb2 f71 decimal NULL NULL NULL NULL decimal(10,0) unsigned zerofill
NULL test tb2 f72 decimal NULL NULL NULL NULL decimal(63,30) unsigned zerofill
NULL test tb2 f73 double NULL NULL NULL NULL double
-NULL test tb2 f74 double unsigned NULL NULL NULL NULL double unsigned
-NULL test tb2 f75 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test tb2 f76 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test tb2 f74 double NULL NULL NULL NULL double unsigned
+NULL test tb2 f75 double NULL NULL NULL NULL double unsigned zerofill
+NULL test tb2 f76 double NULL NULL NULL NULL double unsigned zerofill
NULL test tb2 f77 double NULL NULL NULL NULL double
-NULL test tb2 f78 double unsigned NULL NULL NULL NULL double unsigned
-NULL test tb2 f79 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test tb2 f80 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test tb2 f78 double NULL NULL NULL NULL double unsigned
+NULL test tb2 f79 double NULL NULL NULL NULL double unsigned zerofill
+NULL test tb2 f80 double NULL NULL NULL NULL double unsigned zerofill
NULL test tb2 f81 float NULL NULL NULL NULL float
-NULL test tb2 f82 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb2 f83 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb2 f84 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f82 float NULL NULL NULL NULL float unsigned
+NULL test tb2 f83 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f84 float NULL NULL NULL NULL float unsigned zerofill
NULL test tb2 f85 float NULL NULL NULL NULL float
NULL test tb2 f86 float NULL NULL NULL NULL float
-NULL test tb2 f87 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb2 f88 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb2 f89 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb2 f90 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb2 f91 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb2 f92 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f87 float NULL NULL NULL NULL float unsigned
+NULL test tb2 f88 float NULL NULL NULL NULL float unsigned
+NULL test tb2 f89 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f90 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f91 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f92 float NULL NULL NULL NULL float unsigned zerofill
NULL test tb2 f93 float NULL NULL NULL NULL float
NULL test tb2 f94 double NULL NULL NULL NULL double
-NULL test tb2 f95 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb2 f96 double unsigned NULL NULL NULL NULL double unsigned
-NULL test tb2 f97 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb2 f98 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test tb2 f99 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb2 f100 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test tb2 f95 float NULL NULL NULL NULL float unsigned
+NULL test tb2 f96 double NULL NULL NULL NULL double unsigned
+NULL test tb2 f97 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f98 double NULL NULL NULL NULL double unsigned zerofill
+NULL test tb2 f99 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f100 double NULL NULL NULL NULL double unsigned zerofill
NULL test tb2 f101 date NULL NULL NULL NULL date
NULL test tb2 f102 time NULL NULL NULL NULL time
NULL test tb2 f103 datetime NULL NULL NULL NULL datetime
@@ -1019,33 +1015,33 @@ NULL test tb4 f187 decimal NULL NULL NULL NULL decimal(63,30) unsigned zerofill
NULL test tb4 f188 decimal NULL NULL NULL NULL decimal(10,0) unsigned zerofill
NULL test tb4 f189 decimal NULL NULL NULL NULL decimal(63,30) unsigned zerofill
NULL test tb4 f190 double NULL NULL NULL NULL double
-NULL test tb4 f191 double unsigned NULL NULL NULL NULL double unsigned
-NULL test tb4 f192 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test tb4 f193 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test tb4 f191 double NULL NULL NULL NULL double unsigned
+NULL test tb4 f192 double NULL NULL NULL NULL double unsigned zerofill
+NULL test tb4 f193 double NULL NULL NULL NULL double unsigned zerofill
NULL test tb4 f194 double NULL NULL NULL NULL double
-NULL test tb4 f195 double unsigned NULL NULL NULL NULL double unsigned
-NULL test tb4 f196 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test tb4 f197 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test tb4 f195 double NULL NULL NULL NULL double unsigned
+NULL test tb4 f196 double NULL NULL NULL NULL double unsigned zerofill
+NULL test tb4 f197 double NULL NULL NULL NULL double unsigned zerofill
NULL test tb4 f198 float NULL NULL NULL NULL float
-NULL test tb4 f199 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb4 f200 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb4 f201 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f199 float NULL NULL NULL NULL float unsigned
+NULL test tb4 f200 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f201 float NULL NULL NULL NULL float unsigned zerofill
NULL test tb4 f202 float NULL NULL NULL NULL float
NULL test tb4 f203 float NULL NULL NULL NULL float
-NULL test tb4 f204 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb4 f205 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb4 f206 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb4 f207 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb4 f208 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb4 f209 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f204 float NULL NULL NULL NULL float unsigned
+NULL test tb4 f205 float NULL NULL NULL NULL float unsigned
+NULL test tb4 f206 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f207 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f208 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f209 float NULL NULL NULL NULL float unsigned zerofill
NULL test tb4 f210 float NULL NULL NULL NULL float
NULL test tb4 f211 double NULL NULL NULL NULL double
-NULL test tb4 f212 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb4 f213 double unsigned NULL NULL NULL NULL double unsigned
-NULL test tb4 f214 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb4 f215 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test tb4 f216 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb4 f217 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test tb4 f212 float NULL NULL NULL NULL float unsigned
+NULL test tb4 f213 double NULL NULL NULL NULL double unsigned
+NULL test tb4 f214 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f215 double NULL NULL NULL NULL double unsigned zerofill
+NULL test tb4 f216 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f217 double NULL NULL NULL NULL double unsigned zerofill
NULL test tb4 f218 date NULL NULL NULL NULL date
NULL test tb4 f219 time NULL NULL NULL NULL time
NULL test tb4 f220 datetime NULL NULL NULL NULL datetime
@@ -1077,33 +1073,33 @@ NULL test1 tb2 f70 decimal NULL NULL NULL NULL decimal(63,30) unsigned zerofill
NULL test1 tb2 f71 decimal NULL NULL NULL NULL decimal(10,0) unsigned zerofill
NULL test1 tb2 f72 decimal NULL NULL NULL NULL decimal(63,30) unsigned zerofill
NULL test1 tb2 f73 double NULL NULL NULL NULL double
-NULL test1 tb2 f74 double unsigned NULL NULL NULL NULL double unsigned
-NULL test1 tb2 f75 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test1 tb2 f76 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test1 tb2 f74 double NULL NULL NULL NULL double unsigned
+NULL test1 tb2 f75 double NULL NULL NULL NULL double unsigned zerofill
+NULL test1 tb2 f76 double NULL NULL NULL NULL double unsigned zerofill
NULL test1 tb2 f77 double NULL NULL NULL NULL double
-NULL test1 tb2 f78 double unsigned NULL NULL NULL NULL double unsigned
-NULL test1 tb2 f79 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test1 tb2 f80 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test1 tb2 f78 double NULL NULL NULL NULL double unsigned
+NULL test1 tb2 f79 double NULL NULL NULL NULL double unsigned zerofill
+NULL test1 tb2 f80 double NULL NULL NULL NULL double unsigned zerofill
NULL test1 tb2 f81 float NULL NULL NULL NULL float
-NULL test1 tb2 f82 float unsigned NULL NULL NULL NULL float unsigned
-NULL test1 tb2 f83 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test1 tb2 f84 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f82 float NULL NULL NULL NULL float unsigned
+NULL test1 tb2 f83 float NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f84 float NULL NULL NULL NULL float unsigned zerofill
NULL test1 tb2 f85 float NULL NULL NULL NULL float
NULL test1 tb2 f86 float NULL NULL NULL NULL float
-NULL test1 tb2 f87 float unsigned NULL NULL NULL NULL float unsigned
-NULL test1 tb2 f88 float unsigned NULL NULL NULL NULL float unsigned
-NULL test1 tb2 f89 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test1 tb2 f90 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test1 tb2 f91 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test1 tb2 f92 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f87 float NULL NULL NULL NULL float unsigned
+NULL test1 tb2 f88 float NULL NULL NULL NULL float unsigned
+NULL test1 tb2 f89 float NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f90 float NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f91 float NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f92 float NULL NULL NULL NULL float unsigned zerofill
NULL test1 tb2 f93 float NULL NULL NULL NULL float
NULL test1 tb2 f94 double NULL NULL NULL NULL double
-NULL test1 tb2 f95 float unsigned NULL NULL NULL NULL float unsigned
-NULL test1 tb2 f96 double unsigned NULL NULL NULL NULL double unsigned
-NULL test1 tb2 f97 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test1 tb2 f98 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test1 tb2 f99 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test1 tb2 f100 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test1 tb2 f95 float NULL NULL NULL NULL float unsigned
+NULL test1 tb2 f96 double NULL NULL NULL NULL double unsigned
+NULL test1 tb2 f97 float NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f98 double NULL NULL NULL NULL double unsigned zerofill
+NULL test1 tb2 f99 float NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f100 double NULL NULL NULL NULL double unsigned zerofill
NULL test1 tb2 f101 date NULL NULL NULL NULL date
NULL test1 tb2 f102 time NULL NULL NULL NULL time
NULL test1 tb2 f103 datetime NULL NULL NULL NULL datetime
diff --git a/mysql-test/suite/funcs_1/r/is_columns_is.result b/mysql-test/suite/funcs_1/r/is_columns_is.result
index 94aa75c6db2..ccb94c63d46 100644
--- a/mysql-test/suite/funcs_1/r/is_columns_is.result
+++ b/mysql-test/suite/funcs_1/r/is_columns_is.result
@@ -166,7 +166,7 @@ NULL information_schema PROCESSLIST HOST 3 NO varchar 64 192 NULL NULL utf8 utf
NULL information_schema PROCESSLIST ID 1 0 NO bigint NULL NULL 19 0 NULL NULL bigint(4) select
NULL information_schema PROCESSLIST INFO 8 NULL YES longtext 4294967295 4294967295 NULL NULL utf8 utf8_general_ci longtext select
NULL information_schema PROCESSLIST STATE 7 NULL YES varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select
-NULL information_schema PROCESSLIST TIME 6 0 NO bigint NULL NULL 19 0 NULL NULL bigint(7) select
+NULL information_schema PROCESSLIST TIME 6 0 NO int NULL NULL 10 0 NULL NULL int(7) select
NULL information_schema PROCESSLIST USER 2 NO varchar 16 48 NULL NULL utf8 utf8_general_ci varchar(16) select
NULL information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_CATALOG 1 NULL YES varchar 512 1536 NULL NULL utf8 utf8_general_ci varchar(512) select
NULL information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_NAME 3 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select
@@ -340,6 +340,7 @@ ORDER BY CHARACTER_SET_NAME, COLLATION_NAME, COL_CML;
COL_CML DATA_TYPE CHARACTER_SET_NAME COLLATION_NAME
NULL bigint NULL NULL
NULL datetime NULL NULL
+NULL int NULL NULL
--> CHAR(0) is allowed (see manual), and here both CHARACHTER_* values
--> are 0, which is intended behavior, and the result of 0 / 0 IS NULL
SELECT CHARACTER_OCTET_LENGTH / CHARACTER_MAXIMUM_LENGTH AS COL_CML,
@@ -519,7 +520,7 @@ NULL information_schema PROCESSLIST ID bigint NULL NULL NULL NULL bigint(4)
3.0000 information_schema PROCESSLIST HOST varchar 64 192 utf8 utf8_general_ci varchar(64)
3.0000 information_schema PROCESSLIST DB varchar 64 192 utf8 utf8_general_ci varchar(64)
3.0000 information_schema PROCESSLIST COMMAND varchar 16 48 utf8 utf8_general_ci varchar(16)
-NULL information_schema PROCESSLIST TIME bigint NULL NULL NULL NULL bigint(7)
+NULL information_schema PROCESSLIST TIME int NULL NULL NULL NULL int(7)
3.0000 information_schema PROCESSLIST STATE varchar 64 192 utf8 utf8_general_ci varchar(64)
1.0000 information_schema PROCESSLIST INFO longtext 4294967295 4294967295 utf8 utf8_general_ci longtext
3.0000 information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_CATALOG varchar 512 1536 utf8 utf8_general_ci varchar(512)
diff --git a/mysql-test/suite/funcs_1/r/is_columns_memory.result b/mysql-test/suite/funcs_1/r/is_columns_memory.result
index 9bcf7887c16..513d7bdfac6 100644
--- a/mysql-test/suite/funcs_1/r/is_columns_memory.result
+++ b/mysql-test/suite/funcs_1/r/is_columns_memory.result
@@ -466,7 +466,7 @@ NULL test tb1 f55 47 0000000099 NO decimal NULL NULL 10 0 NULL NULL decimal(10,0
NULL test tb1 f56 48 0000000099 NO decimal NULL NULL 10 0 NULL NULL decimal(10,0) unsigned zerofill select,insert,update,references
NULL test tb1 f57 49 99 NO decimal NULL NULL 10 0 NULL NULL decimal(10,0) select,insert,update,references
NULL test tb1 f58 50 99 NO decimal NULL NULL 64 0 NULL NULL decimal(64,0) select,insert,update,references
-NULL test tb2 f100 42 00000000000000000008.8 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb2 f100 42 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test tb2 f101 43 2000-01-01 NO date NULL NULL NULL NULL NULL NULL date select,insert,update,references
NULL test tb2 f102 44 00:00:20 NO time NULL NULL NULL NULL NULL NULL time select,insert,update,references
NULL test tb2 f103 45 0002-02-02 00:00:00 NO datetime NULL NULL NULL NULL NULL NULL datetime select,insert,update,references
@@ -491,32 +491,32 @@ NULL test tb2 f70 12 NULL YES decimal NULL NULL 63 30 NULL NULL decimal(63,30) u
NULL test tb2 f71 13 NULL YES decimal NULL NULL 10 0 NULL NULL decimal(10,0) unsigned zerofill select,insert,update,references
NULL test tb2 f72 14 NULL YES decimal NULL NULL 63 30 NULL NULL decimal(63,30) unsigned zerofill select,insert,update,references
NULL test tb2 f73 15 NULL YES double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test tb2 f74 16 NULL YES double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test tb2 f75 17 NULL YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test tb2 f76 18 NULL YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb2 f74 16 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test tb2 f75 17 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb2 f76 18 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test tb2 f77 19 7.7 YES double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test tb2 f78 20 7.7 YES double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test tb2 f79 21 00000000000000000007.7 YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test tb2 f80 22 00000000000000000008.8 YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb2 f78 20 7.7 YES double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test tb2 f79 21 00000000000000000007.7 YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb2 f80 22 00000000000000000008.8 YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test tb2 f81 23 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
-NULL test tb2 f82 24 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb2 f83 25 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb2 f84 26 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f82 24 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb2 f83 25 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f84 26 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test tb2 f85 27 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
NULL test tb2 f86 28 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
-NULL test tb2 f87 29 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb2 f88 30 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb2 f89 31 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb2 f90 32 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb2 f91 33 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb2 f92 34 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f87 29 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb2 f88 30 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb2 f89 31 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f90 32 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f91 33 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f92 34 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test tb2 f93 35 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
NULL test tb2 f94 36 8.8 NO double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test tb2 f95 37 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb2 f96 38 8.8 NO double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test tb2 f97 39 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb2 f98 40 00000000000000000008.8 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test tb2 f99 41 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f95 37 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb2 f96 38 8.8 NO double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test tb2 f97 39 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f98 40 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb2 f99 41 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test tb3 f118 1 a NO char 1 1 NULL NULL latin1 latin1_swedish_ci char(1) select,insert,update,references
NULL test tb3 f119 2  NO char 1 1 NULL NULL latin1 latin1_bin char(1) select,insert,update,references
NULL test tb3 f120 3  NO char 1 1 NULL NULL latin1 latin1_swedish_ci char(1) select,insert,update,references
@@ -584,33 +584,33 @@ NULL test tb4 f187 12 000000000000000000000000000000009.000000000000000000000000
NULL test tb4 f188 13 0000000009 NO decimal NULL NULL 10 0 NULL NULL decimal(10,0) unsigned zerofill select,insert,update,references
NULL test tb4 f189 14 000000000000000000000000000000009.000000000000000000000000000000 NO decimal NULL NULL 63 30 NULL NULL decimal(63,30) unsigned zerofill select,insert,update,references
NULL test tb4 f190 15 88.8 NO double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test tb4 f191 16 88.8 NO double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test tb4 f192 17 00000000000000000088.8 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test tb4 f193 18 00000000000000000088.8 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb4 f191 16 88.8 NO double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test tb4 f192 17 00000000000000000088.8 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb4 f193 18 00000000000000000088.8 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test tb4 f194 19 55.5 NO double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test tb4 f195 20 55.5 NO double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test tb4 f196 21 00000000000000000055.5 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test tb4 f197 22 00000000000000000055.5 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb4 f195 20 55.5 NO double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test tb4 f196 21 00000000000000000055.5 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb4 f197 22 00000000000000000055.5 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test tb4 f198 23 NULL YES float NULL NULL 12 NULL NULL NULL float select,insert,update,references
-NULL test tb4 f199 24 NULL YES float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb4 f200 25 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb4 f201 26 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f199 24 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb4 f200 25 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f201 26 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test tb4 f202 27 NULL YES float NULL NULL 12 NULL NULL NULL float select,insert,update,references
NULL test tb4 f203 28 NULL YES float NULL NULL 12 NULL NULL NULL float select,insert,update,references
-NULL test tb4 f204 29 NULL YES float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb4 f205 30 NULL YES float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb4 f206 31 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb4 f207 32 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb4 f208 33 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb4 f209 34 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f204 29 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb4 f205 30 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb4 f206 31 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f207 32 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f208 33 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f209 34 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test tb4 f210 35 NULL YES float NULL NULL 12 NULL NULL NULL float select,insert,update,references
NULL test tb4 f211 36 NULL YES double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test tb4 f212 37 NULL YES float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb4 f213 38 NULL YES double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test tb4 f214 39 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb4 f215 40 NULL YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test tb4 f216 41 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb4 f217 42 NULL YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb4 f212 37 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb4 f213 38 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test tb4 f214 39 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f215 40 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb4 f216 41 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f217 42 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test tb4 f218 43 NULL YES date NULL NULL NULL NULL NULL NULL date select,insert,update,references
NULL test tb4 f219 44 NULL YES time NULL NULL NULL NULL NULL NULL time select,insert,update,references
NULL test tb4 f220 45 NULL YES datetime NULL NULL NULL NULL NULL NULL datetime select,insert,update,references
@@ -626,7 +626,7 @@ NULL test tb4 f238 55 NULL YES varchar 25000 25000 NULL NULL latin1 latin1_bin v
NULL test tb4 f239 56 NULL YES varbinary 0 0 NULL NULL NULL NULL varbinary(0) select,insert,update,references
NULL test tb4 f240 57 NULL YES varchar 1200 1200 NULL NULL latin1 latin1_swedish_ci varchar(1200) select,insert,update,references
NULL test tb4 f241 53 NULL YES char 255 255 NULL NULL latin1 latin1_swedish_ci char(255) select,insert,update,references
-NULL test1 tb2 f100 42 00000000000000000008.8 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test1 tb2 f100 42 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test1 tb2 f101 43 2000-01-01 NO date NULL NULL NULL NULL NULL NULL date select,insert,update,references
NULL test1 tb2 f102 44 00:00:20 NO time NULL NULL NULL NULL NULL NULL time select,insert,update,references
NULL test1 tb2 f103 45 0002-02-02 00:00:00 NO datetime NULL NULL NULL NULL NULL NULL datetime select,insert,update,references
@@ -651,32 +651,32 @@ NULL test1 tb2 f70 12 NULL YES decimal NULL NULL 63 30 NULL NULL decimal(63,30)
NULL test1 tb2 f71 13 NULL YES decimal NULL NULL 10 0 NULL NULL decimal(10,0) unsigned zerofill select,insert,update,references
NULL test1 tb2 f72 14 NULL YES decimal NULL NULL 63 30 NULL NULL decimal(63,30) unsigned zerofill select,insert,update,references
NULL test1 tb2 f73 15 NULL YES double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test1 tb2 f74 16 NULL YES double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test1 tb2 f75 17 NULL YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test1 tb2 f76 18 NULL YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test1 tb2 f74 16 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test1 tb2 f75 17 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test1 tb2 f76 18 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test1 tb2 f77 19 7.7 YES double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test1 tb2 f78 20 7.7 YES double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test1 tb2 f79 21 00000000000000000007.7 YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test1 tb2 f80 22 00000000000000000008.8 YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test1 tb2 f78 20 7.7 YES double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test1 tb2 f79 21 00000000000000000007.7 YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test1 tb2 f80 22 00000000000000000008.8 YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test1 tb2 f81 23 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
-NULL test1 tb2 f82 24 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test1 tb2 f83 25 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test1 tb2 f84 26 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f82 24 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test1 tb2 f83 25 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f84 26 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test1 tb2 f85 27 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
NULL test1 tb2 f86 28 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
-NULL test1 tb2 f87 29 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test1 tb2 f88 30 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test1 tb2 f89 31 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test1 tb2 f90 32 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test1 tb2 f91 33 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test1 tb2 f92 34 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f87 29 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test1 tb2 f88 30 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test1 tb2 f89 31 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f90 32 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f91 33 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f92 34 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test1 tb2 f93 35 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
NULL test1 tb2 f94 36 8.8 NO double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test1 tb2 f95 37 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test1 tb2 f96 38 8.8 NO double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test1 tb2 f97 39 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test1 tb2 f98 40 00000000000000000008.8 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test1 tb2 f99 41 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f95 37 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test1 tb2 f96 38 8.8 NO double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test1 tb2 f97 39 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f98 40 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test1 tb2 f99 41 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test4 t6 f1 1 NULL YES char 20 20 NULL NULL latin1 latin1_swedish_ci char(20) select,insert,update,references
NULL test4 t6 f2 2 NULL YES char 25 25 NULL NULL latin1 latin1_swedish_ci char(25) select,insert,update,references
NULL test4 t6 f3 3 NULL YES date NULL NULL NULL NULL NULL NULL date select,insert,update,references
@@ -728,11 +728,7 @@ NULL date NULL NULL
NULL datetime NULL NULL
NULL decimal NULL NULL
NULL double NULL NULL
-NULL double unsigned NULL NULL
-NULL double unsigned zerofill NULL NULL
NULL float NULL NULL
-NULL float unsigned NULL NULL
-NULL float unsigned zerofill NULL NULL
NULL int NULL NULL
NULL mediumint NULL NULL
NULL smallint NULL NULL
@@ -866,33 +862,33 @@ NULL test tb2 f70 decimal NULL NULL NULL NULL decimal(63,30) unsigned zerofill
NULL test tb2 f71 decimal NULL NULL NULL NULL decimal(10,0) unsigned zerofill
NULL test tb2 f72 decimal NULL NULL NULL NULL decimal(63,30) unsigned zerofill
NULL test tb2 f73 double NULL NULL NULL NULL double
-NULL test tb2 f74 double unsigned NULL NULL NULL NULL double unsigned
-NULL test tb2 f75 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test tb2 f76 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test tb2 f74 double NULL NULL NULL NULL double unsigned
+NULL test tb2 f75 double NULL NULL NULL NULL double unsigned zerofill
+NULL test tb2 f76 double NULL NULL NULL NULL double unsigned zerofill
NULL test tb2 f77 double NULL NULL NULL NULL double
-NULL test tb2 f78 double unsigned NULL NULL NULL NULL double unsigned
-NULL test tb2 f79 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test tb2 f80 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test tb2 f78 double NULL NULL NULL NULL double unsigned
+NULL test tb2 f79 double NULL NULL NULL NULL double unsigned zerofill
+NULL test tb2 f80 double NULL NULL NULL NULL double unsigned zerofill
NULL test tb2 f81 float NULL NULL NULL NULL float
-NULL test tb2 f82 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb2 f83 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb2 f84 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f82 float NULL NULL NULL NULL float unsigned
+NULL test tb2 f83 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f84 float NULL NULL NULL NULL float unsigned zerofill
NULL test tb2 f85 float NULL NULL NULL NULL float
NULL test tb2 f86 float NULL NULL NULL NULL float
-NULL test tb2 f87 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb2 f88 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb2 f89 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb2 f90 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb2 f91 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb2 f92 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f87 float NULL NULL NULL NULL float unsigned
+NULL test tb2 f88 float NULL NULL NULL NULL float unsigned
+NULL test tb2 f89 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f90 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f91 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f92 float NULL NULL NULL NULL float unsigned zerofill
NULL test tb2 f93 float NULL NULL NULL NULL float
NULL test tb2 f94 double NULL NULL NULL NULL double
-NULL test tb2 f95 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb2 f96 double unsigned NULL NULL NULL NULL double unsigned
-NULL test tb2 f97 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb2 f98 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test tb2 f99 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb2 f100 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test tb2 f95 float NULL NULL NULL NULL float unsigned
+NULL test tb2 f96 double NULL NULL NULL NULL double unsigned
+NULL test tb2 f97 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f98 double NULL NULL NULL NULL double unsigned zerofill
+NULL test tb2 f99 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f100 double NULL NULL NULL NULL double unsigned zerofill
NULL test tb2 f101 date NULL NULL NULL NULL date
NULL test tb2 f102 time NULL NULL NULL NULL time
NULL test tb2 f103 datetime NULL NULL NULL NULL datetime
@@ -969,33 +965,33 @@ NULL test tb4 f187 decimal NULL NULL NULL NULL decimal(63,30) unsigned zerofill
NULL test tb4 f188 decimal NULL NULL NULL NULL decimal(10,0) unsigned zerofill
NULL test tb4 f189 decimal NULL NULL NULL NULL decimal(63,30) unsigned zerofill
NULL test tb4 f190 double NULL NULL NULL NULL double
-NULL test tb4 f191 double unsigned NULL NULL NULL NULL double unsigned
-NULL test tb4 f192 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test tb4 f193 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test tb4 f191 double NULL NULL NULL NULL double unsigned
+NULL test tb4 f192 double NULL NULL NULL NULL double unsigned zerofill
+NULL test tb4 f193 double NULL NULL NULL NULL double unsigned zerofill
NULL test tb4 f194 double NULL NULL NULL NULL double
-NULL test tb4 f195 double unsigned NULL NULL NULL NULL double unsigned
-NULL test tb4 f196 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test tb4 f197 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test tb4 f195 double NULL NULL NULL NULL double unsigned
+NULL test tb4 f196 double NULL NULL NULL NULL double unsigned zerofill
+NULL test tb4 f197 double NULL NULL NULL NULL double unsigned zerofill
NULL test tb4 f198 float NULL NULL NULL NULL float
-NULL test tb4 f199 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb4 f200 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb4 f201 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f199 float NULL NULL NULL NULL float unsigned
+NULL test tb4 f200 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f201 float NULL NULL NULL NULL float unsigned zerofill
NULL test tb4 f202 float NULL NULL NULL NULL float
NULL test tb4 f203 float NULL NULL NULL NULL float
-NULL test tb4 f204 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb4 f205 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb4 f206 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb4 f207 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb4 f208 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb4 f209 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f204 float NULL NULL NULL NULL float unsigned
+NULL test tb4 f205 float NULL NULL NULL NULL float unsigned
+NULL test tb4 f206 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f207 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f208 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f209 float NULL NULL NULL NULL float unsigned zerofill
NULL test tb4 f210 float NULL NULL NULL NULL float
NULL test tb4 f211 double NULL NULL NULL NULL double
-NULL test tb4 f212 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb4 f213 double unsigned NULL NULL NULL NULL double unsigned
-NULL test tb4 f214 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb4 f215 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test tb4 f216 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb4 f217 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test tb4 f212 float NULL NULL NULL NULL float unsigned
+NULL test tb4 f213 double NULL NULL NULL NULL double unsigned
+NULL test tb4 f214 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f215 double NULL NULL NULL NULL double unsigned zerofill
+NULL test tb4 f216 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f217 double NULL NULL NULL NULL double unsigned zerofill
NULL test tb4 f218 date NULL NULL NULL NULL date
NULL test tb4 f219 time NULL NULL NULL NULL time
NULL test tb4 f220 datetime NULL NULL NULL NULL datetime
@@ -1026,33 +1022,33 @@ NULL test1 tb2 f70 decimal NULL NULL NULL NULL decimal(63,30) unsigned zerofill
NULL test1 tb2 f71 decimal NULL NULL NULL NULL decimal(10,0) unsigned zerofill
NULL test1 tb2 f72 decimal NULL NULL NULL NULL decimal(63,30) unsigned zerofill
NULL test1 tb2 f73 double NULL NULL NULL NULL double
-NULL test1 tb2 f74 double unsigned NULL NULL NULL NULL double unsigned
-NULL test1 tb2 f75 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test1 tb2 f76 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test1 tb2 f74 double NULL NULL NULL NULL double unsigned
+NULL test1 tb2 f75 double NULL NULL NULL NULL double unsigned zerofill
+NULL test1 tb2 f76 double NULL NULL NULL NULL double unsigned zerofill
NULL test1 tb2 f77 double NULL NULL NULL NULL double
-NULL test1 tb2 f78 double unsigned NULL NULL NULL NULL double unsigned
-NULL test1 tb2 f79 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test1 tb2 f80 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test1 tb2 f78 double NULL NULL NULL NULL double unsigned
+NULL test1 tb2 f79 double NULL NULL NULL NULL double unsigned zerofill
+NULL test1 tb2 f80 double NULL NULL NULL NULL double unsigned zerofill
NULL test1 tb2 f81 float NULL NULL NULL NULL float
-NULL test1 tb2 f82 float unsigned NULL NULL NULL NULL float unsigned
-NULL test1 tb2 f83 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test1 tb2 f84 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f82 float NULL NULL NULL NULL float unsigned
+NULL test1 tb2 f83 float NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f84 float NULL NULL NULL NULL float unsigned zerofill
NULL test1 tb2 f85 float NULL NULL NULL NULL float
NULL test1 tb2 f86 float NULL NULL NULL NULL float
-NULL test1 tb2 f87 float unsigned NULL NULL NULL NULL float unsigned
-NULL test1 tb2 f88 float unsigned NULL NULL NULL NULL float unsigned
-NULL test1 tb2 f89 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test1 tb2 f90 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test1 tb2 f91 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test1 tb2 f92 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f87 float NULL NULL NULL NULL float unsigned
+NULL test1 tb2 f88 float NULL NULL NULL NULL float unsigned
+NULL test1 tb2 f89 float NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f90 float NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f91 float NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f92 float NULL NULL NULL NULL float unsigned zerofill
NULL test1 tb2 f93 float NULL NULL NULL NULL float
NULL test1 tb2 f94 double NULL NULL NULL NULL double
-NULL test1 tb2 f95 float unsigned NULL NULL NULL NULL float unsigned
-NULL test1 tb2 f96 double unsigned NULL NULL NULL NULL double unsigned
-NULL test1 tb2 f97 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test1 tb2 f98 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test1 tb2 f99 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test1 tb2 f100 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test1 tb2 f95 float NULL NULL NULL NULL float unsigned
+NULL test1 tb2 f96 double NULL NULL NULL NULL double unsigned
+NULL test1 tb2 f97 float NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f98 double NULL NULL NULL NULL double unsigned zerofill
+NULL test1 tb2 f99 float NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f100 double NULL NULL NULL NULL double unsigned zerofill
NULL test1 tb2 f101 date NULL NULL NULL NULL date
NULL test1 tb2 f102 time NULL NULL NULL NULL time
NULL test1 tb2 f103 datetime NULL NULL NULL NULL datetime
diff --git a/mysql-test/suite/funcs_1/r/is_columns_myisam.result b/mysql-test/suite/funcs_1/r/is_columns_myisam.result
index de047728826..a95ca4f0ebf 100644
--- a/mysql-test/suite/funcs_1/r/is_columns_myisam.result
+++ b/mysql-test/suite/funcs_1/r/is_columns_myisam.result
@@ -514,7 +514,7 @@ NULL test tb1 f6 6 NULL YES mediumtext 16777215 16777215 NULL NULL latin1 latin1
NULL test tb1 f7 7 NULL YES longtext 4294967295 4294967295 NULL NULL latin1 latin1_swedish_ci longtext select,insert,update,references
NULL test tb1 f8 8 NULL YES tinyblob 255 255 NULL NULL NULL NULL tinyblob select,insert,update,references
NULL test tb1 f9 9 NULL YES blob 65535 65535 NULL NULL NULL NULL blob select,insert,update,references
-NULL test tb2 f100 42 00000000000000000008.8 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb2 f100 42 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test tb2 f101 43 2000-01-01 NO date NULL NULL NULL NULL NULL NULL date select,insert,update,references
NULL test tb2 f102 44 00:00:20 NO time NULL NULL NULL NULL NULL NULL time select,insert,update,references
NULL test tb2 f103 45 0002-02-02 00:00:00 NO datetime NULL NULL NULL NULL NULL NULL datetime select,insert,update,references
@@ -547,32 +547,32 @@ NULL test tb2 f70 12 NULL YES decimal NULL NULL 63 30 NULL NULL decimal(63,30) u
NULL test tb2 f71 13 NULL YES decimal NULL NULL 10 0 NULL NULL decimal(10,0) unsigned zerofill select,insert,update,references
NULL test tb2 f72 14 NULL YES decimal NULL NULL 63 30 NULL NULL decimal(63,30) unsigned zerofill select,insert,update,references
NULL test tb2 f73 15 NULL YES double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test tb2 f74 16 NULL YES double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test tb2 f75 17 NULL YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test tb2 f76 18 NULL YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb2 f74 16 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test tb2 f75 17 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb2 f76 18 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test tb2 f77 19 7.7 YES double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test tb2 f78 20 7.7 YES double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test tb2 f79 21 00000000000000000007.7 YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test tb2 f80 22 00000000000000000008.8 YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb2 f78 20 7.7 YES double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test tb2 f79 21 00000000000000000007.7 YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb2 f80 22 00000000000000000008.8 YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test tb2 f81 23 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
-NULL test tb2 f82 24 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb2 f83 25 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb2 f84 26 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f82 24 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb2 f83 25 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f84 26 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test tb2 f85 27 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
NULL test tb2 f86 28 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
-NULL test tb2 f87 29 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb2 f88 30 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb2 f89 31 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb2 f90 32 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb2 f91 33 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb2 f92 34 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f87 29 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb2 f88 30 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb2 f89 31 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f90 32 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f91 33 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f92 34 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test tb2 f93 35 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
NULL test tb2 f94 36 8.8 NO double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test tb2 f95 37 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb2 f96 38 8.8 NO double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test tb2 f97 39 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb2 f98 40 00000000000000000008.8 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test tb2 f99 41 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f95 37 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb2 f96 38 8.8 NO double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test tb2 f97 39 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb2 f98 40 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb2 f99 41 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test tb3 f118 1 a NO char 1 1 NULL NULL latin1 latin1_swedish_ci char(1) select,insert,update,references
NULL test tb3 f119 2  NO char 1 1 NULL NULL latin1 latin1_bin char(1) select,insert,update,references
NULL test tb3 f120 3  NO char 1 1 NULL NULL latin1 latin1_swedish_ci char(1) select,insert,update,references
@@ -646,33 +646,33 @@ NULL test tb4 f187 12 000000000000000000000000000000009.000000000000000000000000
NULL test tb4 f188 13 0000000009 NO decimal NULL NULL 10 0 NULL NULL decimal(10,0) unsigned zerofill select,insert,update,references
NULL test tb4 f189 14 000000000000000000000000000000009.000000000000000000000000000000 NO decimal NULL NULL 63 30 NULL NULL decimal(63,30) unsigned zerofill select,insert,update,references
NULL test tb4 f190 15 88.8 NO double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test tb4 f191 16 88.8 NO double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test tb4 f192 17 00000000000000000088.8 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test tb4 f193 18 00000000000000000088.8 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb4 f191 16 88.8 NO double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test tb4 f192 17 00000000000000000088.8 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb4 f193 18 00000000000000000088.8 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test tb4 f194 19 55.5 NO double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test tb4 f195 20 55.5 NO double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test tb4 f196 21 00000000000000000055.5 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test tb4 f197 22 00000000000000000055.5 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb4 f195 20 55.5 NO double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test tb4 f196 21 00000000000000000055.5 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb4 f197 22 00000000000000000055.5 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test tb4 f198 23 NULL YES float NULL NULL 12 NULL NULL NULL float select,insert,update,references
-NULL test tb4 f199 24 NULL YES float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb4 f200 25 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb4 f201 26 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f199 24 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb4 f200 25 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f201 26 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test tb4 f202 27 NULL YES float NULL NULL 12 NULL NULL NULL float select,insert,update,references
NULL test tb4 f203 28 NULL YES float NULL NULL 12 NULL NULL NULL float select,insert,update,references
-NULL test tb4 f204 29 NULL YES float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb4 f205 30 NULL YES float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb4 f206 31 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb4 f207 32 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb4 f208 33 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb4 f209 34 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f204 29 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb4 f205 30 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb4 f206 31 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f207 32 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f208 33 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f209 34 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test tb4 f210 35 NULL YES float NULL NULL 12 NULL NULL NULL float select,insert,update,references
NULL test tb4 f211 36 NULL YES double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test tb4 f212 37 NULL YES float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test tb4 f213 38 NULL YES double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test tb4 f214 39 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb4 f215 40 NULL YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test tb4 f216 41 NULL YES float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test tb4 f217 42 NULL YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb4 f212 37 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test tb4 f213 38 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test tb4 f214 39 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f215 40 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test tb4 f216 41 NULL YES float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test tb4 f217 42 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test tb4 f218 43 NULL YES date NULL NULL NULL NULL NULL NULL date select,insert,update,references
NULL test tb4 f219 44 NULL YES time NULL NULL NULL NULL NULL NULL time select,insert,update,references
NULL test tb4 f220 45 NULL YES datetime NULL NULL NULL NULL NULL NULL datetime select,insert,update,references
@@ -698,7 +698,7 @@ NULL test tb4 f239 64 NULL YES varbinary 1000 1000 NULL NULL NULL NULL varbinary
NULL test tb4 f240 65 NULL YES varchar 120 120 NULL NULL latin1 latin1_swedish_ci varchar(120) select,insert,update,references
NULL test tb4 f241 66 NULL YES char 100 100 NULL NULL latin1 latin1_swedish_ci char(100) select,insert,update,references
NULL test tb4 f242 67 NULL YES bit NULL NULL 30 NULL NULL NULL bit(30) select,insert,update,references
-NULL test1 tb2 f100 42 00000000000000000008.8 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test1 tb2 f100 42 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test1 tb2 f101 43 2000-01-01 NO date NULL NULL NULL NULL NULL NULL date select,insert,update,references
NULL test1 tb2 f102 44 00:00:20 NO time NULL NULL NULL NULL NULL NULL time select,insert,update,references
NULL test1 tb2 f103 45 0002-02-02 00:00:00 NO datetime NULL NULL NULL NULL NULL NULL datetime select,insert,update,references
@@ -731,32 +731,32 @@ NULL test1 tb2 f70 12 NULL YES decimal NULL NULL 63 30 NULL NULL decimal(63,30)
NULL test1 tb2 f71 13 NULL YES decimal NULL NULL 10 0 NULL NULL decimal(10,0) unsigned zerofill select,insert,update,references
NULL test1 tb2 f72 14 NULL YES decimal NULL NULL 63 30 NULL NULL decimal(63,30) unsigned zerofill select,insert,update,references
NULL test1 tb2 f73 15 NULL YES double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test1 tb2 f74 16 NULL YES double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test1 tb2 f75 17 NULL YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test1 tb2 f76 18 NULL YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test1 tb2 f74 16 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test1 tb2 f75 17 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test1 tb2 f76 18 NULL YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test1 tb2 f77 19 7.7 YES double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test1 tb2 f78 20 7.7 YES double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test1 tb2 f79 21 00000000000000000007.7 YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test1 tb2 f80 22 00000000000000000008.8 YES double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test1 tb2 f78 20 7.7 YES double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test1 tb2 f79 21 00000000000000000007.7 YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test1 tb2 f80 22 00000000000000000008.8 YES double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
NULL test1 tb2 f81 23 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
-NULL test1 tb2 f82 24 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test1 tb2 f83 25 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test1 tb2 f84 26 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f82 24 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test1 tb2 f83 25 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f84 26 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test1 tb2 f85 27 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
NULL test1 tb2 f86 28 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
-NULL test1 tb2 f87 29 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test1 tb2 f88 30 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test1 tb2 f89 31 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test1 tb2 f90 32 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test1 tb2 f91 33 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test1 tb2 f92 34 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f87 29 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test1 tb2 f88 30 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test1 tb2 f89 31 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f90 32 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f91 33 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f92 34 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test1 tb2 f93 35 8.8 NO float NULL NULL 12 NULL NULL NULL float select,insert,update,references
NULL test1 tb2 f94 36 8.8 NO double NULL NULL 22 NULL NULL NULL double select,insert,update,references
-NULL test1 tb2 f95 37 8.8 NO float unsigned NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
-NULL test1 tb2 f96 38 8.8 NO double unsigned NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
-NULL test1 tb2 f97 39 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
-NULL test1 tb2 f98 40 00000000000000000008.8 NO double unsigned zerofill NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
-NULL test1 tb2 f99 41 0000000008.8 NO float unsigned zerofill NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f95 37 8.8 NO float NULL NULL 12 NULL NULL NULL float unsigned select,insert,update,references
+NULL test1 tb2 f96 38 8.8 NO double NULL NULL 22 NULL NULL NULL double unsigned select,insert,update,references
+NULL test1 tb2 f97 39 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
+NULL test1 tb2 f98 40 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL double unsigned zerofill select,insert,update,references
+NULL test1 tb2 f99 41 0000000008.8 NO float NULL NULL 12 NULL NULL NULL float unsigned zerofill select,insert,update,references
NULL test4 t6 f1 1 NULL YES char 20 20 NULL NULL latin1 latin1_swedish_ci char(20) select,insert,update,references
NULL test4 t6 f2 2 NULL YES char 25 25 NULL NULL latin1 latin1_swedish_ci char(25) select,insert,update,references
NULL test4 t6 f3 3 NULL YES date NULL NULL NULL NULL NULL NULL date select,insert,update,references
@@ -817,11 +817,7 @@ NULL date NULL NULL
NULL datetime NULL NULL
NULL decimal NULL NULL
NULL double NULL NULL
-NULL double unsigned NULL NULL
-NULL double unsigned zerofill NULL NULL
NULL float NULL NULL
-NULL float unsigned NULL NULL
-NULL float unsigned zerofill NULL NULL
NULL int NULL NULL
NULL mediumint NULL NULL
NULL smallint NULL NULL
@@ -963,33 +959,33 @@ NULL test tb2 f70 decimal NULL NULL NULL NULL decimal(63,30) unsigned zerofill
NULL test tb2 f71 decimal NULL NULL NULL NULL decimal(10,0) unsigned zerofill
NULL test tb2 f72 decimal NULL NULL NULL NULL decimal(63,30) unsigned zerofill
NULL test tb2 f73 double NULL NULL NULL NULL double
-NULL test tb2 f74 double unsigned NULL NULL NULL NULL double unsigned
-NULL test tb2 f75 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test tb2 f76 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test tb2 f74 double NULL NULL NULL NULL double unsigned
+NULL test tb2 f75 double NULL NULL NULL NULL double unsigned zerofill
+NULL test tb2 f76 double NULL NULL NULL NULL double unsigned zerofill
NULL test tb2 f77 double NULL NULL NULL NULL double
-NULL test tb2 f78 double unsigned NULL NULL NULL NULL double unsigned
-NULL test tb2 f79 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test tb2 f80 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test tb2 f78 double NULL NULL NULL NULL double unsigned
+NULL test tb2 f79 double NULL NULL NULL NULL double unsigned zerofill
+NULL test tb2 f80 double NULL NULL NULL NULL double unsigned zerofill
NULL test tb2 f81 float NULL NULL NULL NULL float
-NULL test tb2 f82 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb2 f83 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb2 f84 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f82 float NULL NULL NULL NULL float unsigned
+NULL test tb2 f83 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f84 float NULL NULL NULL NULL float unsigned zerofill
NULL test tb2 f85 float NULL NULL NULL NULL float
NULL test tb2 f86 float NULL NULL NULL NULL float
-NULL test tb2 f87 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb2 f88 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb2 f89 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb2 f90 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb2 f91 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb2 f92 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f87 float NULL NULL NULL NULL float unsigned
+NULL test tb2 f88 float NULL NULL NULL NULL float unsigned
+NULL test tb2 f89 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f90 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f91 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f92 float NULL NULL NULL NULL float unsigned zerofill
NULL test tb2 f93 float NULL NULL NULL NULL float
NULL test tb2 f94 double NULL NULL NULL NULL double
-NULL test tb2 f95 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb2 f96 double unsigned NULL NULL NULL NULL double unsigned
-NULL test tb2 f97 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb2 f98 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test tb2 f99 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb2 f100 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test tb2 f95 float NULL NULL NULL NULL float unsigned
+NULL test tb2 f96 double NULL NULL NULL NULL double unsigned
+NULL test tb2 f97 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f98 double NULL NULL NULL NULL double unsigned zerofill
+NULL test tb2 f99 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb2 f100 double NULL NULL NULL NULL double unsigned zerofill
NULL test tb2 f101 date NULL NULL NULL NULL date
NULL test tb2 f102 time NULL NULL NULL NULL time
NULL test tb2 f103 datetime NULL NULL NULL NULL datetime
@@ -1080,33 +1076,33 @@ NULL test tb4 f187 decimal NULL NULL NULL NULL decimal(63,30) unsigned zerofill
NULL test tb4 f188 decimal NULL NULL NULL NULL decimal(10,0) unsigned zerofill
NULL test tb4 f189 decimal NULL NULL NULL NULL decimal(63,30) unsigned zerofill
NULL test tb4 f190 double NULL NULL NULL NULL double
-NULL test tb4 f191 double unsigned NULL NULL NULL NULL double unsigned
-NULL test tb4 f192 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test tb4 f193 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test tb4 f191 double NULL NULL NULL NULL double unsigned
+NULL test tb4 f192 double NULL NULL NULL NULL double unsigned zerofill
+NULL test tb4 f193 double NULL NULL NULL NULL double unsigned zerofill
NULL test tb4 f194 double NULL NULL NULL NULL double
-NULL test tb4 f195 double unsigned NULL NULL NULL NULL double unsigned
-NULL test tb4 f196 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test tb4 f197 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test tb4 f195 double NULL NULL NULL NULL double unsigned
+NULL test tb4 f196 double NULL NULL NULL NULL double unsigned zerofill
+NULL test tb4 f197 double NULL NULL NULL NULL double unsigned zerofill
NULL test tb4 f198 float NULL NULL NULL NULL float
-NULL test tb4 f199 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb4 f200 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb4 f201 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f199 float NULL NULL NULL NULL float unsigned
+NULL test tb4 f200 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f201 float NULL NULL NULL NULL float unsigned zerofill
NULL test tb4 f202 float NULL NULL NULL NULL float
NULL test tb4 f203 float NULL NULL NULL NULL float
-NULL test tb4 f204 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb4 f205 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb4 f206 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb4 f207 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb4 f208 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb4 f209 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f204 float NULL NULL NULL NULL float unsigned
+NULL test tb4 f205 float NULL NULL NULL NULL float unsigned
+NULL test tb4 f206 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f207 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f208 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f209 float NULL NULL NULL NULL float unsigned zerofill
NULL test tb4 f210 float NULL NULL NULL NULL float
NULL test tb4 f211 double NULL NULL NULL NULL double
-NULL test tb4 f212 float unsigned NULL NULL NULL NULL float unsigned
-NULL test tb4 f213 double unsigned NULL NULL NULL NULL double unsigned
-NULL test tb4 f214 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb4 f215 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test tb4 f216 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test tb4 f217 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test tb4 f212 float NULL NULL NULL NULL float unsigned
+NULL test tb4 f213 double NULL NULL NULL NULL double unsigned
+NULL test tb4 f214 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f215 double NULL NULL NULL NULL double unsigned zerofill
+NULL test tb4 f216 float NULL NULL NULL NULL float unsigned zerofill
+NULL test tb4 f217 double NULL NULL NULL NULL double unsigned zerofill
NULL test tb4 f218 date NULL NULL NULL NULL date
NULL test tb4 f219 time NULL NULL NULL NULL time
NULL test tb4 f220 datetime NULL NULL NULL NULL datetime
@@ -1147,33 +1143,33 @@ NULL test1 tb2 f70 decimal NULL NULL NULL NULL decimal(63,30) unsigned zerofill
NULL test1 tb2 f71 decimal NULL NULL NULL NULL decimal(10,0) unsigned zerofill
NULL test1 tb2 f72 decimal NULL NULL NULL NULL decimal(63,30) unsigned zerofill
NULL test1 tb2 f73 double NULL NULL NULL NULL double
-NULL test1 tb2 f74 double unsigned NULL NULL NULL NULL double unsigned
-NULL test1 tb2 f75 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test1 tb2 f76 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test1 tb2 f74 double NULL NULL NULL NULL double unsigned
+NULL test1 tb2 f75 double NULL NULL NULL NULL double unsigned zerofill
+NULL test1 tb2 f76 double NULL NULL NULL NULL double unsigned zerofill
NULL test1 tb2 f77 double NULL NULL NULL NULL double
-NULL test1 tb2 f78 double unsigned NULL NULL NULL NULL double unsigned
-NULL test1 tb2 f79 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test1 tb2 f80 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test1 tb2 f78 double NULL NULL NULL NULL double unsigned
+NULL test1 tb2 f79 double NULL NULL NULL NULL double unsigned zerofill
+NULL test1 tb2 f80 double NULL NULL NULL NULL double unsigned zerofill
NULL test1 tb2 f81 float NULL NULL NULL NULL float
-NULL test1 tb2 f82 float unsigned NULL NULL NULL NULL float unsigned
-NULL test1 tb2 f83 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test1 tb2 f84 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f82 float NULL NULL NULL NULL float unsigned
+NULL test1 tb2 f83 float NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f84 float NULL NULL NULL NULL float unsigned zerofill
NULL test1 tb2 f85 float NULL NULL NULL NULL float
NULL test1 tb2 f86 float NULL NULL NULL NULL float
-NULL test1 tb2 f87 float unsigned NULL NULL NULL NULL float unsigned
-NULL test1 tb2 f88 float unsigned NULL NULL NULL NULL float unsigned
-NULL test1 tb2 f89 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test1 tb2 f90 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test1 tb2 f91 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test1 tb2 f92 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f87 float NULL NULL NULL NULL float unsigned
+NULL test1 tb2 f88 float NULL NULL NULL NULL float unsigned
+NULL test1 tb2 f89 float NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f90 float NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f91 float NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f92 float NULL NULL NULL NULL float unsigned zerofill
NULL test1 tb2 f93 float NULL NULL NULL NULL float
NULL test1 tb2 f94 double NULL NULL NULL NULL double
-NULL test1 tb2 f95 float unsigned NULL NULL NULL NULL float unsigned
-NULL test1 tb2 f96 double unsigned NULL NULL NULL NULL double unsigned
-NULL test1 tb2 f97 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test1 tb2 f98 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
-NULL test1 tb2 f99 float unsigned zerofill NULL NULL NULL NULL float unsigned zerofill
-NULL test1 tb2 f100 double unsigned zerofill NULL NULL NULL NULL double unsigned zerofill
+NULL test1 tb2 f95 float NULL NULL NULL NULL float unsigned
+NULL test1 tb2 f96 double NULL NULL NULL NULL double unsigned
+NULL test1 tb2 f97 float NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f98 double NULL NULL NULL NULL double unsigned zerofill
+NULL test1 tb2 f99 float NULL NULL NULL NULL float unsigned zerofill
+NULL test1 tb2 f100 double NULL NULL NULL NULL double unsigned zerofill
NULL test1 tb2 f101 date NULL NULL NULL NULL date
NULL test1 tb2 f102 time NULL NULL NULL NULL time
NULL test1 tb2 f103 datetime NULL NULL NULL NULL datetime
diff --git a/mysql-test/suite/funcs_1/r/is_columns_mysql.result b/mysql-test/suite/funcs_1/r/is_columns_mysql.result
index 9d1f316a9bf..2f1f61c0525 100644
--- a/mysql-test/suite/funcs_1/r/is_columns_mysql.result
+++ b/mysql-test/suite/funcs_1/r/is_columns_mysql.result
@@ -48,7 +48,7 @@ NULL mysql event last_executed 10 NULL YES datetime NULL NULL NULL NULL NULL NUL
NULL mysql event modified 9 0000-00-00 00:00:00 NO timestamp NULL NULL NULL NULL NULL NULL timestamp select,insert,update,references
NULL mysql event name 2 NO char 64 192 NULL NULL utf8 utf8_general_ci char(64) PRI select,insert,update,references
NULL mysql event on_completion 14 DROP NO enum 8 24 NULL NULL utf8 utf8_general_ci enum('DROP','PRESERVE') select,insert,update,references
-NULL mysql event originator 17 NULL NO int NULL NULL 10 0 NULL NULL int(10) select,insert,update,references
+NULL mysql event originator 17 NULL NO int NULL NULL 10 0 NULL NULL int(10) unsigned select,insert,update,references
NULL mysql event sql_mode 15 NO set 478 1434 NULL NULL utf8 utf8_general_ci set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') select,insert,update,references
NULL mysql event starts 11 NULL YES datetime NULL NULL NULL NULL NULL NULL datetime select,insert,update,references
NULL mysql event status 13 ENABLED NO enum 18 54 NULL NULL utf8 utf8_general_ci enum('ENABLED','DISABLED','SLAVESIDE_DISABLED') select,insert,update,references
@@ -60,7 +60,7 @@ NULL mysql func type 4 NULL NO enum 9 27 NULL NULL utf8 utf8_general_ci enum('fu
NULL mysql general_log argument 6 NULL NO mediumtext 16777215 16777215 NULL NULL utf8 utf8_general_ci mediumtext select,insert,update,references
NULL mysql general_log command_type 5 NULL NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select,insert,update,references
NULL mysql general_log event_time 1 CURRENT_TIMESTAMP NO timestamp NULL NULL NULL NULL NULL NULL timestamp on update CURRENT_TIMESTAMP select,insert,update,references
-NULL mysql general_log server_id 4 NULL NO int NULL NULL 10 0 NULL NULL int(11) select,insert,update,references
+NULL mysql general_log server_id 4 NULL NO int NULL NULL 10 0 NULL NULL int(10) unsigned select,insert,update,references
NULL mysql general_log thread_id 3 NULL NO int NULL NULL 10 0 NULL NULL int(11) select,insert,update,references
NULL mysql general_log user_host 2 NULL NO mediumtext 16777215 16777215 NULL NULL utf8 utf8_general_ci mediumtext select,insert,update,references
NULL mysql help_category help_category_id 1 NULL NO smallint NULL NULL 5 0 NULL NULL smallint(5) unsigned PRI select,insert,update,references
@@ -150,7 +150,7 @@ NULL mysql slow_log lock_time 4 NULL NO time NULL NULL NULL NULL NULL NULL time
NULL mysql slow_log query_time 3 NULL NO time NULL NULL NULL NULL NULL NULL time select,insert,update,references
NULL mysql slow_log rows_examined 6 NULL NO int NULL NULL 10 0 NULL NULL int(11) select,insert,update,references
NULL mysql slow_log rows_sent 5 NULL NO int NULL NULL 10 0 NULL NULL int(11) select,insert,update,references
-NULL mysql slow_log server_id 10 NULL NO int NULL NULL 10 0 NULL NULL int(11) select,insert,update,references
+NULL mysql slow_log server_id 10 NULL NO int NULL NULL 10 0 NULL NULL int(10) unsigned select,insert,update,references
NULL mysql slow_log sql_text 11 NULL NO mediumtext 16777215 16777215 NULL NULL utf8 utf8_general_ci mediumtext select,insert,update,references
NULL mysql slow_log start_time 1 CURRENT_TIMESTAMP NO timestamp NULL NULL NULL NULL NULL NULL timestamp on update CURRENT_TIMESTAMP select,insert,update,references
NULL mysql slow_log user_host 2 NULL NO mediumtext 16777215 16777215 NULL NULL utf8 utf8_general_ci mediumtext select,insert,update,references
@@ -329,7 +329,7 @@ NULL mysql event ends datetime NULL NULL NULL NULL datetime
3.0000 mysql event on_completion enum 8 24 utf8 utf8_general_ci enum('DROP','PRESERVE')
3.0000 mysql event sql_mode set 478 1434 utf8 utf8_general_ci set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH')
3.0000 mysql event comment char 64 192 utf8 utf8_bin char(64)
-NULL mysql event originator int NULL NULL NULL NULL int(10)
+NULL mysql event originator int NULL NULL NULL NULL int(10) unsigned
1.0000 mysql event time_zone char 64 64 latin1 latin1_swedish_ci char(64)
3.0000 mysql event character_set_client char 32 96 utf8 utf8_bin char(32)
3.0000 mysql event collation_connection char 32 96 utf8 utf8_bin char(32)
@@ -342,7 +342,7 @@ NULL mysql func ret tinyint NULL NULL NULL NULL tinyint(1)
NULL mysql general_log event_time timestamp NULL NULL NULL NULL timestamp
1.0000 mysql general_log user_host mediumtext 16777215 16777215 utf8 utf8_general_ci mediumtext
NULL mysql general_log thread_id int NULL NULL NULL NULL int(11)
-NULL mysql general_log server_id int NULL NULL NULL NULL int(11)
+NULL mysql general_log server_id int NULL NULL NULL NULL int(10) unsigned
3.0000 mysql general_log command_type varchar 64 192 utf8 utf8_general_ci varchar(64)
1.0000 mysql general_log argument mediumtext 16777215 16777215 utf8 utf8_general_ci mediumtext
NULL mysql help_category help_category_id smallint NULL NULL NULL NULL smallint(5) unsigned
@@ -434,7 +434,7 @@ NULL mysql slow_log rows_examined int NULL NULL NULL NULL int(11)
3.0000 mysql slow_log db varchar 512 1536 utf8 utf8_general_ci varchar(512)
NULL mysql slow_log last_insert_id int NULL NULL NULL NULL int(11)
NULL mysql slow_log insert_id int NULL NULL NULL NULL int(11)
-NULL mysql slow_log server_id int NULL NULL NULL NULL int(11)
+NULL mysql slow_log server_id int NULL NULL NULL NULL int(10) unsigned
1.0000 mysql slow_log sql_text mediumtext 16777215 16777215 utf8 utf8_general_ci mediumtext
3.0000 mysql tables_priv Host char 60 180 utf8 utf8_bin char(60)
3.0000 mysql tables_priv Db char 64 192 utf8 utf8_bin char(64)
diff --git a/mysql-test/suite/funcs_1/r/memory_views.result b/mysql-test/suite/funcs_1/r/memory_views.result
index 856a8c5a893..ccbd086b71f 100644
--- a/mysql-test/suite/funcs_1/r/memory_views.result
+++ b/mysql-test/suite/funcs_1/r/memory_views.result
@@ -21369,7 +21369,7 @@ ERROR 42S02: Table 'test.v1' doesn't exist
CHECK TABLE v1;
Table Op Msg_type Msg_text
test.v1 check Error Table 'test.v1' doesn't exist
-test.v1 check error Corrupt
+test.v1 check status Operation failed
DESCRIBE v1;
ERROR 42S02: Table 'test.v1' doesn't exist
EXPLAIN SELECT * FROM v1;
diff --git a/mysql-test/suite/funcs_1/r/myisam_views.result b/mysql-test/suite/funcs_1/r/myisam_views.result
index 3884657c925..9b07a0ae45b 100644
--- a/mysql-test/suite/funcs_1/r/myisam_views.result
+++ b/mysql-test/suite/funcs_1/r/myisam_views.result
@@ -23044,7 +23044,7 @@ ERROR 42S02: Table 'test.v1' doesn't exist
CHECK TABLE v1;
Table Op Msg_type Msg_text
test.v1 check Error Table 'test.v1' doesn't exist
-test.v1 check error Corrupt
+test.v1 check status Operation failed
DESCRIBE v1;
ERROR 42S02: Table 'test.v1' doesn't exist
EXPLAIN SELECT * FROM v1;
diff --git a/mysql-test/suite/funcs_1/r/ndb_views.result b/mysql-test/suite/funcs_1/r/ndb_views.result
index 430f1180fc9..b75f4955986 100644
--- a/mysql-test/suite/funcs_1/r/ndb_views.result
+++ b/mysql-test/suite/funcs_1/r/ndb_views.result
@@ -21367,7 +21367,7 @@ ERROR 42S02: Table 'test.v1' doesn't exist
CHECK TABLE v1;
Table Op Msg_type Msg_text
test.v1 check Error Table 'test.v1' doesn't exist
-test.v1 check error Corrupt
+test.v1 check status Operation failed
DESCRIBE v1;
ERROR 42S02: Table 'test.v1' doesn't exist
EXPLAIN SELECT * FROM v1;
diff --git a/mysql-test/suite/funcs_1/r/processlist_priv_no_prot.result b/mysql-test/suite/funcs_1/r/processlist_priv_no_prot.result
index d862b7424e0..3d341292be1 100644
--- a/mysql-test/suite/funcs_1/r/processlist_priv_no_prot.result
+++ b/mysql-test/suite/funcs_1/r/processlist_priv_no_prot.result
@@ -27,7 +27,7 @@ PROCESSLIST CREATE TEMPORARY TABLE `PROCESSLIST` (
`HOST` varchar(64) NOT NULL DEFAULT '',
`DB` varchar(64) DEFAULT NULL,
`COMMAND` varchar(16) NOT NULL DEFAULT '',
- `TIME` bigint(7) NOT NULL DEFAULT '0',
+ `TIME` int(7) NOT NULL DEFAULT '0',
`STATE` varchar(64) DEFAULT NULL,
`INFO` longtext
) ENGINE=MyISAM DEFAULT CHARSET=utf8
@@ -97,7 +97,7 @@ PROCESSLIST CREATE TEMPORARY TABLE `PROCESSLIST` (
`HOST` varchar(64) NOT NULL DEFAULT '',
`DB` varchar(64) DEFAULT NULL,
`COMMAND` varchar(16) NOT NULL DEFAULT '',
- `TIME` bigint(7) NOT NULL DEFAULT '0',
+ `TIME` int(7) NOT NULL DEFAULT '0',
`STATE` varchar(64) DEFAULT NULL,
`INFO` longtext
) ENGINE=MyISAM DEFAULT CHARSET=utf8
diff --git a/mysql-test/suite/funcs_1/r/processlist_val_no_prot.result b/mysql-test/suite/funcs_1/r/processlist_val_no_prot.result
index 482e143fd23..b0cae801fd6 100644
--- a/mysql-test/suite/funcs_1/r/processlist_val_no_prot.result
+++ b/mysql-test/suite/funcs_1/r/processlist_val_no_prot.result
@@ -17,7 +17,7 @@ PROCESSLIST CREATE TEMPORARY TABLE `PROCESSLIST` (
`HOST` varchar(64) NOT NULL DEFAULT '',
`DB` varchar(64) DEFAULT NULL,
`COMMAND` varchar(16) NOT NULL DEFAULT '',
- `TIME` bigint(7) NOT NULL DEFAULT '0',
+ `TIME` int(7) NOT NULL DEFAULT '0',
`STATE` varchar(64) DEFAULT NULL,
`INFO` longtext
) ENGINE=MyISAM DEFAULT CHARSET=utf8
diff --git a/mysql-test/suite/ndb/r/ndb_restore.result b/mysql-test/suite/ndb/r/ndb_restore.result
index 48c32bc14b6..f6b50a1dfdc 100644
--- a/mysql-test/suite/ndb/r/ndb_restore.result
+++ b/mysql-test/suite/ndb/r/ndb_restore.result
@@ -131,8 +131,9 @@ create table t9 engine=myisam as select * from t9_c;
create table t10 engine=myisam as select * from t10_c;
ForceVarPart: 0
ForceVarPart: 1
-CREATE TEMPORARY TABLE test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
-LOAD DATA INFILE 'DUMP_FILE' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
+CREATE TEMPORARY TABLE IF NOT EXISTS test.backup_info
+(id INT, backup_id INT) ENGINE = MEMORY;
+LOAD DATA INFILE '<MYSQLTEST_VARDIR>/tmp.dat' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
DROP TABLE test.backup_info;
drop table t1_c,t2_c,t3_c,t4_c,t5_c,t6_c,t7_c,t8_c,t9_c,t10_c;
ForceVarPart: 0
@@ -286,8 +287,9 @@ auto_increment
10001
ALTER TABLE t7_c
PARTITION BY LINEAR KEY (`dardtestard`);
-CREATE TEMPORARY TABLE test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
-LOAD DATA INFILE 'DUMP_FILE' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
+CREATE TEMPORARY TABLE IF NOT EXISTS test.backup_info
+(id INT, backup_id INT) ENGINE = MEMORY;
+LOAD DATA INFILE '<MYSQLTEST_VARDIR>/tmp.dat' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
DROP TABLE test.backup_info;
drop table t1_c,t2_c,t3_c,t4_c,t5_c,t6_c,t7_c,t8_c,t9_c,t10_c;
select count(*) from t1;
@@ -490,8 +492,9 @@ select * from t9_c) a;
count(*)
3
drop table t1_c,t3_c,t4_c,t5_c,t6_c,t7_c,t8_c,t9_c,t10_c;
-CREATE TEMPORARY TABLE test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
-LOAD DATA INFILE 'DUMP_FILE' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
+CREATE TEMPORARY TABLE IF NOT EXISTS test.backup_info
+(id INT, backup_id INT) ENGINE = MEMORY;
+LOAD DATA INFILE '<MYSQLTEST_VARDIR>/tmp.dat' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
DROP TABLE test.backup_info;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
drop table if exists t2_c;
diff --git a/mysql-test/suite/ndb/r/ndb_restore_partition.result b/mysql-test/suite/ndb/r/ndb_restore_partition.result
index 58a35437a2e..b984c76a91d 100644
--- a/mysql-test/suite/ndb/r/ndb_restore_partition.result
+++ b/mysql-test/suite/ndb/r/ndb_restore_partition.result
@@ -125,8 +125,9 @@ create table t6 engine=myisam as select * from t6_c;
create table t7 engine=myisam as select * from t7_c;
create table t8 engine=myisam as select * from t8_c;
create table t9 engine=myisam as select * from t9_c;
-CREATE TEMPORARY TABLE test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
-LOAD DATA INFILE 'DUMP_FILE' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
+CREATE TEMPORARY TABLE IF NOT EXISTS test.backup_info
+(id INT, backup_id INT) ENGINE = MEMORY;
+LOAD DATA INFILE '<MYSQLTEST_VARDIR>/tmp.dat' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
DROP TABLE test.backup_info;
drop table t1_c,t2_c,t3_c,t4_c,t5_c,t6_c,t7_c,t8_c,t9_c;
select count(*) from t1;
@@ -244,8 +245,9 @@ PARTITION BY LINEAR HASH (`relatta`)
PARTITIONS 4;
ALTER TABLE t7_c
PARTITION BY LINEAR KEY (`dardtestard`);
-CREATE TEMPORARY TABLE test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
-LOAD DATA INFILE 'DUMP_FILE' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
+CREATE TEMPORARY TABLE IF NOT EXISTS test.backup_info
+(id INT, backup_id INT) ENGINE = MEMORY;
+LOAD DATA INFILE '<MYSQLTEST_VARDIR>/tmp.dat' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
DROP TABLE test.backup_info;
drop table t1_c,t2_c,t3_c,t4_c,t5_c,t6_c,t7_c,t8_c,t9_c;
select count(*) from t1;
@@ -448,8 +450,9 @@ select * from t9_c) a;
count(*)
3
drop table t1_c,t3_c,t4_c,t5_c,t6_c,t7_c,t8_c,t9_c;
-CREATE TEMPORARY TABLE test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
-LOAD DATA INFILE 'DUMP_FILE' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
+CREATE TEMPORARY TABLE IF NOT EXISTS test.backup_info
+(id INT, backup_id INT) ENGINE = MEMORY;
+LOAD DATA INFILE '<MYSQLTEST_VARDIR>/tmp.dat' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
DROP TABLE test.backup_info;
Create table test/def/t2_c failed: Translate frm error
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
diff --git a/mysql-test/suite/ndb/r/ndb_restore_print.result b/mysql-test/suite/ndb/r/ndb_restore_print.result
index 7ff15652b3f..fa52513e7d0 100644
--- a/mysql-test/suite/ndb/r/ndb_restore_print.result
+++ b/mysql-test/suite/ndb/r/ndb_restore_print.result
@@ -227,8 +227,9 @@ hex(h3) NULL
hex(i1) NULL
hex(i2) NULL
hex(i3) NULL
-CREATE TEMPORARY TABLE test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
-LOAD DATA INFILE 'DUMP_FILE' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
+CREATE TEMPORARY TABLE IF NOT EXISTS test.backup_info
+(id INT, backup_id INT) ENGINE = MEMORY;
+LOAD DATA INFILE '<MYSQLTEST_VARDIR>/tmp.dat' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
DROP TABLE test.backup_info;
1;0x1;0x17;0x789A;0x789ABCDE;0xFEDC0001;127;255;32767;65535;2147483647;4294967295;9223372036854775807;18446744073709551615;1;12345678901234567890123456789012;123456789;1;12345678901234567890123456789012;123456789;0x12;0x123456789ABCDEF0;0x012345;0x12;0x123456789ABCDEF0;0x00123450
2;0x0;0x0;0x0;0x0;0x0;-128;0;-32768;0;-2147483648;0;-9223372036854775808;0;;;;;;;0x0;0x0;0x0;0x0;0x0;0x0
@@ -257,8 +258,9 @@ create table t4 (pk int key, a int) engine ndb;
insert into t2 values (1,11),(2,12),(3,13),(4,14),(5,15);
insert into t3 values (1,21),(2,22),(3,23),(4,24),(5,25);
insert into t4 values (1,31),(2,32),(3,33),(4,34),(5,35);
-CREATE TEMPORARY TABLE test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
-LOAD DATA INFILE 'DUMP_FILE' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
+CREATE TEMPORARY TABLE IF NOT EXISTS test.backup_info
+(id INT, backup_id INT) ENGINE = MEMORY;
+LOAD DATA INFILE '<MYSQLTEST_VARDIR>/tmp.dat' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
DROP TABLE test.backup_info;
'1' '1' '12345678901234567890123456789012' '123456789' '1' '12345678901234567890123456789012' '123456789' '0x20' '0x123456789ABCDEF020' '0x012345000020' '0x1200000020' '0x123456789ABCDEF000000020' '0x00123450000020'
@@ -297,8 +299,9 @@ create table t1
insert into t1 values(1, 8388607, 16777215);
insert into t1 values(2, -8388608, 0);
insert into t1 values(3, -1, 1);
-CREATE TEMPORARY TABLE test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
-LOAD DATA INFILE 'DUMP_FILE' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
+CREATE TEMPORARY TABLE IF NOT EXISTS test.backup_info
+(id INT, backup_id INT) ENGINE = MEMORY;
+LOAD DATA INFILE '<MYSQLTEST_VARDIR>/tmp.dat' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
DROP TABLE test.backup_info;
1;8388607;16777215
2;-8388608;0
diff --git a/mysql-test/suite/ndb_team/r/ndb_dd_backuprestore.result b/mysql-test/suite/ndb_team/r/ndb_dd_backuprestore.result
index 102a96a15f4..12a65a433a3 100644
--- a/mysql-test/suite/ndb_team/r/ndb_dd_backuprestore.result
+++ b/mysql-test/suite/ndb_team/r/ndb_dd_backuprestore.result
@@ -27,8 +27,9 @@ pk1 c2 c3 hex(c4)
3 Sweden 498 1
4 Sweden 497 1
5 Sweden 496 1
-CREATE TEMPORARY TABLE test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
-LOAD DATA INFILE 'DUMP_FILE' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
+CREATE TEMPORARY TABLE IF NOT EXISTS test.backup_info
+(id INT, backup_id INT) ENGINE = MEMORY;
+LOAD DATA INFILE '<MYSQLTEST_VARDIR>/tmp.dat' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
DROP TABLE test.backup_info;
DROP TABLE test.t1;
ALTER TABLESPACE table_space1
@@ -91,8 +92,9 @@ LENGTH(data)
SELECT LENGTH(data) FROM test.t4 WHERE c1 = 2;
LENGTH(data)
16384
-CREATE TEMPORARY TABLE test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
-LOAD DATA INFILE 'DUMP_FILE' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
+CREATE TEMPORARY TABLE IF NOT EXISTS test.backup_info
+(id INT, backup_id INT) ENGINE = MEMORY;
+LOAD DATA INFILE '<MYSQLTEST_VARDIR>/tmp.dat' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
DROP TABLE test.backup_info;
DROP TABLE test.t1;
DROP TABLE test.t2;
@@ -317,8 +319,9 @@ pk1 c2 c3 hex(c4)
248 TEXASTEXASTEXASTEXASTEXASTEXASTEXASTEXASTEXASTEXAS, ITALY, Kyle, JO, JBM,TU 4 1
247 TEXASTEXASTEXASTEXASTEXASTEXASTEXASTEXASTEXASTEXAS, ITALY, Kyle, JO, JBM,TU 6 1
246 TEXASTEXASTEXASTEXASTEXASTEXASTEXASTEXASTEXASTEXAS, ITALY, Kyle, JO, JBM,TU 8 1
-CREATE TEMPORARY TABLE test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
-LOAD DATA INFILE 'DUMP_FILE' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
+CREATE TEMPORARY TABLE IF NOT EXISTS test.backup_info
+(id INT, backup_id INT) ENGINE = MEMORY;
+LOAD DATA INFILE '<MYSQLTEST_VARDIR>/tmp.dat' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
DROP TABLE test.backup_info;
DROP TABLE test.t1;
DROP TABLE test.t2;
diff --git a/mysql-test/suite/ndb_team/t/ndb_autodiscover.test b/mysql-test/suite/ndb_team/t/ndb_autodiscover.test
index a2fb0c3b25f..9ded27cea31 100644
--- a/mysql-test/suite/ndb_team/t/ndb_autodiscover.test
+++ b/mysql-test/suite/ndb_team/t/ndb_autodiscover.test
@@ -1,6 +1,12 @@
-- source include/have_ndb.inc
-- source include/not_embedded.inc
+# Bug#41308: Test main.ndb_autodiscover.test doesn't work on Windows due
+# to 'grep' calls
+# Test is currently disabled on Windows via the next line until this bug
+# can be resolved.
+--source include/not_windows.inc
+
--disable_warnings
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
--enable_warnings
diff --git a/mysql-test/suite/parts/inc/partition_auto_increment.inc b/mysql-test/suite/parts/inc/partition_auto_increment.inc
index 26375c72c0c..6963de90c83 100644
--- a/mysql-test/suite/parts/inc/partition_auto_increment.inc
+++ b/mysql-test/suite/parts/inc/partition_auto_increment.inc
@@ -29,10 +29,11 @@ INSERT INTO t1 VALUES (5), (16);
if (!$mysql_errno)
{
echo # ERROR (only OK if Blackhole) should give ER_DUP_KEY or ER_DUP_ENTRY;
+ echo # mysql_errno: $mysql_errno;
}
INSERT INTO t1 VALUES (17);
INSERT INTO t1 VALUES (19), (NULL);
--- error 0, ER_DUP_KEY
+-- error 0, ER_DUP_ENTRY, ER_DUP_KEY
INSERT INTO t1 VALUES (NULL), (10), (NULL);
if ($mysql_errno)
{
@@ -116,16 +117,17 @@ ENGINE=$engine
PARTITION BY HASH(c2)
PARTITIONS 2;
INSERT INTO t1 VALUES (1, NULL);
--- error 0, ER_DUP_KEY
+-- error 0, ER_DUP_KEY, ER_DUP_ENTRY
INSERT INTO t1 VALUES (1, 1), (99, 99);
if (!$mysql_errno)
{
echo # ERROR (only OK if Blackhole) should give ER_DUP_KEY or ER_DUP_ENTRY;
+ echo # mysql_errno: $mysql_errno;
}
INSERT INTO t1 VALUES (1, NULL);
let $old_sql_mode = `select @@session.sql_mode`;
SET @@session.sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
--- error 0, ER_DUP_KEY
+-- error 0, ER_DUP_ENTRY, ER_DUP_KEY
INSERT INTO t1 VALUES (1, 0);
if ($mysql_errno)
{
@@ -140,7 +142,7 @@ eval CREATE TABLE t1 (
ENGINE=$engine
PARTITION BY HASH(c2)
PARTITIONS 2;
--- error 0, ER_DUP_KEY
+-- error 0, ER_DUP_ENTRY, ER_DUP_KEY
INSERT INTO t1 VALUES (1, 0);
if ($mysql_errno)
{
@@ -163,26 +165,27 @@ PARTITION BY HASH(c1)
PARTITIONS 2;
INSERT INTO t1 VALUES (2), (4), (NULL);
INSERT INTO t1 VALUES (0);
--- error 0, ER_DUP_KEY
+-- error 0, ER_DUP_KEY, ER_DUP_ENTRY
INSERT INTO t1 VALUES (5), (16);
if (!$mysql_errno)
{
echo # ERROR (only OK if Blackhole) should give ER_DUP_KEY or ER_DUP_ENTRY;
+ echo # mysql_errno: $mysql_errno;
}
INSERT INTO t1 VALUES (17), (19), (NULL);
--- error 0, ER_DUP_KEY
+-- error 0, ER_DUP_ENTRY, ER_DUP_KEY
INSERT INTO t1 VALUES (NULL), (10), (NULL);
if ($mysql_errno)
{
echo # ERROR (only OK if Archive) mysql_errno: $mysql_errno;
}
--- error 0, ER_DUP_KEY
+-- error 0, ER_DUP_ENTRY, ER_DUP_KEY
INSERT INTO t1 VALUES (NULL), (9);
if ($mysql_errno)
{
echo # ERROR (only OK if Archive) mysql_errno: $mysql_errno;
}
--- error 0, ER_DUP_KEY
+-- error 0, ER_DUP_ENTRY, ER_DUP_KEY
INSERT INTO t1 VALUES (59), (55);
if ($mysql_errno)
{
@@ -270,7 +273,7 @@ SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
AND TABLE_NAME='t1';
SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
AND TABLE_NAME='t1';
--- error 0, ER_DUP_KEY
+-- error 0, ER_DUP_ENTRY, ER_DUP_KEY
INSERT INTO t1 VALUES (10);
if ($mysql_errno)
{
@@ -281,7 +284,7 @@ INSERT INTO t1 VALUES (NULL);
SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
AND TABLE_NAME='t1';
INSERT INTO t1 VALUES (NULL);
--- error 0, ER_DUP_KEY
+-- error 0, ER_DUP_ENTRY, ER_DUP_KEY
INSERT INTO t1 VALUES (15);
if ($mysql_errno)
{
@@ -340,7 +343,7 @@ connection con1;
INSERT INTO t1 (c1) VALUES (NULL);
connection default;
-- echo # con default
--- error 0, ER_DUP_KEY
+-- error 0, ER_DUP_ENTRY, ER_DUP_KEY
INSERT INTO t1 (c1) VALUES (16);
if ($mysql_errno)
{
@@ -426,7 +429,7 @@ connection con1;
INSERT INTO t1 (c1) VALUES (NULL);
connection default;
-- echo # con default
--- error 0, ER_DUP_KEY
+-- error 0, ER_DUP_ENTRY, ER_DUP_KEY
INSERT INTO t1 (c1) VALUES (16);
if ($mysql_errno)
{
@@ -483,6 +486,7 @@ INSERT INTO t1 VALUES (1, 1);
if (!$mysql_errno)
{
echo # ERROR (only OK if Blackhole) should give ER_DUP_KEY or ER_DUP_ENTRY;
+ echo # mysql_errno: $mysql_errno;
}
INSERT INTO t1 VALUES (1, NULL);
INSERT INTO t1 VALUES (2, NULL), (3, 11), (3, NULL), (2, 0);
@@ -492,6 +496,7 @@ INSERT INTO t1 VALUES (2, 2);
if (!$mysql_errno)
{
echo # ERROR (only OK if Blackhole) should give ER_DUP_KEY or ER_DUP_ENTRY;
+ echo # mysql_errno: $mysql_errno;
}
INSERT INTO t1 VALUES (2, 22);
INSERT INTO t1 VALUES (2, NULL);
@@ -527,16 +532,18 @@ INSERT INTO t1 VALUES (1, 1);
if (!$mysql_errno)
{
echo # ERROR (only OK if Blackhole) should give ER_DUP_KEY or ER_DUP_ENTRY;
+ echo # mysql_errno: $mysql_errno;
}
INSERT INTO t1 VALUES (1, NULL);
INSERT INTO t1 VALUES (2, NULL);
INSERT INTO t1 VALUES (3, NULL);
INSERT INTO t1 VALUES (3, NULL), (2, 0), (2, NULL);
--- error 0, ER_DUP_KEY
+-- error 0, ER_DUP_ENTRY, ER_DUP_KEY
INSERT INTO t1 VALUES (2, 2);
if (!$mysql_errno)
{
-echo # ERROR (only OK if Blackhole/NDB) should give ER_DUP_KEY or ER_DUP_ENTRY;
+ echo # ERROR (only OK if Blackhole/NDB) should give ER_DUP_KEY or ER_DUP_ENTRY;
+ echo # mysql_errno: $mysql_errno;
}
INSERT INTO t1 VALUES (2, 22), (2, NULL);
SELECT * FROM t1 ORDER BY c1,c2;
@@ -550,7 +557,7 @@ eval CREATE TABLE t1 (c1 INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (c1))
PARTITION BY HASH(c1)
PARTITIONS 2;
SHOW CREATE TABLE t1;
--- error 0, ER_DUP_KEY
+-- error 0, ER_DUP_ENTRY, ER_DUP_KEY
INSERT INTO t1 (c1) VALUES (4);
if ($mysql_errno)
{
@@ -568,7 +575,7 @@ let $old_sql_mode = `select @@session.sql_mode`;
SET @@session.sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
INSERT INTO t1 (c1) VALUES (300);
SHOW CREATE TABLE t1;
--- error 0, ER_DUP_KEY
+-- error 0, ER_DUP_ENTRY, ER_DUP_KEY
INSERT INTO t1 (c1) VALUES (0);
if ($mysql_errno)
{
diff --git a/mysql-test/suite/parts/r/ndb_dd_backuprestore.result b/mysql-test/suite/parts/r/ndb_dd_backuprestore.result
index 102a96a15f4..12a65a433a3 100644
--- a/mysql-test/suite/parts/r/ndb_dd_backuprestore.result
+++ b/mysql-test/suite/parts/r/ndb_dd_backuprestore.result
@@ -27,8 +27,9 @@ pk1 c2 c3 hex(c4)
3 Sweden 498 1
4 Sweden 497 1
5 Sweden 496 1
-CREATE TEMPORARY TABLE test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
-LOAD DATA INFILE 'DUMP_FILE' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
+CREATE TEMPORARY TABLE IF NOT EXISTS test.backup_info
+(id INT, backup_id INT) ENGINE = MEMORY;
+LOAD DATA INFILE '<MYSQLTEST_VARDIR>/tmp.dat' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
DROP TABLE test.backup_info;
DROP TABLE test.t1;
ALTER TABLESPACE table_space1
@@ -91,8 +92,9 @@ LENGTH(data)
SELECT LENGTH(data) FROM test.t4 WHERE c1 = 2;
LENGTH(data)
16384
-CREATE TEMPORARY TABLE test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
-LOAD DATA INFILE 'DUMP_FILE' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
+CREATE TEMPORARY TABLE IF NOT EXISTS test.backup_info
+(id INT, backup_id INT) ENGINE = MEMORY;
+LOAD DATA INFILE '<MYSQLTEST_VARDIR>/tmp.dat' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
DROP TABLE test.backup_info;
DROP TABLE test.t1;
DROP TABLE test.t2;
@@ -317,8 +319,9 @@ pk1 c2 c3 hex(c4)
248 TEXASTEXASTEXASTEXASTEXASTEXASTEXASTEXASTEXASTEXAS, ITALY, Kyle, JO, JBM,TU 4 1
247 TEXASTEXASTEXASTEXASTEXASTEXASTEXASTEXASTEXASTEXAS, ITALY, Kyle, JO, JBM,TU 6 1
246 TEXASTEXASTEXASTEXASTEXASTEXASTEXASTEXASTEXASTEXAS, ITALY, Kyle, JO, JBM,TU 8 1
-CREATE TEMPORARY TABLE test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
-LOAD DATA INFILE 'DUMP_FILE' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
+CREATE TEMPORARY TABLE IF NOT EXISTS test.backup_info
+(id INT, backup_id INT) ENGINE = MEMORY;
+LOAD DATA INFILE '<MYSQLTEST_VARDIR>/tmp.dat' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
DROP TABLE test.backup_info;
DROP TABLE test.t1;
DROP TABLE test.t2;
diff --git a/mysql-test/suite/parts/r/partition_alter1_1_2_innodb.result b/mysql-test/suite/parts/r/partition_alter1_1_2_innodb.result
index 7ab726136af..5d584e1da8b 100644
--- a/mysql-test/suite/parts/r/partition_alter1_1_2_innodb.result
+++ b/mysql-test/suite/parts/r/partition_alter1_1_2_innodb.result
@@ -86,7 +86,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -578,7 +578,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -1085,7 +1085,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -1588,7 +1588,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -2087,7 +2087,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -2597,7 +2597,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -3107,7 +3107,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -3607,7 +3607,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -4100,7 +4100,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -4592,7 +4592,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -5099,7 +5099,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -5602,7 +5602,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -6101,7 +6101,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -6611,7 +6611,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -7121,7 +7121,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -7621,7 +7621,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -8115,7 +8115,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -8623,7 +8623,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -9146,7 +9146,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -9665,7 +9665,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -10180,7 +10180,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -10706,7 +10706,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -11232,7 +11232,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -11748,7 +11748,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -12257,7 +12257,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -12765,7 +12765,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -13288,7 +13288,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -13807,7 +13807,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -14322,7 +14322,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -14848,7 +14848,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -15374,7 +15374,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -15890,7 +15890,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -16401,7 +16401,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -16894,7 +16894,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -17402,7 +17402,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -17906,7 +17906,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -18406,7 +18406,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -18917,7 +18917,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -19428,7 +19428,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -19929,7 +19929,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -20423,7 +20423,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -20916,7 +20916,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -21424,7 +21424,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -21928,7 +21928,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -22428,7 +22428,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -22939,7 +22939,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -23450,7 +23450,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -23951,7 +23951,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -24445,7 +24445,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -24938,7 +24938,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -25446,7 +25446,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -25950,7 +25950,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -26450,7 +26450,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -26961,7 +26961,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -27472,7 +27472,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -27973,7 +27973,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
diff --git a/mysql-test/suite/parts/r/partition_alter1_1_2_myisam.result b/mysql-test/suite/parts/r/partition_alter1_1_2_myisam.result
index 69f2bfa472e..dda69f141df 100644
--- a/mysql-test/suite/parts/r/partition_alter1_1_2_myisam.result
+++ b/mysql-test/suite/parts/r/partition_alter1_1_2_myisam.result
@@ -94,7 +94,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -617,7 +617,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -1161,7 +1161,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -1697,7 +1697,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -2233,7 +2233,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -2780,7 +2780,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -3327,7 +3327,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -3866,7 +3866,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -4384,7 +4384,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -4907,7 +4907,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -5451,7 +5451,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -5987,7 +5987,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -6523,7 +6523,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -7070,7 +7070,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -7617,7 +7617,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -8156,7 +8156,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
diff --git a/mysql-test/suite/parts/r/partition_alter1_1_innodb.result b/mysql-test/suite/parts/r/partition_alter1_1_innodb.result
index eeb55488d93..075346cfe94 100644
--- a/mysql-test/suite/parts/r/partition_alter1_1_innodb.result
+++ b/mysql-test/suite/parts/r/partition_alter1_1_innodb.result
@@ -404,7 +404,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -896,7 +896,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -1403,7 +1403,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -1906,7 +1906,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -2405,7 +2405,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -2917,7 +2917,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -3427,7 +3427,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -3927,7 +3927,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -4420,7 +4420,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -4912,7 +4912,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -5419,7 +5419,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -5922,7 +5922,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -6421,7 +6421,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -6933,7 +6933,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -7443,7 +7443,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -7943,7 +7943,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -8437,7 +8437,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -8945,7 +8945,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -9468,7 +9468,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -9987,7 +9987,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -10502,7 +10502,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -11030,7 +11030,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -11556,7 +11556,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -12072,7 +12072,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -12581,7 +12581,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -13089,7 +13089,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -13612,7 +13612,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -14131,7 +14131,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -14646,7 +14646,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -15174,7 +15174,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -15700,7 +15700,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -16216,7 +16216,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
diff --git a/mysql-test/suite/parts/r/partition_alter1_1_myisam.result b/mysql-test/suite/parts/r/partition_alter1_1_myisam.result
index 2137c37c3a2..9f616d04df3 100644
--- a/mysql-test/suite/parts/r/partition_alter1_1_myisam.result
+++ b/mysql-test/suite/parts/r/partition_alter1_1_myisam.result
@@ -253,7 +253,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -776,7 +776,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -1320,7 +1320,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -1856,7 +1856,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -2392,7 +2392,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -2941,7 +2941,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -3488,7 +3488,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -4027,7 +4027,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -4545,7 +4545,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -5068,7 +5068,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -5612,7 +5612,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -6148,7 +6148,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -6684,7 +6684,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -7233,7 +7233,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -7780,7 +7780,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -8319,7 +8319,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
diff --git a/mysql-test/suite/parts/r/partition_alter2_1_innodb.result b/mysql-test/suite/parts/r/partition_alter2_1_innodb.result
index 17d2c1384e0..fcccd52f571 100644
--- a/mysql-test/suite/parts/r/partition_alter2_1_innodb.result
+++ b/mysql-test/suite/parts/r/partition_alter2_1_innodb.result
@@ -3815,7 +3815,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -4307,7 +4307,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -4814,7 +4814,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -5317,7 +5317,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -5816,7 +5816,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -6328,7 +6328,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -6838,7 +6838,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -7338,7 +7338,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -7831,7 +7831,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -8323,7 +8323,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -8830,7 +8830,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -9333,7 +9333,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -9832,7 +9832,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -10344,7 +10344,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -10854,7 +10854,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -11354,7 +11354,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -11848,7 +11848,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -12356,7 +12356,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -12879,7 +12879,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -13398,7 +13398,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -13913,7 +13913,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -14441,7 +14441,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -14967,7 +14967,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -15483,7 +15483,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -15992,7 +15992,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -16500,7 +16500,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -17023,7 +17023,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -17542,7 +17542,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -18057,7 +18057,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -18585,7 +18585,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -19111,7 +19111,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -19627,7 +19627,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -27596,7 +27596,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -28088,7 +28088,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -28595,7 +28595,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -29098,7 +29098,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -29597,7 +29597,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -30109,7 +30109,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -30619,7 +30619,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -31119,7 +31119,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -31612,7 +31612,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -32104,7 +32104,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -32611,7 +32611,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -33114,7 +33114,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -33613,7 +33613,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -34123,7 +34123,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -34633,7 +34633,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -35133,7 +35133,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -35626,7 +35626,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -36118,7 +36118,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -36625,7 +36625,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -37128,7 +37128,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -37627,7 +37627,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -38139,7 +38139,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -38649,7 +38649,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -39149,7 +39149,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -39642,7 +39642,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -40134,7 +40134,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -40641,7 +40641,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -41144,7 +41144,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -41643,7 +41643,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -42153,7 +42153,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -42663,7 +42663,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -43163,7 +43163,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -43657,7 +43657,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -44165,7 +44165,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -44688,7 +44688,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -45207,7 +45207,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -45722,7 +45722,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -46250,7 +46250,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -46776,7 +46776,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -47292,7 +47292,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -47801,7 +47801,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -48309,7 +48309,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -48832,7 +48832,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -49351,7 +49351,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -49866,7 +49866,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -50392,7 +50392,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -50918,7 +50918,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -51434,7 +51434,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -51943,7 +51943,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -52451,7 +52451,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -52974,7 +52974,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -53493,7 +53493,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -54008,7 +54008,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -54536,7 +54536,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -55062,7 +55062,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -55578,7 +55578,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -56087,7 +56087,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -56595,7 +56595,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -57118,7 +57118,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -57637,7 +57637,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -58152,7 +58152,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -58678,7 +58678,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -59204,7 +59204,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -59720,7 +59720,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
diff --git a/mysql-test/suite/parts/r/partition_alter2_1_myisam.result b/mysql-test/suite/parts/r/partition_alter2_1_myisam.result
index 0e0428af48e..902ce9711be 100644
--- a/mysql-test/suite/parts/r/partition_alter2_1_myisam.result
+++ b/mysql-test/suite/parts/r/partition_alter2_1_myisam.result
@@ -3971,7 +3971,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -4494,7 +4494,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -5038,7 +5038,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -5574,7 +5574,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -6110,7 +6110,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -6659,7 +6659,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -7206,7 +7206,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -7745,7 +7745,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -8263,7 +8263,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -8786,7 +8786,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -9330,7 +9330,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -9866,7 +9866,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -10402,7 +10402,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -10951,7 +10951,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -11498,7 +11498,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -12037,7 +12037,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -20311,7 +20311,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -20834,7 +20834,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -21378,7 +21378,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -21914,7 +21914,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -22450,7 +22450,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -22999,7 +22999,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -23546,7 +23546,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -24085,7 +24085,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -24603,7 +24603,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -25126,7 +25126,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -25670,7 +25670,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -26206,7 +26206,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -26742,7 +26742,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -27289,7 +27289,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -27836,7 +27836,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -28375,7 +28375,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -28893,7 +28893,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -29416,7 +29416,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -29960,7 +29960,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -30496,7 +30496,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -31032,7 +31032,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -31581,7 +31581,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -32128,7 +32128,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -32667,7 +32667,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -33185,7 +33185,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -33708,7 +33708,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -34252,7 +34252,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -34788,7 +34788,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -35324,7 +35324,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -35871,7 +35871,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -36418,7 +36418,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -36957,7 +36957,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
diff --git a/mysql-test/suite/parts/r/partition_alter2_2_innodb.result b/mysql-test/suite/parts/r/partition_alter2_2_innodb.result
index e2cf04c35b3..cb9ea4ed60a 100644
--- a/mysql-test/suite/parts/r/partition_alter2_2_innodb.result
+++ b/mysql-test/suite/parts/r/partition_alter2_2_innodb.result
@@ -3826,7 +3826,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -4320,7 +4320,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -4829,7 +4829,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -5334,7 +5334,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -5833,7 +5833,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -6347,7 +6347,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -6857,7 +6857,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -7359,7 +7359,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -7854,7 +7854,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -8348,7 +8348,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -8857,7 +8857,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -9362,7 +9362,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -9861,7 +9861,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -10375,7 +10375,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -10885,7 +10885,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -11387,7 +11387,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -11883,7 +11883,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -12393,7 +12393,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -12918,7 +12918,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -13439,7 +13439,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -13954,7 +13954,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -14484,7 +14484,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -15010,7 +15010,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -15528,7 +15528,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -16039,7 +16039,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -16549,7 +16549,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -17074,7 +17074,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -17595,7 +17595,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -18110,7 +18110,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -18640,7 +18640,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -19166,7 +19166,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -19684,7 +19684,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -27712,7 +27712,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -28207,7 +28207,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -28717,7 +28717,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -29223,7 +29223,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -29727,7 +29727,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -30242,7 +30242,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -30757,7 +30757,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -31260,7 +31260,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -31756,7 +31756,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -32251,7 +32251,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -32761,7 +32761,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -33267,7 +33267,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -33771,7 +33771,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -34286,7 +34286,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -34801,7 +34801,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -35304,7 +35304,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -35800,7 +35800,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -36295,7 +36295,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -36805,7 +36805,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -37311,7 +37311,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -37815,7 +37815,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -38330,7 +38330,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -38845,7 +38845,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -39348,7 +39348,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -39844,7 +39844,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -40339,7 +40339,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -40849,7 +40849,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -41355,7 +41355,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -41859,7 +41859,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -42374,7 +42374,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -42889,7 +42889,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -43392,7 +43392,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -43889,7 +43889,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -44400,7 +44400,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -44926,7 +44926,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -45448,7 +45448,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -45968,7 +45968,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -46499,7 +46499,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -47030,7 +47030,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -47549,7 +47549,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -48061,7 +48061,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -48572,7 +48572,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -49098,7 +49098,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -49620,7 +49620,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -50140,7 +50140,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -50671,7 +50671,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -51202,7 +51202,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -51721,7 +51721,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -52233,7 +52233,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -52744,7 +52744,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -53270,7 +53270,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -53792,7 +53792,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -54312,7 +54312,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -54843,7 +54843,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -55374,7 +55374,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -55893,7 +55893,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -56405,7 +56405,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -56916,7 +56916,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -57442,7 +57442,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -57964,7 +57964,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -58484,7 +58484,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -59015,7 +59015,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -59546,7 +59546,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -60065,7 +60065,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
diff --git a/mysql-test/suite/parts/r/partition_alter2_2_myisam.result b/mysql-test/suite/parts/r/partition_alter2_2_myisam.result
index c63e8495f26..630ad0aaf08 100644
--- a/mysql-test/suite/parts/r/partition_alter2_2_myisam.result
+++ b/mysql-test/suite/parts/r/partition_alter2_2_myisam.result
@@ -3983,7 +3983,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -4508,7 +4508,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -5054,7 +5054,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -5592,7 +5592,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -6128,7 +6128,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -6679,7 +6679,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -7226,7 +7226,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -7767,7 +7767,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -8287,7 +8287,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -8812,7 +8812,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -9358,7 +9358,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -9896,7 +9896,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -10432,7 +10432,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -10983,7 +10983,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -11530,7 +11530,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -12071,7 +12071,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -20404,7 +20404,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -20930,7 +20930,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -21477,7 +21477,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -22016,7 +22016,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -22557,7 +22557,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -23109,7 +23109,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -23661,7 +23661,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -24203,7 +24203,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -24724,7 +24724,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -25250,7 +25250,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -25797,7 +25797,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -26336,7 +26336,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -26877,7 +26877,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -27429,7 +27429,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -27981,7 +27981,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -28523,7 +28523,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -29044,7 +29044,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -29570,7 +29570,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -30117,7 +30117,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -30656,7 +30656,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -31197,7 +31197,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -31749,7 +31749,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -32301,7 +32301,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -32843,7 +32843,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -33364,7 +33364,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -33890,7 +33890,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -34437,7 +34437,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -34976,7 +34976,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -35517,7 +35517,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -36069,7 +36069,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -36621,7 +36621,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -37163,7 +37163,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
diff --git a/mysql-test/suite/parts/r/partition_auto_increment_blackhole.result b/mysql-test/suite/parts/r/partition_auto_increment_blackhole.result
index ac39d038c56..7ef5ff88499 100644
--- a/mysql-test/suite/parts/r/partition_auto_increment_blackhole.result
+++ b/mysql-test/suite/parts/r/partition_auto_increment_blackhole.result
@@ -28,6 +28,7 @@ AUTO_INCREMENT
INSERT INTO t1 VALUES (0);
INSERT INTO t1 VALUES (5), (16);
# ERROR (only OK if Blackhole) should give ER_DUP_KEY or ER_DUP_ENTRY
+# mysql_errno: 0
INSERT INTO t1 VALUES (17);
INSERT INTO t1 VALUES (19), (NULL);
INSERT INTO t1 VALUES (NULL), (10), (NULL);
@@ -144,6 +145,7 @@ PARTITIONS 2;
INSERT INTO t1 VALUES (1, NULL);
INSERT INTO t1 VALUES (1, 1), (99, 99);
# ERROR (only OK if Blackhole) should give ER_DUP_KEY or ER_DUP_ENTRY
+# mysql_errno: 0
INSERT INTO t1 VALUES (1, NULL);
SET @@session.sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
INSERT INTO t1 VALUES (1, 0);
@@ -176,6 +178,7 @@ INSERT INTO t1 VALUES (2), (4), (NULL);
INSERT INTO t1 VALUES (0);
INSERT INTO t1 VALUES (5), (16);
# ERROR (only OK if Blackhole) should give ER_DUP_KEY or ER_DUP_ENTRY
+# mysql_errno: 0
INSERT INTO t1 VALUES (17), (19), (NULL);
INSERT INTO t1 VALUES (NULL), (10), (NULL);
INSERT INTO t1 VALUES (NULL), (9);
@@ -441,11 +444,13 @@ PARTITIONS 2;
INSERT INTO t1 VALUES (1, 0);
INSERT INTO t1 VALUES (1, 1);
# ERROR (only OK if Blackhole) should give ER_DUP_KEY or ER_DUP_ENTRY
+# mysql_errno: 0
INSERT INTO t1 VALUES (1, NULL);
INSERT INTO t1 VALUES (2, NULL), (3, 11), (3, NULL), (2, 0);
INSERT INTO t1 VALUES (2, NULL);
INSERT INTO t1 VALUES (2, 2);
# ERROR (only OK if Blackhole) should give ER_DUP_KEY or ER_DUP_ENTRY
+# mysql_errno: 0
INSERT INTO t1 VALUES (2, 22);
INSERT INTO t1 VALUES (2, NULL);
SELECT * FROM t1 ORDER BY c1,c2;
@@ -462,12 +467,14 @@ PARTITIONS 2;
INSERT INTO t1 VALUES (1, 0);
INSERT INTO t1 VALUES (1, 1);
# ERROR (only OK if Blackhole) should give ER_DUP_KEY or ER_DUP_ENTRY
+# mysql_errno: 0
INSERT INTO t1 VALUES (1, NULL);
INSERT INTO t1 VALUES (2, NULL);
INSERT INTO t1 VALUES (3, NULL);
INSERT INTO t1 VALUES (3, NULL), (2, 0), (2, NULL);
INSERT INTO t1 VALUES (2, 2);
# ERROR (only OK if Blackhole/NDB) should give ER_DUP_KEY or ER_DUP_ENTRY
+# mysql_errno: 0
INSERT INTO t1 VALUES (2, 22), (2, NULL);
SELECT * FROM t1 ORDER BY c1,c2;
c1 c2
diff --git a/mysql-test/suite/parts/r/partition_auto_increment_ndb.result b/mysql-test/suite/parts/r/partition_auto_increment_ndb.result
index 408f32cce78..5a1c5b06b36 100644
--- a/mysql-test/suite/parts/r/partition_auto_increment_ndb.result
+++ b/mysql-test/suite/parts/r/partition_auto_increment_ndb.result
@@ -649,6 +649,7 @@ INSERT INTO t1 VALUES (3, NULL);
INSERT INTO t1 VALUES (3, NULL), (2, 0), (2, NULL);
INSERT INTO t1 VALUES (2, 2);
# ERROR (only OK if Blackhole/NDB) should give ER_DUP_KEY or ER_DUP_ENTRY
+# mysql_errno: 0
INSERT INTO t1 VALUES (2, 22), (2, NULL);
SELECT * FROM t1 ORDER BY c1,c2;
c1 c2
diff --git a/mysql-test/suite/parts/r/partition_basic_innodb.result b/mysql-test/suite/parts/r/partition_basic_innodb.result
index 15452792f3d..21c5d70e6e3 100644
--- a/mysql-test/suite/parts/r/partition_basic_innodb.result
+++ b/mysql-test/suite/parts/r/partition_basic_innodb.result
@@ -7538,7 +7538,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -8030,7 +8030,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -8537,7 +8537,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -9040,7 +9040,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -9539,7 +9539,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -10051,7 +10051,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -10565,7 +10565,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -11065,7 +11065,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -11558,7 +11558,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -12050,7 +12050,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -12557,7 +12557,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -13060,7 +13060,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -13559,7 +13559,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -14071,7 +14071,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -14585,7 +14585,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -15085,7 +15085,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -15578,7 +15578,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -16086,7 +16086,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -16609,7 +16609,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -17128,7 +17128,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -17643,7 +17643,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -18171,7 +18171,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -18701,7 +18701,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -19217,7 +19217,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -19731,7 +19731,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -20223,7 +20223,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -20730,7 +20730,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -21233,7 +21233,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -21732,7 +21732,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -22242,7 +22242,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -22752,7 +22752,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -23252,7 +23252,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -23745,7 +23745,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -24237,7 +24237,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -24744,7 +24744,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -25247,7 +25247,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -25746,7 +25746,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -26256,7 +26256,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -26766,7 +26766,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -27266,7 +27266,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'PRIMARY'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -27759,7 +27759,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -28267,7 +28267,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -28790,7 +28790,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -29309,7 +29309,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -29824,7 +29824,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -30350,7 +30350,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -30876,7 +30876,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -31392,7 +31392,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
diff --git a/mysql-test/suite/parts/r/partition_basic_myisam.result b/mysql-test/suite/parts/r/partition_basic_myisam.result
index 84d623e63a2..f70dae13bb6 100644
--- a/mysql-test/suite/parts/r/partition_basic_myisam.result
+++ b/mysql-test/suite/parts/r/partition_basic_myisam.result
@@ -7774,7 +7774,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -8293,7 +8293,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -8833,7 +8833,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -9365,7 +9365,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -9897,7 +9897,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -10442,7 +10442,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -10989,7 +10989,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -11524,7 +11524,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -12043,7 +12043,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -12562,7 +12562,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -13102,7 +13102,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -13634,7 +13634,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -14166,7 +14166,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -14709,7 +14709,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -15252,7 +15252,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -15787,7 +15787,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
diff --git a/mysql-test/suite/parts/r/partition_basic_symlink_myisam.result b/mysql-test/suite/parts/r/partition_basic_symlink_myisam.result
index 602a114c318..146b3d361fb 100644
--- a/mysql-test/suite/parts/r/partition_basic_symlink_myisam.result
+++ b/mysql-test/suite/parts/r/partition_basic_symlink_myisam.result
@@ -8177,7 +8177,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -8725,7 +8725,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -9289,7 +9289,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -9845,7 +9845,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -10401,7 +10401,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -10966,7 +10966,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -11549,7 +11549,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -12108,7 +12108,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -12638,7 +12638,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -13186,7 +13186,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -13750,7 +13750,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -14306,7 +14306,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -14862,7 +14862,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -15425,7 +15425,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -16008,7 +16008,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -16567,7 +16567,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -17091,7 +17091,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -17629,7 +17629,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -18186,7 +18186,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -18730,7 +18730,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -19274,7 +19274,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -19832,7 +19832,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
@@ -20381,7 +20381,7 @@ INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
SELECT f_int1, f_int1, CAST(f_int1 AS CHAR),
CAST(f_int1 AS CHAR), 'delete me' FROM t0_template
WHERE f_int1 IN (2,3);
-ERROR 23000: Can't write; duplicate key in table 't1'
+ERROR 23000: Duplicate entry '2-2' for key 'uidx1'
# check prerequisites-3 success: 1
# INFO: f_int1 AND/OR f_int2 AND/OR (f_int1,f_int2) is UNIQUE
INSERT INTO t1 (f_int1, f_int2, f_char1, f_char2, f_charbig)
diff --git a/mysql-test/suite/parts/r/partition_mgm_lc0_archive.result b/mysql-test/suite/parts/r/partition_mgm_lc0_archive.result
index 7672ac330fb..30ff27df298 100644
--- a/mysql-test/suite/parts/r/partition_mgm_lc0_archive.result
+++ b/mysql-test/suite/parts/r/partition_mgm_lc0_archive.result
@@ -93,11 +93,11 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -329,11 +329,11 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -559,7 +559,7 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB VALUES LESS THAN (3) ,
PARTITION parta VALUES LESS THAN (11) );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION partB,Partc,PartD,PartE INTO
(PARTITION partD VALUES LESS THAN (8)
COMMENT="Previously partB and partly Partc",
@@ -793,7 +793,7 @@ PARTITION partF VALUES IN (3,9)
COMMENT = "Mix 2 of old parta and Partc",
PARTITION parta VALUES IN (4,8)
COMMENT = "Mix 3 of old parta and Partc");
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION Partc VALUES IN (1,7)
COMMENT = "Mix 1 of old parta and Partc",
diff --git a/mysql-test/suite/parts/r/partition_mgm_lc0_innodb.result b/mysql-test/suite/parts/r/partition_mgm_lc0_innodb.result
index e85cbeba594..cd55ffbad03 100644
--- a/mysql-test/suite/parts/r/partition_mgm_lc0_innodb.result
+++ b/mysql-test/suite/parts/r/partition_mgm_lc0_innodb.result
@@ -93,11 +93,11 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -329,11 +329,11 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -559,7 +559,7 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB VALUES LESS THAN (3) ,
PARTITION parta VALUES LESS THAN (11) );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION partB,Partc,PartD,PartE INTO
(PARTITION partD VALUES LESS THAN (8)
COMMENT="Previously partB and partly Partc",
@@ -793,7 +793,7 @@ PARTITION partF VALUES IN (3,9)
COMMENT = "Mix 2 of old parta and Partc",
PARTITION parta VALUES IN (4,8)
COMMENT = "Mix 3 of old parta and Partc");
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION Partc VALUES IN (1,7)
COMMENT = "Mix 1 of old parta and Partc",
diff --git a/mysql-test/suite/parts/r/partition_mgm_lc0_memory.result b/mysql-test/suite/parts/r/partition_mgm_lc0_memory.result
index 1f7197abe6d..faf776e03a3 100644
--- a/mysql-test/suite/parts/r/partition_mgm_lc0_memory.result
+++ b/mysql-test/suite/parts/r/partition_mgm_lc0_memory.result
@@ -93,11 +93,11 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -329,11 +329,11 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -559,7 +559,7 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB VALUES LESS THAN (3) ,
PARTITION parta VALUES LESS THAN (11) );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION partB,Partc,PartD,PartE INTO
(PARTITION partD VALUES LESS THAN (8)
COMMENT="Previously partB and partly Partc",
@@ -793,7 +793,7 @@ PARTITION partF VALUES IN (3,9)
COMMENT = "Mix 2 of old parta and Partc",
PARTITION parta VALUES IN (4,8)
COMMENT = "Mix 3 of old parta and Partc");
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION Partc VALUES IN (1,7)
COMMENT = "Mix 1 of old parta and Partc",
diff --git a/mysql-test/suite/parts/r/partition_mgm_lc0_myisam.result b/mysql-test/suite/parts/r/partition_mgm_lc0_myisam.result
index cb5228bd78e..827f7a15c24 100644
--- a/mysql-test/suite/parts/r/partition_mgm_lc0_myisam.result
+++ b/mysql-test/suite/parts/r/partition_mgm_lc0_myisam.result
@@ -93,11 +93,11 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -329,11 +329,11 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -559,7 +559,7 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB VALUES LESS THAN (3) ,
PARTITION parta VALUES LESS THAN (11) );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION partB,Partc,PartD,PartE INTO
(PARTITION partD VALUES LESS THAN (8)
COMMENT="Previously partB and partly Partc",
@@ -793,7 +793,7 @@ PARTITION partF VALUES IN (3,9)
COMMENT = "Mix 2 of old parta and Partc",
PARTITION parta VALUES IN (4,8)
COMMENT = "Mix 3 of old parta and Partc");
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION Partc VALUES IN (1,7)
COMMENT = "Mix 1 of old parta and Partc",
diff --git a/mysql-test/suite/parts/r/partition_mgm_lc0_ndb.result b/mysql-test/suite/parts/r/partition_mgm_lc0_ndb.result
index a1d0b78aac4..45b674638e7 100644
--- a/mysql-test/suite/parts/r/partition_mgm_lc0_ndb.result
+++ b/mysql-test/suite/parts/r/partition_mgm_lc0_ndb.result
@@ -93,11 +93,11 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
diff --git a/mysql-test/suite/parts/r/partition_mgm_lc1_archive.result b/mysql-test/suite/parts/r/partition_mgm_lc1_archive.result
index f8238bb9382..443453a2d70 100644
--- a/mysql-test/suite/parts/r/partition_mgm_lc1_archive.result
+++ b/mysql-test/suite/parts/r/partition_mgm_lc1_archive.result
@@ -93,11 +93,11 @@ TableA CREATE TABLE `tablea` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -320,11 +320,11 @@ TableA CREATE TABLE `tablea` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -541,7 +541,7 @@ TableA CREATE TABLE `tablea` (
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB VALUES LESS THAN (3) ,
PARTITION parta VALUES LESS THAN (11) );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION partB,Partc,PartD,PartE INTO
(PARTITION partD VALUES LESS THAN (8)
COMMENT="Previously partB and partly Partc",
@@ -767,7 +767,7 @@ PARTITION partF VALUES IN (3,9)
COMMENT = "Mix 2 of old parta and Partc",
PARTITION parta VALUES IN (4,8)
COMMENT = "Mix 3 of old parta and Partc");
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION Partc VALUES IN (1,7)
COMMENT = "Mix 1 of old parta and Partc",
diff --git a/mysql-test/suite/parts/r/partition_mgm_lc1_innodb.result b/mysql-test/suite/parts/r/partition_mgm_lc1_innodb.result
index 5f7ccc3ed51..49ccc7b1808 100644
--- a/mysql-test/suite/parts/r/partition_mgm_lc1_innodb.result
+++ b/mysql-test/suite/parts/r/partition_mgm_lc1_innodb.result
@@ -93,11 +93,11 @@ TableA CREATE TABLE `tablea` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -320,11 +320,11 @@ TableA CREATE TABLE `tablea` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -541,7 +541,7 @@ TableA CREATE TABLE `tablea` (
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB VALUES LESS THAN (3) ,
PARTITION parta VALUES LESS THAN (11) );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION partB,Partc,PartD,PartE INTO
(PARTITION partD VALUES LESS THAN (8)
COMMENT="Previously partB and partly Partc",
@@ -767,7 +767,7 @@ PARTITION partF VALUES IN (3,9)
COMMENT = "Mix 2 of old parta and Partc",
PARTITION parta VALUES IN (4,8)
COMMENT = "Mix 3 of old parta and Partc");
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION Partc VALUES IN (1,7)
COMMENT = "Mix 1 of old parta and Partc",
diff --git a/mysql-test/suite/parts/r/partition_mgm_lc1_memory.result b/mysql-test/suite/parts/r/partition_mgm_lc1_memory.result
index c72666f7717..6f34054428c 100644
--- a/mysql-test/suite/parts/r/partition_mgm_lc1_memory.result
+++ b/mysql-test/suite/parts/r/partition_mgm_lc1_memory.result
@@ -93,11 +93,11 @@ TableA CREATE TABLE `tablea` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -320,11 +320,11 @@ TableA CREATE TABLE `tablea` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -541,7 +541,7 @@ TableA CREATE TABLE `tablea` (
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB VALUES LESS THAN (3) ,
PARTITION parta VALUES LESS THAN (11) );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION partB,Partc,PartD,PartE INTO
(PARTITION partD VALUES LESS THAN (8)
COMMENT="Previously partB and partly Partc",
@@ -767,7 +767,7 @@ PARTITION partF VALUES IN (3,9)
COMMENT = "Mix 2 of old parta and Partc",
PARTITION parta VALUES IN (4,8)
COMMENT = "Mix 3 of old parta and Partc");
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION Partc VALUES IN (1,7)
COMMENT = "Mix 1 of old parta and Partc",
diff --git a/mysql-test/suite/parts/r/partition_mgm_lc1_myisam.result b/mysql-test/suite/parts/r/partition_mgm_lc1_myisam.result
index 66f9f852108..ac230e29c66 100644
--- a/mysql-test/suite/parts/r/partition_mgm_lc1_myisam.result
+++ b/mysql-test/suite/parts/r/partition_mgm_lc1_myisam.result
@@ -93,11 +93,11 @@ TableA CREATE TABLE `tablea` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -320,11 +320,11 @@ TableA CREATE TABLE `tablea` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -541,7 +541,7 @@ TableA CREATE TABLE `tablea` (
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB VALUES LESS THAN (3) ,
PARTITION parta VALUES LESS THAN (11) );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION partB,Partc,PartD,PartE INTO
(PARTITION partD VALUES LESS THAN (8)
COMMENT="Previously partB and partly Partc",
@@ -767,7 +767,7 @@ PARTITION partF VALUES IN (3,9)
COMMENT = "Mix 2 of old parta and Partc",
PARTITION parta VALUES IN (4,8)
COMMENT = "Mix 3 of old parta and Partc");
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION Partc VALUES IN (1,7)
COMMENT = "Mix 1 of old parta and Partc",
diff --git a/mysql-test/suite/parts/r/partition_mgm_lc1_ndb.result b/mysql-test/suite/parts/r/partition_mgm_lc1_ndb.result
index c27f769ad72..0a53e1b4a9b 100644
--- a/mysql-test/suite/parts/r/partition_mgm_lc1_ndb.result
+++ b/mysql-test/suite/parts/r/partition_mgm_lc1_ndb.result
@@ -93,11 +93,11 @@ TableA CREATE TABLE `tablea` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
diff --git a/mysql-test/suite/parts/r/partition_mgm_lc2_archive.result b/mysql-test/suite/parts/r/partition_mgm_lc2_archive.result
index 70020ee54a6..fc0390c238d 100644
--- a/mysql-test/suite/parts/r/partition_mgm_lc2_archive.result
+++ b/mysql-test/suite/parts/r/partition_mgm_lc2_archive.result
@@ -93,11 +93,11 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -320,11 +320,11 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -541,7 +541,7 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB VALUES LESS THAN (3) ,
PARTITION parta VALUES LESS THAN (11) );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION partB,Partc,PartD,PartE INTO
(PARTITION partD VALUES LESS THAN (8)
COMMENT="Previously partB and partly Partc",
@@ -767,7 +767,7 @@ PARTITION partF VALUES IN (3,9)
COMMENT = "Mix 2 of old parta and Partc",
PARTITION parta VALUES IN (4,8)
COMMENT = "Mix 3 of old parta and Partc");
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION Partc VALUES IN (1,7)
COMMENT = "Mix 1 of old parta and Partc",
diff --git a/mysql-test/suite/parts/r/partition_mgm_lc2_innodb.result b/mysql-test/suite/parts/r/partition_mgm_lc2_innodb.result
index 7392056b7a5..da111137068 100644
--- a/mysql-test/suite/parts/r/partition_mgm_lc2_innodb.result
+++ b/mysql-test/suite/parts/r/partition_mgm_lc2_innodb.result
@@ -93,11 +93,11 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -320,11 +320,11 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -541,7 +541,7 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB VALUES LESS THAN (3) ,
PARTITION parta VALUES LESS THAN (11) );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION partB,Partc,PartD,PartE INTO
(PARTITION partD VALUES LESS THAN (8)
COMMENT="Previously partB and partly Partc",
@@ -767,7 +767,7 @@ PARTITION partF VALUES IN (3,9)
COMMENT = "Mix 2 of old parta and Partc",
PARTITION parta VALUES IN (4,8)
COMMENT = "Mix 3 of old parta and Partc");
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION Partc VALUES IN (1,7)
COMMENT = "Mix 1 of old parta and Partc",
diff --git a/mysql-test/suite/parts/r/partition_mgm_lc2_memory.result b/mysql-test/suite/parts/r/partition_mgm_lc2_memory.result
index a71bbfea5e3..a1716ea36c8 100644
--- a/mysql-test/suite/parts/r/partition_mgm_lc2_memory.result
+++ b/mysql-test/suite/parts/r/partition_mgm_lc2_memory.result
@@ -93,11 +93,11 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -320,11 +320,11 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -541,7 +541,7 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB VALUES LESS THAN (3) ,
PARTITION parta VALUES LESS THAN (11) );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION partB,Partc,PartD,PartE INTO
(PARTITION partD VALUES LESS THAN (8)
COMMENT="Previously partB and partly Partc",
@@ -767,7 +767,7 @@ PARTITION partF VALUES IN (3,9)
COMMENT = "Mix 2 of old parta and Partc",
PARTITION parta VALUES IN (4,8)
COMMENT = "Mix 3 of old parta and Partc");
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION Partc VALUES IN (1,7)
COMMENT = "Mix 1 of old parta and Partc",
diff --git a/mysql-test/suite/parts/r/partition_mgm_lc2_myisam.result b/mysql-test/suite/parts/r/partition_mgm_lc2_myisam.result
index 92b64e4d26c..6bdfa149de0 100644
--- a/mysql-test/suite/parts/r/partition_mgm_lc2_myisam.result
+++ b/mysql-test/suite/parts/r/partition_mgm_lc2_myisam.result
@@ -93,11 +93,11 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -320,11 +320,11 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
@@ -541,7 +541,7 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB VALUES LESS THAN (3) ,
PARTITION parta VALUES LESS THAN (11) );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION partB,Partc,PartD,PartE INTO
(PARTITION partD VALUES LESS THAN (8)
COMMENT="Previously partB and partly Partc",
@@ -767,7 +767,7 @@ PARTITION partF VALUES IN (3,9)
COMMENT = "Mix 2 of old parta and Partc",
PARTITION parta VALUES IN (4,8)
COMMENT = "Mix 3 of old parta and Partc");
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION Partc VALUES IN (1,7)
COMMENT = "Mix 1 of old parta and Partc",
diff --git a/mysql-test/suite/parts/r/partition_mgm_lc2_ndb.result b/mysql-test/suite/parts/r/partition_mgm_lc2_ndb.result
index b234de0efdb..8b9c5be1fb6 100644
--- a/mysql-test/suite/parts/r/partition_mgm_lc2_ndb.result
+++ b/mysql-test/suite/parts/r/partition_mgm_lc2_ndb.result
@@ -93,11 +93,11 @@ TableA CREATE TABLE `TableA` (
ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO
(PARTITION PARTA ,
PARTITION partc );
-ERROR HY000: REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers
+ERROR HY000: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers
ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO
(PARTITION partB ,
PARTITION parta );
-ERROR HY000: When reorganising a set of partitions they must be in consecutive order
+ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE TableA REORGANIZE PARTITION parta,partB INTO
(PARTITION partB COMMENT="Previusly named parta",
PARTITION parta COMMENT="Previusly named partB");
diff --git a/mysql-test/suite/rpl/r/rpl_do_grant.result b/mysql-test/suite/rpl/r/rpl_do_grant.result
index f7f1ce66656..69bcfad4347 100644
--- a/mysql-test/suite/rpl/r/rpl_do_grant.result
+++ b/mysql-test/suite/rpl/r/rpl_do_grant.result
@@ -89,3 +89,81 @@ show grants for rpl_do_grant2@localhost;
ERROR 42000: There is no such grant defined for user 'rpl_do_grant2' on host 'localhost'
show grants for rpl_do_grant2@localhost;
ERROR 42000: There is no such grant defined for user 'rpl_do_grant2' on host 'localhost'
+DROP DATABASE IF EXISTS bug42217_db;
+CREATE DATABASE bug42217_db;
+GRANT CREATE ROUTINE ON bug42217_db.* TO 'create_rout_db'@'localhost'
+ IDENTIFIED BY 'create_rout_db' WITH GRANT OPTION;
+USE bug42217_db;
+CREATE FUNCTION upgrade_del_func() RETURNS CHAR(30)
+BEGIN
+RETURN "INSIDE upgrade_del_func()";
+END//
+USE bug42217_db;
+SELECT * FROM mysql.procs_priv;
+Host Db User Routine_name Routine_type Grantor Proc_priv Timestamp
+localhost bug42217_db create_rout_db upgrade_del_func FUNCTION create_rout_db@localhost Execute,Alter Routine #
+SELECT upgrade_del_func();
+upgrade_del_func()
+INSIDE upgrade_del_func()
+SELECT * FROM mysql.procs_priv;
+Host Db User Routine_name Routine_type Grantor Proc_priv Timestamp
+localhost bug42217_db create_rout_db upgrade_del_func FUNCTION create_rout_db@localhost Execute,Alter Routine #
+SHOW GRANTS FOR 'create_rout_db'@'localhost';
+Grants for create_rout_db@localhost
+GRANT USAGE ON *.* TO 'create_rout_db'@'localhost' IDENTIFIED BY PASSWORD '*08792480350CBA057BDE781B9DF183B263934601'
+GRANT CREATE ROUTINE ON `bug42217_db`.* TO 'create_rout_db'@'localhost' WITH GRANT OPTION
+GRANT EXECUTE, ALTER ROUTINE ON FUNCTION `bug42217_db`.`upgrade_del_func` TO 'create_rout_db'@'localhost'
+USE bug42217_db;
+SHOW CREATE FUNCTION upgrade_del_func;
+Function sql_mode Create Function character_set_client collation_connection Database Collation
+upgrade_del_func CREATE DEFINER=`create_rout_db`@`localhost` FUNCTION `upgrade_del_func`() RETURNS char(30) CHARSET latin1
+BEGIN
+RETURN "INSIDE upgrade_del_func()";
+END latin1 latin1_swedish_ci latin1_swedish_ci
+SELECT upgrade_del_func();
+upgrade_del_func()
+INSIDE upgrade_del_func()
+"Check whether the definer user will be able to execute the replicated routine on slave"
+USE bug42217_db;
+SHOW CREATE FUNCTION upgrade_del_func;
+Function sql_mode Create Function character_set_client collation_connection Database Collation
+upgrade_del_func CREATE DEFINER=`create_rout_db`@`localhost` FUNCTION `upgrade_del_func`() RETURNS char(30) CHARSET latin1
+BEGIN
+RETURN "INSIDE upgrade_del_func()";
+END latin1 latin1_swedish_ci latin1_swedish_ci
+SELECT upgrade_del_func();
+upgrade_del_func()
+INSIDE upgrade_del_func()
+DELETE FROM mysql.procs_priv;
+FLUSH PRIVILEGES;
+USE bug42217_db;
+"Can't execute the replicated routine on slave like before after procs privilege is deleted "
+SELECT upgrade_del_func();
+ERROR 42000: execute command denied to user 'create_rout_db'@'localhost' for routine 'bug42217_db.upgrade_del_func'
+"Test the user who creates a function on master doesn't exist on slave."
+"Hence SQL thread ACL_GLOBAL privilege jumps in and no mysql.procs_priv is inserted"
+DROP USER 'create_rout_db'@'localhost';
+CREATE FUNCTION upgrade_alter_func() RETURNS CHAR(30)
+BEGIN
+RETURN "INSIDE upgrade_alter_func()";
+END//
+SELECT upgrade_alter_func();
+upgrade_alter_func()
+INSIDE upgrade_alter_func()
+SHOW CREATE FUNCTION upgrade_alter_func;
+Function sql_mode Create Function character_set_client collation_connection Database Collation
+upgrade_alter_func CREATE DEFINER=`create_rout_db`@`localhost` FUNCTION `upgrade_alter_func`() RETURNS char(30) CHARSET latin1
+BEGIN
+RETURN "INSIDE upgrade_alter_func()";
+END latin1 latin1_swedish_ci latin1_swedish_ci
+"Should no privilege record for upgrade_alter_func in mysql.procs_priv"
+SELECT * FROM mysql.procs_priv;
+Host Db User Routine_name Routine_type Grantor Proc_priv Timestamp
+SELECT upgrade_alter_func();
+ERROR HY000: The user specified as a definer ('create_rout_db'@'localhost') does not exist
+USE bug42217_db;
+DROP FUNCTION upgrade_del_func;
+DROP FUNCTION upgrade_alter_func;
+DROP DATABASE bug42217_db;
+DROP USER 'create_rout_db'@'localhost';
+"End of test"
diff --git a/mysql-test/suite/rpl/r/rpl_failed_optimize.result b/mysql-test/suite/rpl/r/rpl_failed_optimize.result
index 5c84b1ff5fd..7210898d521 100644
--- a/mysql-test/suite/rpl/r/rpl_failed_optimize.result
+++ b/mysql-test/suite/rpl/r/rpl_failed_optimize.result
@@ -17,7 +17,7 @@ Error 1205 Lock wait timeout exceeded; try restarting transaction
OPTIMIZE TABLE non_existing;
Table Op Msg_type Msg_text
test.non_existing optimize Error Table 'test.non_existing' doesn't exist
-test.non_existing optimize error Corrupt
+test.non_existing optimize status Operation failed
select * from t1;
a
1
diff --git a/mysql-test/suite/rpl/r/rpl_mixed_bit_pk.result b/mysql-test/suite/rpl/r/rpl_mixed_bit_pk.result
new file mode 100644
index 00000000000..f1b0b2ae5cb
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_mixed_bit_pk.result
@@ -0,0 +1,32 @@
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+DROP TABLE IF EXISTS t1,t2,t3,t4,t5,t6,t7,t8;
+CREATE TABLE t1 (`bit_key` bit, `bit` bit, key (`bit_key` )) ENGINE=MyISAM;
+CREATE TABLE t2 (`bit_key` bit(4), `bit` bit, key (`bit_key` )) ENGINE=MyISAM;
+CREATE TABLE t3 (`bit_key` bit(7), `bit` bit, key (`bit_key` )) ENGINE=MyISAM;
+CREATE TABLE t4 (`bit_key` bit(8), `bit` bit, key (`bit_key` )) ENGINE=MyISAM;
+CREATE TABLE t5 (`bit_key` bit(9), `bit` bit, key (`bit_key` )) ENGINE=MyISAM;
+CREATE TABLE t6 (`bit_key` bit(14), `bit` bit, key (`bit_key` )) ENGINE=MyISAM;
+CREATE TABLE t7 (`bit_key` bit(15), `bit` bit, key (`bit_key` )) ENGINE=MyISAM;
+CREATE TABLE t8 (`bit_key` bit(16), `bit` bit, key (`bit_key` )) ENGINE=MyISAM;
+INSERT INTO `t1` ( `bit` ) VALUES ( 0 );
+DELETE FROM `t1` WHERE `bit` < 2 LIMIT 4;
+INSERT INTO `t2` ( `bit` ) VALUES ( 0 );
+DELETE FROM `t2` WHERE `bit` < 2 LIMIT 4;
+INSERT INTO `t3` ( `bit` ) VALUES ( 0 );
+DELETE FROM `t3` WHERE `bit` < 2 LIMIT 4;
+INSERT INTO `t4` ( `bit` ) VALUES ( 0 );
+DELETE FROM `t4` WHERE `bit` < 2 LIMIT 4;
+INSERT INTO `t5` ( `bit` ) VALUES ( 0 );
+DELETE FROM `t5` WHERE `bit` < 2 LIMIT 4;
+INSERT INTO `t6` ( `bit` ) VALUES ( 0 );
+DELETE FROM `t6` WHERE `bit` < 2 LIMIT 4;
+INSERT INTO `t7` ( `bit` ) VALUES ( 0 );
+DELETE FROM `t7` WHERE `bit` < 2 LIMIT 4;
+INSERT INTO `t8` ( `bit` ) VALUES ( 0 );
+DELETE FROM `t8` WHERE `bit` < 2 LIMIT 4;
+DROP TABLE t1, t2, t3, t4, t5, t6, t7, t8;
diff --git a/mysql-test/suite/rpl/r/rpl_rotate_logs.result b/mysql-test/suite/rpl/r/rpl_rotate_logs.result
index 6314a9a61fb..013ba87ec0b 100644
--- a/mysql-test/suite/rpl/r/rpl_rotate_logs.result
+++ b/mysql-test/suite/rpl/r/rpl_rotate_logs.result
@@ -87,9 +87,7 @@ show binary logs;
Log_name File_size
master-bin.000002 #
master-bin.000003 #
-select @time_for_purge:=DATE_ADD(UPDATE_TIME, INTERVAL 1 SECOND)
-from information_schema.tables
-where TABLE_SCHEMA="test" and TABLE_NAME="t2";
+SELECT @time_for_purge:=DATE_ADD('tmpval', INTERVAL 1 SECOND);
purge master logs before (@time_for_purge);
show binary logs;
Log_name File_size
diff --git a/mysql-test/suite/rpl/r/rpl_slave_load_in.result b/mysql-test/suite/rpl/r/rpl_slave_load_in.result
new file mode 100644
index 00000000000..0685d024f26
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_slave_load_in.result
@@ -0,0 +1,10 @@
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+create table t1(a int not null auto_increment, b int, primary key(a));
+load data infile '../../std_data/rpl_loaddata.dat' into table t1;
+Comparing tables master:test.t1 and slave:test.t1
+drop table t1;
diff --git a/mysql-test/suite/rpl/r/rpl_temp_table_mix_row.result b/mysql-test/suite/rpl/r/rpl_temp_table_mix_row.result
new file mode 100644
index 00000000000..feffefc9dad
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_temp_table_mix_row.result
@@ -0,0 +1,26 @@
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+==== Initialize ====
+[on master]
+CREATE TABLE t1 (a CHAR(48));
+CREATE TEMPORARY TABLE t1_tmp1(a INT);
+INSERT INTO t1 VALUES (UUID());
+[on slave]
+==== Verify results on slave ====
+SHOW STATUS LIKE "Slave_open_temp_tables";
+Variable_name Value
+Slave_open_temp_tables 1
+[on master]
+[on slave]
+==== Verify results on slave ====
+SHOW STATUS LIKE "Slave_open_temp_tables";
+Variable_name Value
+Slave_open_temp_tables 0
+==== Clean up ====
+[on master]
+DROP TABLE t1;
+[on slave]
diff --git a/mysql-test/suite/rpl/t/rpl_do_grant.test b/mysql-test/suite/rpl/t/rpl_do_grant.test
index 5615900c2dd..806de780086 100644
--- a/mysql-test/suite/rpl/t/rpl_do_grant.test
+++ b/mysql-test/suite/rpl/t/rpl_do_grant.test
@@ -112,3 +112,100 @@ show grants for rpl_do_grant2@localhost;
sync_slave_with_master;
--error 1141
show grants for rpl_do_grant2@localhost;
+
+#####################################################
+# Purpose
+# Test whether mysql.procs_priv get replicated
+# Related bugs:
+# BUG42217 mysql.procs_priv does not get replicated
+#####################################################
+connection master;
+
+--disable_warnings
+DROP DATABASE IF EXISTS bug42217_db;
+--enable_warnings
+CREATE DATABASE bug42217_db;
+
+GRANT CREATE ROUTINE ON bug42217_db.* TO 'create_rout_db'@'localhost'
+ IDENTIFIED BY 'create_rout_db' WITH GRANT OPTION;
+
+connect (create_rout_db_master, localhost, create_rout_db, create_rout_db, bug42217_db,$MASTER_MYPORT,);
+connect (create_rout_db_slave, localhost, create_rout_db, create_rout_db, bug42217_db, $SLAVE_MYPORT,);
+
+connection create_rout_db_master;
+
+
+USE bug42217_db;
+
+DELIMITER //;
+CREATE FUNCTION upgrade_del_func() RETURNS CHAR(30)
+BEGIN
+ RETURN "INSIDE upgrade_del_func()";
+END//
+
+DELIMITER ;//
+
+connection master;
+
+USE bug42217_db;
+--replace_column 8 #
+SELECT * FROM mysql.procs_priv;
+SELECT upgrade_del_func();
+
+sync_slave_with_master;
+--replace_column 8 #
+SELECT * FROM mysql.procs_priv;
+SHOW GRANTS FOR 'create_rout_db'@'localhost';
+
+USE bug42217_db;
+SHOW CREATE FUNCTION upgrade_del_func;
+SELECT upgrade_del_func();
+
+--echo "Check whether the definer user will be able to execute the replicated routine on slave"
+connection create_rout_db_slave;
+USE bug42217_db;
+SHOW CREATE FUNCTION upgrade_del_func;
+SELECT upgrade_del_func();
+
+connection slave;
+DELETE FROM mysql.procs_priv;
+FLUSH PRIVILEGES;
+USE bug42217_db;
+--echo "Can't execute the replicated routine on slave like before after procs privilege is deleted "
+--error 1370
+SELECT upgrade_del_func();
+
+--echo "Test the user who creates a function on master doesn't exist on slave."
+--echo "Hence SQL thread ACL_GLOBAL privilege jumps in and no mysql.procs_priv is inserted"
+DROP USER 'create_rout_db'@'localhost';
+
+connection create_rout_db_master;
+DELIMITER //;
+CREATE FUNCTION upgrade_alter_func() RETURNS CHAR(30)
+BEGIN
+ RETURN "INSIDE upgrade_alter_func()";
+END//
+DELIMITER ;//
+
+connection master;
+SELECT upgrade_alter_func();
+
+sync_slave_with_master;
+SHOW CREATE FUNCTION upgrade_alter_func;
+--echo "Should no privilege record for upgrade_alter_func in mysql.procs_priv"
+--replace_column 8 #
+SELECT * FROM mysql.procs_priv;
+--error 1449
+SELECT upgrade_alter_func();
+
+###### CLEAN UP SECTION ##############
+disconnect create_rout_db_master;
+disconnect create_rout_db_slave;
+connection master;
+USE bug42217_db;
+DROP FUNCTION upgrade_del_func;
+DROP FUNCTION upgrade_alter_func;
+DROP DATABASE bug42217_db;
+DROP USER 'create_rout_db'@'localhost';
+
+--echo "End of test"
diff --git a/mysql-test/suite/rpl/t/rpl_mixed_bit_pk.test b/mysql-test/suite/rpl/t/rpl_mixed_bit_pk.test
new file mode 100644
index 00000000000..55f6ad61446
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_mixed_bit_pk.test
@@ -0,0 +1,78 @@
+#
+# BUG
+# ---
+# BUG#39753: Replication failure on MIXED + bit + myisam + no PK
+#
+# Description
+# -----------
+# Simple statements against a bit column cause failure in mixed-mode
+# replication.
+#
+# Implementation is as follows:
+# i) A table with two bit fields is created. One of them is a key.
+# ii) A record is inserted without specifying the key value.
+# iii) The record is deleted using a where clause that matches it.
+# iv) repeat i-iii) for bit key that has different size, generating
+# different extra bits values
+# v) The slave is synchronized with master
+# vi) The table is dropped on master and the slave is re-synchronized
+# with master.
+#
+# Step v) made the bug evident before the patch, as the slave would
+# fail to find the correspondent row in its database (although it did
+# the insert in step ii) ).
+#
+# Obs
+# ---
+# This test is based on the "how to repeat" section from the bug report.
+#
+#
+
+--source include/master-slave.inc
+
+--disable_warnings
+# setup
+
+DROP TABLE IF EXISTS t1,t2,t3,t4,t5,t6,t7,t8;
+CREATE TABLE t1 (`bit_key` bit, `bit` bit, key (`bit_key` )) ENGINE=MyISAM;
+CREATE TABLE t2 (`bit_key` bit(4), `bit` bit, key (`bit_key` )) ENGINE=MyISAM;
+CREATE TABLE t3 (`bit_key` bit(7), `bit` bit, key (`bit_key` )) ENGINE=MyISAM;
+CREATE TABLE t4 (`bit_key` bit(8), `bit` bit, key (`bit_key` )) ENGINE=MyISAM;
+CREATE TABLE t5 (`bit_key` bit(9), `bit` bit, key (`bit_key` )) ENGINE=MyISAM;
+CREATE TABLE t6 (`bit_key` bit(14), `bit` bit, key (`bit_key` )) ENGINE=MyISAM;
+CREATE TABLE t7 (`bit_key` bit(15), `bit` bit, key (`bit_key` )) ENGINE=MyISAM;
+CREATE TABLE t8 (`bit_key` bit(16), `bit` bit, key (`bit_key` )) ENGINE=MyISAM;
+
+# insert and delete
+INSERT INTO `t1` ( `bit` ) VALUES ( 0 );
+DELETE FROM `t1` WHERE `bit` < 2 LIMIT 4;
+
+INSERT INTO `t2` ( `bit` ) VALUES ( 0 );
+DELETE FROM `t2` WHERE `bit` < 2 LIMIT 4;
+
+INSERT INTO `t3` ( `bit` ) VALUES ( 0 );
+DELETE FROM `t3` WHERE `bit` < 2 LIMIT 4;
+
+INSERT INTO `t4` ( `bit` ) VALUES ( 0 );
+DELETE FROM `t4` WHERE `bit` < 2 LIMIT 4;
+
+INSERT INTO `t5` ( `bit` ) VALUES ( 0 );
+DELETE FROM `t5` WHERE `bit` < 2 LIMIT 4;
+
+INSERT INTO `t6` ( `bit` ) VALUES ( 0 );
+DELETE FROM `t6` WHERE `bit` < 2 LIMIT 4;
+
+INSERT INTO `t7` ( `bit` ) VALUES ( 0 );
+DELETE FROM `t7` WHERE `bit` < 2 LIMIT 4;
+
+INSERT INTO `t8` ( `bit` ) VALUES ( 0 );
+DELETE FROM `t8` WHERE `bit` < 2 LIMIT 4;
+
+
+--enable_warnings
+sync_slave_with_master;
+
+# clean up
+connection master;
+DROP TABLE t1, t2, t3, t4, t5, t6, t7, t8;
+sync_slave_with_master;
diff --git a/mysql-test/suite/rpl/t/rpl_rotate_logs.test b/mysql-test/suite/rpl/t/rpl_rotate_logs.test
index 2bad7b27272..e06099fd707 100644
--- a/mysql-test/suite/rpl/t/rpl_rotate_logs.test
+++ b/mysql-test/suite/rpl/t/rpl_rotate_logs.test
@@ -112,14 +112,24 @@ source include/show_master_logs.inc;
purge binary logs to 'master-bin.000002';
source include/show_binary_logs.inc;
-# Calculate time to use in "purge master logs before" by taking
-# last modification time of t2 and adding 1 second
-# This is donw in order to handle the case where file system
-# time differs from mysqld's time
+# Set the purge time 1 second after the last modify time of master-bin.000002.
+perl;
+open F, ">>".$ENV{'MYSQLTEST_VARDIR'}.'/tmp/rpl_rotate_logs.tmp' or die "Tmp file rpl_rotate_logs.tmp not found";
+my $binlogpath = $ENV{'MYSQLTEST_VARDIR'}.'/mysqld.1/data/master-bin.000002';
+my @array = stat($binlogpath);
+my $filemodifytime = $array[9];
+my @t = localtime $filemodifytime;
+my $modifytime = sprintf "%04u-%02u-%02u %02u:%02u:%02u",$t[5]+1900,$t[4]+1,$t[3],$t[2],$t[1],$t[0];
+printf F ("let \$tmpval = %s;",$modifytime);
+close F;
+EOF
+
+--source $MYSQLTEST_VARDIR/tmp/rpl_rotate_logs.tmp
+remove_file $MYSQLTEST_VARDIR/tmp/rpl_rotate_logs.tmp;
+
--disable_result_log
-select @time_for_purge:=DATE_ADD(UPDATE_TIME, INTERVAL 1 SECOND)
- from information_schema.tables
- where TABLE_SCHEMA="test" and TABLE_NAME="t2";
+--replace_result $tmpval tmpval
+--eval SELECT @time_for_purge:=DATE_ADD('$tmpval', INTERVAL 1 SECOND)
--enable_result_log
purge master logs before (@time_for_purge);
diff --git a/mysql-test/suite/rpl/t/rpl_slave_load_in.test b/mysql-test/suite/rpl/t/rpl_slave_load_in.test
new file mode 100644
index 00000000000..f920c136d43
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_slave_load_in.test
@@ -0,0 +1,35 @@
+##########################################################################
+# This test verifies if a slave is able to process a "LOAD DATA INFILE"
+# event while the "--secure-file-priv" option is set.
+#
+# The test is divided in two steps:
+# 1 - Creates a table and populates it through "LOAD DATA INFILE".
+# 2 - Compares the master and slave.
+##########################################################################
+source include/master-slave.inc;
+
+##########################################################################
+# Loading data
+##########################################################################
+connection master;
+
+create table t1(a int not null auto_increment, b int, primary key(a));
+load data infile '../../std_data/rpl_loaddata.dat' into table t1;
+
+##########################################################################
+# Checking Consistency
+##########################################################################
+sync_slave_with_master;
+
+let $diff_table_1=master:test.t1;
+let $diff_table_2=slave:test.t1;
+source include/diff_tables.inc;
+
+##########################################################################
+# Clean up
+##########################################################################
+connection master;
+
+drop table t1;
+
+sync_slave_with_master;
diff --git a/mysql-test/suite/rpl/t/rpl_temp_table_mix_row.test b/mysql-test/suite/rpl/t/rpl_temp_table_mix_row.test
new file mode 100644
index 00000000000..1fe484b7c27
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_temp_table_mix_row.test
@@ -0,0 +1,49 @@
+# ==== Purpose ====
+#
+# Test that temporary tables are correctly replicated after switching to ROW format in MIX mode.
+# This test case will test the condition of the bug#40013.
+# The test step is:
+# 1: create temp table on connection 'master';
+# 2: switch to ROW format using 'INSERT INTO t1 VALUES (UUID());'
+# 3: disconnect 'master' and connect to a new connection 'master1';
+# 4: sync to slave and check the number of temp tables on slave.
+#
+
+source include/master-slave.inc;
+source include/have_binlog_format_mixed.inc;
+
+--echo ==== Initialize ====
+
+--echo [on master]
+--connection master
+
+CREATE TABLE t1 (a CHAR(48));
+CREATE TEMPORARY TABLE t1_tmp1(a INT);
+INSERT INTO t1 VALUES (UUID());
+
+--echo [on slave]
+sync_slave_with_master;
+
+--echo ==== Verify results on slave ====
+SHOW STATUS LIKE "Slave_open_temp_tables";
+
+--echo [on master]
+--connection master
+
+disconnect master;
+--connection master1
+
+--echo [on slave]
+sync_slave_with_master;
+
+--echo ==== Verify results on slave ====
+SHOW STATUS LIKE "Slave_open_temp_tables";
+
+--echo ==== Clean up ====
+
+--echo [on master]
+--connection master1
+DROP TABLE t1;
+
+--echo [on slave]
+sync_slave_with_master;
diff --git a/mysql-test/suite/rpl_ndb/r/rpl_ndb_sync.result b/mysql-test/suite/rpl_ndb/r/rpl_ndb_sync.result
index c788893e055..3ef5e2b7e53 100644
--- a/mysql-test/suite/rpl_ndb/r/rpl_ndb_sync.result
+++ b/mysql-test/suite/rpl_ndb/r/rpl_ndb_sync.result
@@ -25,8 +25,9 @@ hex(c2) hex(c3) c1
0 1 BCDEF
1 0 CD
0 0 DEFGHIJKL
-CREATE TEMPORARY TABLE test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
-LOAD DATA INFILE 'DUMP_FILE' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
+CREATE TEMPORARY TABLE IF NOT EXISTS test.backup_info
+(id INT, backup_id INT) ENGINE = MEMORY;
+LOAD DATA INFILE '<MYSQLTEST_VARDIR>/tmp.dat' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
DROP TABLE test.backup_info;
UPDATE t1 SET c2=0 WHERE c3="row2";
SELECT hex(c1),hex(c2),c3 FROM t1 ORDER BY c3;
diff --git a/mysql-test/suite/sys_vars/r/auto_increment_increment_basic.result b/mysql-test/suite/sys_vars/r/auto_increment_increment_basic.result
index c453d2322cf..3cfdc54457b 100644
--- a/mysql-test/suite/sys_vars/r/auto_increment_increment_basic.result
+++ b/mysql-test/suite/sys_vars/r/auto_increment_increment_basic.result
@@ -55,13 +55,13 @@ SELECT @@session.auto_increment_increment;
'#------------------FN_DYNVARS_001_05-----------------------#'
SET @@global.auto_increment_increment = 0;
Warnings:
-Warning 1292 Truncated incorrect auto-increment-increment value: '0'
+Warning 1292 Truncated incorrect auto_increment_increment value: '0'
SELECT @@global.auto_increment_increment;
@@global.auto_increment_increment
1
SET @@global.auto_increment_increment = -1024;
Warnings:
-Warning 1292 Truncated incorrect auto-increment-increment value: '0'
+Warning 1292 Truncated incorrect auto_increment_increment value: '-1024'
SELECT @@global.auto_increment_increment;
@@global.auto_increment_increment
1
@@ -83,13 +83,13 @@ SELECT @@global.auto_increment_increment;
65535
SET @@session.auto_increment_increment = 0;
Warnings:
-Warning 1292 Truncated incorrect auto-increment-increment value: '0'
+Warning 1292 Truncated incorrect auto_increment_increment value: '0'
SELECT @@session.auto_increment_increment;
@@session.auto_increment_increment
1
SET @@session.auto_increment_increment = -2;
Warnings:
-Warning 1292 Truncated incorrect auto-increment-increment value: '0'
+Warning 1292 Truncated incorrect auto_increment_increment value: '-2'
SELECT @@session.auto_increment_increment;
@@session.auto_increment_increment
1
@@ -126,7 +126,7 @@ SELECT @@global.auto_increment_increment;
1
SET @@global.auto_increment_increment = FALSE;
Warnings:
-Warning 1292 Truncated incorrect auto-increment-increment value: '0'
+Warning 1292 Truncated incorrect auto_increment_increment value: '0'
SELECT @@global.auto_increment_increment;
@@global.auto_increment_increment
1
diff --git a/mysql-test/suite/sys_vars/r/auto_increment_increment_func.result b/mysql-test/suite/sys_vars/r/auto_increment_increment_func.result
index f0f1ada6d95..eeaa3949886 100644
--- a/mysql-test/suite/sys_vars/r/auto_increment_increment_func.result
+++ b/mysql-test/suite/sys_vars/r/auto_increment_increment_func.result
@@ -169,7 +169,7 @@ id name
## Verifying behavior of variable with negative value ##
SET @@auto_increment_increment = -10;
Warnings:
-Warning 1292 Truncated incorrect auto-increment-increment value: '0'
+Warning 1292 Truncated incorrect auto_increment_increment value: '-10'
INSERT into t1(name) values('Record_17');
INSERT into t1(name) values('Record_18');
SELECT * from t1;
diff --git a/mysql-test/suite/sys_vars/r/auto_increment_offset_basic.result b/mysql-test/suite/sys_vars/r/auto_increment_offset_basic.result
index b5ccca8ce56..7752851cb4c 100644
--- a/mysql-test/suite/sys_vars/r/auto_increment_offset_basic.result
+++ b/mysql-test/suite/sys_vars/r/auto_increment_offset_basic.result
@@ -55,13 +55,13 @@ SELECT @@session.auto_increment_offset;
'#------------------FN_DYNVARS_002_05-----------------------#'
SET @@global.auto_increment_offset = 0;
Warnings:
-Warning 1292 Truncated incorrect auto-increment-offset value: '0'
+Warning 1292 Truncated incorrect auto_increment_offset value: '0'
SELECT @@global.auto_increment_offset;
@@global.auto_increment_offset
1
SET @@global.auto_increment_offset = -1024;
Warnings:
-Warning 1292 Truncated incorrect auto-increment-offset value: '0'
+Warning 1292 Truncated incorrect auto_increment_offset value: '-1024'
SELECT @@global.auto_increment_offset;
@@global.auto_increment_offset
1
@@ -88,13 +88,13 @@ SELECT @@global.auto_increment_offset;
65535
SET @@session.auto_increment_offset = 0;
Warnings:
-Warning 1292 Truncated incorrect auto-increment-offset value: '0'
+Warning 1292 Truncated incorrect auto_increment_offset value: '0'
SELECT @@session.auto_increment_offset;
@@session.auto_increment_offset
1
SET @@session.auto_increment_offset = -2;
Warnings:
-Warning 1292 Truncated incorrect auto-increment-offset value: '0'
+Warning 1292 Truncated incorrect auto_increment_offset value: '-2'
SELECT @@session.auto_increment_offset;
@@session.auto_increment_offset
1
@@ -139,7 +139,7 @@ SELECT @@global.auto_increment_offset;
1
SET @@global.auto_increment_offset = FALSE;
Warnings:
-Warning 1292 Truncated incorrect auto-increment-offset value: '0'
+Warning 1292 Truncated incorrect auto_increment_offset value: '0'
SELECT @@global.auto_increment_offset;
@@global.auto_increment_offset
1
diff --git a/mysql-test/suite/sys_vars/r/auto_increment_offset_func.result b/mysql-test/suite/sys_vars/r/auto_increment_offset_func.result
index 5c953544e73..e166cb149f6 100644
--- a/mysql-test/suite/sys_vars/r/auto_increment_offset_func.result
+++ b/mysql-test/suite/sys_vars/r/auto_increment_offset_func.result
@@ -178,7 +178,7 @@ id name
## Assigning -ve value to variable ##
SET @@auto_increment_offset = -10;
Warnings:
-Warning 1292 Truncated incorrect auto-increment-offset value: '0'
+Warning 1292 Truncated incorrect auto_increment_offset value: '-10'
SELECT @@auto_increment_offset = -10;
@@auto_increment_offset = -10
0
diff --git a/mysql-test/suite/sys_vars/r/completion_type_func.result b/mysql-test/suite/sys_vars/r/completion_type_func.result
index daee738c10d..f3ddcd287b6 100644
--- a/mysql-test/suite/sys_vars/r/completion_type_func.result
+++ b/mysql-test/suite/sys_vars/r/completion_type_func.result
@@ -2,76 +2,187 @@ DROP TABLE IF EXISTS t1;
## Creating new table ##
CREATE TABLE t1
(
-id INT NOT NULL AUTO_INCREMENT,
+id INT NOT NULL,
PRIMARY KEY (id),
name VARCHAR(30)
) ENGINE = INNODB;
-'#--------------------FN_DYNVARS_017_01-------------------------#'
-## Creating new connection ##
-INSERT INTO t1(name) VALUES('Record_1');
-SET @@autocommit = 0;
+## Creating new connections test_con1, test_con2 ##
+#########################################################
+# Setting initial value of completion_type to zero #
+#########################################################
+INSERT INTO t1 VALUES(1,'Record_1');
SELECT * FROM t1;
id name
1 Record_1
## Setting value of variable to 0 ##
SET @@session.completion_type = 0;
## Here commit & rollback should work normally ##
+## test commit ##
START TRANSACTION;
+INSERT INTO t1 VALUES(2,'Record_2');
+INSERT INTO t1 VALUES(3,'Record_3');
SELECT * FROM t1;
id name
1 Record_1
-INSERT INTO t1(name) VALUES('Record_2');
-INSERT INTO t1(name) VALUES('Record_3');
+2 Record_2
+3 Record_3
+Switching to connection test_con1
+## Don't expect to see id's 2 and 3 in the table w/o COMMIT ##
+SELECT * FROM t1;
+id name
+1 Record_1
+Switching to default connection
+COMMIT;
+## test rollback ##
+START TRANSACTION;
+INSERT INTO t1 VALUES(4,'Record_4');
+INSERT INTO t1 VALUES(5,'Record_5');
+SELECT * FROM t1;
+id name
+1 Record_1
+2 Record_2
+3 Record_3
+4 Record_4
+5 Record_5
+Switching to connection test_con1
+## Don't expect to see id's 4 and 5 here ##
+## Expect to see 3, Record_3 ##
SELECT * FROM t1;
id name
1 Record_1
2 Record_2
3 Record_3
-DELETE FROM t1 WHERE id = 2;
+Switching to connection default;
+ROLLBACK;
+## Don't expect to see id's 4 and 5 now ##
SELECT * FROM t1;
id name
1 Record_1
+2 Record_2
3 Record_3
+
+#########################################################
+# Setting initial value of completion_type to one #
+#########################################################
+Switching to connection test_con1;
+SET @@session.completion_type = 1;
START TRANSACTION;
SELECT * FROM t1;
id name
1 Record_1
+2 Record_2
3 Record_3
-INSERT INTO t1(name) VALUES('Record_4');
-INSERT INTO t1(name) VALUES('Record_5');
+INSERT INTO t1 VALUES(6,'Record_6');
+INSERT INTO t1 VALUES(7,'Record_7');
COMMIT;
-'#--------------------FN_DYNVARS_017_02-------------------------#'
+## Expect to immediately have a new transaction ##
+INSERT INTO t1 VALUES(8,'Record_8');
+SELECT * FROM t1;
+id name
+1 Record_1
+2 Record_2
+3 Record_3
+6 Record_6
+7 Record_7
+8 Record_8
+switching to test_con2
+## Do not expect to see 8, Record_8 as no COMMIT has occurred ##
+SELECT * FROM t1;
+id name
+1 Record_1
+2 Record_2
+3 Record_3
+6 Record_6
+7 Record_7
+switch to connection test_con1
+## Testing ROLLBACK behavior
+START TRANSACTION;
+INSERT INTO t1 VALUES(9, 'Record_9');
+INSERT INTO t1 VALUES(10, 'Record_10');
+## Expect to see id's 8, 9, 10 here ##
+## 8, Record_8 COMMITted with the start of this transaction ##
+SELECT * FROM t1;
+id name
+1 Record_1
+2 Record_2
+3 Record_3
+6 Record_6
+7 Record_7
+8 Record_8
+9 Record_9
+10 Record_10
+ROLLBACK;
+## id's 9 and 10 are gone now due to ROLLBACK ##
+SELECT * FROM t1;
+id name
+1 Record_1
+2 Record_2
+3 Record_3
+6 Record_6
+7 Record_7
+8 Record_8
+## Expect a new transaction ##
+INSERT INTO t1 VALUES(9, 'Record_9');
+Switching to connection test_con2
+## Don't expect to see 9, Record_9 due to no COMMIT yet ##
+SELECT * FROM t1;
+id name
+1 Record_1
+2 Record_2
+3 Record_3
+6 Record_6
+7 Record_7
+8 Record_8
+Switching to connection test_con1
+ROLLBACK;
+## Don't expect to see 9, Record_9
+SELECT * FROM t1;
+id name
+1 Record_1
+2 Record_2
+3 Record_3
+6 Record_6
+7 Record_7
+8 Record_8
+#########################################################
+# Setting initial value of completion_type to 2 #
+#########################################################
SET @@session.completion_type = 2;
## Here commit should work as COMMIT RELEASE ##
START TRANSACTION;
SELECT * FROM t1;
id name
1 Record_1
+2 Record_2
3 Record_3
-4 Record_4
-5 Record_5
-INSERT INTO t1(name) VALUES('Record_6');
-INSERT INTO t1(name) VALUES('Record_7');
+6 Record_6
+7 Record_7
+8 Record_8
+INSERT INTO t1 VALUES(9,'Record_9');
+INSERT INTO t1 VALUES(10,'Record_10');
COMMIT;
## Inserting rows should give error here because connection should ##
## disconnect after using COMMIT ##
-INSERT INTO t1(name) VALUES('Record_4');
+INSERT INTO t1 VALUES(4,'Record_4');
Got one of the listed errors
-## Creating new connection test_con2 ##
+switch to connection test_con2
SET @@session.completion_type = 2;
## Inserting rows and using Rollback which should Rollback & release ##
START TRANSACTION;
SELECT * FROM t1;
id name
1 Record_1
+2 Record_2
3 Record_3
-4 Record_4
-5 Record_5
6 Record_6
7 Record_7
-INSERT INTO t1(name) VALUES('Record_8');
-INSERT INTO t1(name) VALUES('Record_9');
+8 Record_8
+9 Record_9
+10 Record_10
+INSERT INTO t1 VALUES(11,'Record_11');
+INSERT INTO t1 VALUES(12,'Record_12');
ROLLBACK;
-INSERT INTO t1(name) VALUES('Record_4');
+## Expect a failure due to COMMIT/ROLLBACK AND RELEASE behavior ##
+INSERT INTO t1 VALUES(4,'Record_4');
Got one of the listed errors
DROP TABLE t1;
diff --git a/mysql-test/suite/sys_vars/r/concurrent_insert_basic.result b/mysql-test/suite/sys_vars/r/concurrent_insert_basic.result
index e6614ea6abb..1ea9c37c2a1 100644
--- a/mysql-test/suite/sys_vars/r/concurrent_insert_basic.result
+++ b/mysql-test/suite/sys_vars/r/concurrent_insert_basic.result
@@ -28,12 +28,14 @@ SELECT @@global.concurrent_insert;
2
'#--------------------FN_DYNVARS_018_04-------------------------#'
SET @@global.concurrent_insert = -1;
+Warnings:
+Warning 1292 Truncated incorrect concurrent_insert value: '-1'
Select @@global.concurrent_insert;
@@global.concurrent_insert
0
SET @@global.concurrent_insert = 100;
Warnings:
-Warning 1292 Truncated incorrect concurrent-insert value: '100'
+Warning 1292 Truncated incorrect concurrent_insert value: '100'
Select @@global.concurrent_insert;
@@global.concurrent_insert
2
diff --git a/mysql-test/suite/sys_vars/r/connect_timeout_basic.result b/mysql-test/suite/sys_vars/r/connect_timeout_basic.result
index 7cdd747fc15..cc84405cf86 100644
--- a/mysql-test/suite/sys_vars/r/connect_timeout_basic.result
+++ b/mysql-test/suite/sys_vars/r/connect_timeout_basic.result
@@ -35,7 +35,7 @@ SELECT @@global.connect_timeout;
2
SET @@global.connect_timeout = -1024;
Warnings:
-Warning 1292 Truncated incorrect connect_timeout value: '0'
+Warning 1292 Truncated incorrect connect_timeout value: '-1024'
SELECT @@global.connect_timeout;
@@global.connect_timeout
2
diff --git a/mysql-test/suite/sys_vars/r/default_week_format_basic.result b/mysql-test/suite/sys_vars/r/default_week_format_basic.result
index d513ef1c41e..aa5e0b264d3 100644
--- a/mysql-test/suite/sys_vars/r/default_week_format_basic.result
+++ b/mysql-test/suite/sys_vars/r/default_week_format_basic.result
@@ -64,6 +64,8 @@ SELECT @@global.default_week_format;
@@global.default_week_format
7
SET @@global.default_week_format = -1024;
+Warnings:
+Warning 1292 Truncated incorrect default_week_format value: '-1024'
SELECT @@global.default_week_format;
@@global.default_week_format
0
@@ -100,6 +102,8 @@ SELECT @@session.default_week_format;
@@session.default_week_format
7
SET @@session.default_week_format = -2;
+Warnings:
+Warning 1292 Truncated incorrect default_week_format value: '-2'
SELECT @@session.default_week_format;
@@session.default_week_format
0
diff --git a/mysql-test/suite/sys_vars/r/delayed_insert_timeout_basic.result b/mysql-test/suite/sys_vars/r/delayed_insert_timeout_basic.result
index 4049907eb80..e8eab4da3cc 100644
--- a/mysql-test/suite/sys_vars/r/delayed_insert_timeout_basic.result
+++ b/mysql-test/suite/sys_vars/r/delayed_insert_timeout_basic.result
@@ -35,7 +35,7 @@ SELECT @@global.delayed_insert_timeout;
1
SET @@global.delayed_insert_timeout = -1024;
Warnings:
-Warning 1292 Truncated incorrect delayed_insert_timeout value: '0'
+Warning 1292 Truncated incorrect delayed_insert_timeout value: '-1024'
SELECT @@global.delayed_insert_timeout;
@@global.delayed_insert_timeout
1
diff --git a/mysql-test/suite/sys_vars/r/div_precision_increment_basic.result b/mysql-test/suite/sys_vars/r/div_precision_increment_basic.result
index d0311afa681..f78855fcaae 100644
--- a/mysql-test/suite/sys_vars/r/div_precision_increment_basic.result
+++ b/mysql-test/suite/sys_vars/r/div_precision_increment_basic.result
@@ -78,6 +78,8 @@ SELECT @@global.div_precision_increment;
@@global.div_precision_increment
30
SET @@global.div_precision_increment = -1024;
+Warnings:
+Warning 1292 Truncated incorrect div_precision_increment value: '-1024'
SELECT @@global.div_precision_increment;
@@global.div_precision_increment
0
@@ -100,6 +102,8 @@ SELECT @@session.div_precision_increment;
@@session.div_precision_increment
30
SET @@session.div_precision_increment = -2;
+Warnings:
+Warning 1292 Truncated incorrect div_precision_increment value: '-2'
SELECT @@session.div_precision_increment;
@@session.div_precision_increment
0
diff --git a/mysql-test/suite/sys_vars/r/expire_logs_days_basic.result b/mysql-test/suite/sys_vars/r/expire_logs_days_basic.result
index 66aa5fa42a5..1abab8e68b0 100644
--- a/mysql-test/suite/sys_vars/r/expire_logs_days_basic.result
+++ b/mysql-test/suite/sys_vars/r/expire_logs_days_basic.result
@@ -32,6 +32,8 @@ SELECT @@global.expire_logs_days;
21
'#--------------------FN_DYNVARS_029_04-------------------------#'
SET @@global.expire_logs_days = -1;
+Warnings:
+Warning 1292 Truncated incorrect expire_logs_days value: '-1'
SELECT @@global.expire_logs_days;
@@global.expire_logs_days
0
@@ -53,6 +55,8 @@ SELECT @@global.expire_logs_days;
@@global.expire_logs_days
99
SET @@global.expire_logs_days = -1024;
+Warnings:
+Warning 1292 Truncated incorrect expire_logs_days value: '-1024'
SELECT @@global.expire_logs_days;
@@global.expire_logs_days
0
diff --git a/mysql-test/suite/sys_vars/r/group_concat_max_len_basic.result b/mysql-test/suite/sys_vars/r/group_concat_max_len_basic.result
index 5704f00c014..4821ca91308 100644
--- a/mysql-test/suite/sys_vars/r/group_concat_max_len_basic.result
+++ b/mysql-test/suite/sys_vars/r/group_concat_max_len_basic.result
@@ -65,7 +65,7 @@ SELECT @@global.group_concat_max_len;
4
SET @@global.group_concat_max_len = -1024;
Warnings:
-Warning 1292 Truncated incorrect group_concat_max_len value: '0'
+Warning 1292 Truncated incorrect group_concat_max_len value: '-1024'
SELECT @@global.group_concat_max_len;
@@global.group_concat_max_len
4
@@ -91,7 +91,7 @@ SELECT @@session.group_concat_max_len;
4
SET @@session.group_concat_max_len = -2;
Warnings:
-Warning 1292 Truncated incorrect group_concat_max_len value: '0'
+Warning 1292 Truncated incorrect group_concat_max_len value: '-2'
SELECT @@session.group_concat_max_len;
@@session.group_concat_max_len
4
diff --git a/mysql-test/suite/sys_vars/r/interactive_timeout_basic.result b/mysql-test/suite/sys_vars/r/interactive_timeout_basic.result
index 0777596db07..519fef8a6e5 100644
--- a/mysql-test/suite/sys_vars/r/interactive_timeout_basic.result
+++ b/mysql-test/suite/sys_vars/r/interactive_timeout_basic.result
@@ -61,7 +61,7 @@ SELECT @@global.interactive_timeout;
1
SET @@global.interactive_timeout = -1024;
Warnings:
-Warning 1292 Truncated incorrect interactive_timeout value: '0'
+Warning 1292 Truncated incorrect interactive_timeout value: '-1024'
SELECT @@global.interactive_timeout;
@@global.interactive_timeout
1
@@ -89,7 +89,7 @@ SELECT @@session.interactive_timeout;
1
SET @@session.interactive_timeout = -2;
Warnings:
-Warning 1292 Truncated incorrect interactive_timeout value: '0'
+Warning 1292 Truncated incorrect interactive_timeout value: '-2'
SELECT @@session.interactive_timeout;
@@session.interactive_timeout
1
diff --git a/mysql-test/suite/sys_vars/r/max_allowed_packet_basic.result b/mysql-test/suite/sys_vars/r/max_allowed_packet_basic.result
index 0745d5a36e1..ca5b87f19cb 100644
--- a/mysql-test/suite/sys_vars/r/max_allowed_packet_basic.result
+++ b/mysql-test/suite/sys_vars/r/max_allowed_packet_basic.result
@@ -76,7 +76,7 @@ SELECT @@global.max_allowed_packet;
1024
SET @@global.max_allowed_packet = -1024;
Warnings:
-Warning 1292 Truncated incorrect max_allowed_packet value: '0'
+Warning 1292 Truncated incorrect max_allowed_packet value: '-1024'
SELECT @@global.max_allowed_packet;
@@global.max_allowed_packet
1024
diff --git a/mysql-test/suite/sys_vars/r/max_binlog_size_basic.result b/mysql-test/suite/sys_vars/r/max_binlog_size_basic.result
index 291b687f76c..658289628b0 100644
--- a/mysql-test/suite/sys_vars/r/max_binlog_size_basic.result
+++ b/mysql-test/suite/sys_vars/r/max_binlog_size_basic.result
@@ -39,7 +39,7 @@ SELECT @@global.max_binlog_size;
'#--------------------FN_DYNVARS_072_04-------------------------#'
SET @@global.max_binlog_size = -1;
Warnings:
-Warning 1292 Truncated incorrect max_binlog_size value: '0'
+Warning 1292 Truncated incorrect max_binlog_size value: '-1'
SELECT @@global.max_binlog_size;
@@global.max_binlog_size
4096
@@ -56,7 +56,7 @@ SELECT @@global.max_binlog_size;
1073741824
SET @@global.max_binlog_size = -1024;
Warnings:
-Warning 1292 Truncated incorrect max_binlog_size value: '0'
+Warning 1292 Truncated incorrect max_binlog_size value: '-1024'
SELECT @@global.max_binlog_size;
@@global.max_binlog_size
4096
diff --git a/mysql-test/suite/sys_vars/r/max_connections_basic.result b/mysql-test/suite/sys_vars/r/max_connections_basic.result
index ccedff01c54..d917cd97b25 100644
--- a/mysql-test/suite/sys_vars/r/max_connections_basic.result
+++ b/mysql-test/suite/sys_vars/r/max_connections_basic.result
@@ -39,7 +39,7 @@ SELECT @@global.max_connections;
'#--------------------FN_DYNVARS_074_04-------------------------#'
SET @@global.max_connections = -1;
Warnings:
-Warning 1292 Truncated incorrect max_connections value: '0'
+Warning 1292 Truncated incorrect max_connections value: '-1'
SELECT @@global.max_connections;
@@global.max_connections
1
@@ -56,7 +56,7 @@ SELECT @@global.max_connections;
100000
SET @@global.max_connections = -1024;
Warnings:
-Warning 1292 Truncated incorrect max_connections value: '0'
+Warning 1292 Truncated incorrect max_connections value: '-1024'
SELECT @@global.max_connections;
@@global.max_connections
1
diff --git a/mysql-test/suite/sys_vars/r/max_delayed_threads_basic.result b/mysql-test/suite/sys_vars/r/max_delayed_threads_basic.result
index e0b2a3ee1cd..946c24e3082 100644
--- a/mysql-test/suite/sys_vars/r/max_delayed_threads_basic.result
+++ b/mysql-test/suite/sys_vars/r/max_delayed_threads_basic.result
@@ -76,10 +76,14 @@ SELECT @@session.max_delayed_threads;
16383
'#------------------FN_DYNVARS_075_05-----------------------#'
SET @@global.max_delayed_threads = -1024;
+Warnings:
+Warning 1292 Truncated incorrect max_delayed_threads value: '-1024'
SELECT @@global.max_delayed_threads;
@@global.max_delayed_threads
0
SET @@global.max_delayed_threads = -1;
+Warnings:
+Warning 1292 Truncated incorrect max_delayed_threads value: '-1'
SELECT @@global.max_delayed_threads;
@@global.max_delayed_threads
0
diff --git a/mysql-test/suite/sys_vars/r/max_error_count_basic.result b/mysql-test/suite/sys_vars/r/max_error_count_basic.result
index 2046a5e9dfa..7be8e0f37a3 100644
--- a/mysql-test/suite/sys_vars/r/max_error_count_basic.result
+++ b/mysql-test/suite/sys_vars/r/max_error_count_basic.result
@@ -63,10 +63,14 @@ SELECT @@session.max_error_count;
65534
'#------------------FN_DYNVARS_076_05-----------------------#'
SET @@global.max_error_count = -1;
+Warnings:
+Warning 1292 Truncated incorrect max_error_count value: '-1'
SELECT @@global.max_error_count;
@@global.max_error_count
0
SET @@global.max_error_count = -1024;
+Warnings:
+Warning 1292 Truncated incorrect max_error_count value: '-1024'
SELECT @@global.max_error_count;
@@global.max_error_count
0
@@ -93,6 +97,8 @@ SELECT @@global.max_error_count;
@@global.max_error_count
65535
SET @@session.max_error_count = -1;
+Warnings:
+Warning 1292 Truncated incorrect max_error_count value: '-1'
SELECT @@session.max_error_count;
@@session.max_error_count
0
@@ -102,6 +108,8 @@ SELECT @@session.max_error_count;
@@session.max_error_count
65535
SET @@session.max_error_count = -2;
+Warnings:
+Warning 1292 Truncated incorrect max_error_count value: '-2'
SELECT @@session.max_error_count;
@@session.max_error_count
0
diff --git a/mysql-test/suite/sys_vars/r/max_insert_delayed_threads_basic.result b/mysql-test/suite/sys_vars/r/max_insert_delayed_threads_basic.result
index 31c1fcec396..2f2f7f0c0fc 100644
--- a/mysql-test/suite/sys_vars/r/max_insert_delayed_threads_basic.result
+++ b/mysql-test/suite/sys_vars/r/max_insert_delayed_threads_basic.result
@@ -77,10 +77,14 @@ SELECT @@session.max_insert_delayed_threads;
16383
'#------------------FN_DYNVARS_078_05-----------------------#'
SET @@global.max_insert_delayed_threads = -1024;
+Warnings:
+Warning 1292 Truncated incorrect max_insert_delayed_threads value: '-1024'
SELECT @@global.max_insert_delayed_threads;
@@global.max_insert_delayed_threads
0
SET @@global.max_insert_delayed_threads = -1;
+Warnings:
+Warning 1292 Truncated incorrect max_insert_delayed_threads value: '-1'
SELECT @@global.max_insert_delayed_threads;
@@global.max_insert_delayed_threads
0
diff --git a/mysql-test/suite/sys_vars/r/max_length_for_sort_data_basic.result b/mysql-test/suite/sys_vars/r/max_length_for_sort_data_basic.result
index 3edd3e86262..8936946c774 100644
--- a/mysql-test/suite/sys_vars/r/max_length_for_sort_data_basic.result
+++ b/mysql-test/suite/sys_vars/r/max_length_for_sort_data_basic.result
@@ -71,7 +71,7 @@ SELECT @@session.max_length_for_sort_data;
'#------------------FN_DYNVARS_080_05-----------------------#'
SET @@global.max_length_for_sort_data = -1024;
Warnings:
-Warning 1292 Truncated incorrect max_length_for_sort_data value: '0'
+Warning 1292 Truncated incorrect max_length_for_sort_data value: '-1024'
SELECT @@global.max_length_for_sort_data;
@@global.max_length_for_sort_data
4
@@ -111,7 +111,7 @@ SELECT @@session.max_length_for_sort_data;
8388608
SET @@session.max_length_for_sort_data = -1;
Warnings:
-Warning 1292 Truncated incorrect max_length_for_sort_data value: '0'
+Warning 1292 Truncated incorrect max_length_for_sort_data value: '-1'
SELECT @@session.max_length_for_sort_data;
@@session.max_length_for_sort_data
4
diff --git a/mysql-test/suite/sys_vars/r/max_prepared_stmt_count_basic.result b/mysql-test/suite/sys_vars/r/max_prepared_stmt_count_basic.result
index ebc7da8c7f8..9c28c287980 100644
--- a/mysql-test/suite/sys_vars/r/max_prepared_stmt_count_basic.result
+++ b/mysql-test/suite/sys_vars/r/max_prepared_stmt_count_basic.result
@@ -36,6 +36,8 @@ SELECT @@global.max_prepared_stmt_count;
65535
'#--------------------FN_DYNVARS_081_04-------------------------#'
SET @@global.max_prepared_stmt_count = -1;
+Warnings:
+Warning 1292 Truncated incorrect max_prepared_stmt_count value: '-1'
SELECT @@global.max_prepared_stmt_count;
@@global.max_prepared_stmt_count
0
@@ -51,6 +53,8 @@ SELECT @@global.max_prepared_stmt_count;
@@global.max_prepared_stmt_count
1048576
SET @@global.max_prepared_stmt_count = -1024;
+Warnings:
+Warning 1292 Truncated incorrect max_prepared_stmt_count value: '-1024'
SELECT @@global.max_prepared_stmt_count;
@@global.max_prepared_stmt_count
0
diff --git a/mysql-test/suite/sys_vars/r/max_relay_log_size_basic.result b/mysql-test/suite/sys_vars/r/max_relay_log_size_basic.result
index c0042f497ad..168459cf7b6 100644
--- a/mysql-test/suite/sys_vars/r/max_relay_log_size_basic.result
+++ b/mysql-test/suite/sys_vars/r/max_relay_log_size_basic.result
@@ -38,6 +38,8 @@ SELECT @@global.max_relay_log_size;
'Bug# 34877: Invalid Values are coming in variable on assigning valid values';
'#--------------------FN_DYNVARS_082_04-------------------------#'
SET @@global.max_relay_log_size = -1;
+Warnings:
+Warning 1292 Truncated incorrect max_relay_log_size value: '-1'
SELECT @@global.max_relay_log_size;
@@global.max_relay_log_size
0
@@ -53,6 +55,8 @@ SELECT @@global.max_relay_log_size;
@@global.max_relay_log_size
1073741824
SET @@global.max_relay_log_size = -1024;
+Warnings:
+Warning 1292 Truncated incorrect max_relay_log_size value: '-1024'
SELECT @@global.max_relay_log_size;
@@global.max_relay_log_size
0
diff --git a/mysql-test/suite/sys_vars/r/max_sort_length_basic.result b/mysql-test/suite/sys_vars/r/max_sort_length_basic.result
index 73dd31ea4e7..f0a9ca83376 100644
--- a/mysql-test/suite/sys_vars/r/max_sort_length_basic.result
+++ b/mysql-test/suite/sys_vars/r/max_sort_length_basic.result
@@ -71,7 +71,7 @@ SELECT @@session.max_sort_length;
'#------------------FN_DYNVARS_084_05-----------------------#'
SET @@global.max_sort_length = -1024;
Warnings:
-Warning 1292 Truncated incorrect max_sort_length value: '0'
+Warning 1292 Truncated incorrect max_sort_length value: '-1024'
SELECT @@global.max_sort_length;
@@global.max_sort_length
4
@@ -111,7 +111,7 @@ SELECT @@session.max_sort_length;
8388608
SET @@session.max_sort_length = -1;
Warnings:
-Warning 1292 Truncated incorrect max_sort_length value: '0'
+Warning 1292 Truncated incorrect max_sort_length value: '-1'
SELECT @@session.max_sort_length;
@@session.max_sort_length
4
diff --git a/mysql-test/suite/sys_vars/r/max_sp_recursion_depth_basic.result b/mysql-test/suite/sys_vars/r/max_sp_recursion_depth_basic.result
index 8c79f3c5fc7..e5f267253f4 100644
--- a/mysql-test/suite/sys_vars/r/max_sp_recursion_depth_basic.result
+++ b/mysql-test/suite/sys_vars/r/max_sp_recursion_depth_basic.result
@@ -74,6 +74,8 @@ SELECT @@session.max_sp_recursion_depth;
150
'#------------------FN_DYNVARS_085_05-----------------------#'
SET @@global.max_sp_recursion_depth = -1024;
+Warnings:
+Warning 1292 Truncated incorrect max_sp_recursion_depth value: '-1024'
SELECT @@global.max_sp_recursion_depth;
@@global.max_sp_recursion_depth
0
@@ -84,6 +86,8 @@ SELECT @@global.max_sp_recursion_depth;
@@global.max_sp_recursion_depth
255
SET @@global.max_sp_recursion_depth = -1;
+Warnings:
+Warning 1292 Truncated incorrect max_sp_recursion_depth value: '-1'
SELECT @@global.max_sp_recursion_depth;
@@global.max_sp_recursion_depth
0
@@ -110,6 +114,8 @@ SELECT @@session.max_sp_recursion_depth;
@@session.max_sp_recursion_depth
255
SET @@session.max_sp_recursion_depth = -1;
+Warnings:
+Warning 1292 Truncated incorrect max_sp_recursion_depth value: '-1'
SELECT @@session.max_sp_recursion_depth;
@@session.max_sp_recursion_depth
0
@@ -120,6 +126,8 @@ SELECT @@session.max_sp_recursion_depth;
@@session.max_sp_recursion_depth
255
SET @@session.max_sp_recursion_depth = -001;
+Warnings:
+Warning 1292 Truncated incorrect max_sp_recursion_depth value: '-1'
SELECT @@session.max_sp_recursion_depth;
@@session.max_sp_recursion_depth
0
diff --git a/mysql-test/suite/sys_vars/r/myisam_data_pointer_size_basic.result b/mysql-test/suite/sys_vars/r/myisam_data_pointer_size_basic.result
index d2b0bebe029..86f7788fcdf 100644
--- a/mysql-test/suite/sys_vars/r/myisam_data_pointer_size_basic.result
+++ b/mysql-test/suite/sys_vars/r/myisam_data_pointer_size_basic.result
@@ -48,7 +48,7 @@ ERROR HY000: Variable 'myisam_data_pointer_size' is a GLOBAL variable and should
'#------------------FN_DYNVARS_093_05-----------------------#'
SET @@global.myisam_data_pointer_size = -1;
Warnings:
-Warning 1292 Truncated incorrect myisam_data_pointer_size value: '0'
+Warning 1292 Truncated incorrect myisam_data_pointer_size value: '-1'
SELECT @@global.myisam_data_pointer_size;
@@global.myisam_data_pointer_size
2
diff --git a/mysql-test/suite/sys_vars/r/net_buffer_length_basic.result b/mysql-test/suite/sys_vars/r/net_buffer_length_basic.result
index be7e9082332..07f933b5a4b 100644
--- a/mysql-test/suite/sys_vars/r/net_buffer_length_basic.result
+++ b/mysql-test/suite/sys_vars/r/net_buffer_length_basic.result
@@ -50,7 +50,7 @@ SELECT @@global.net_buffer_length;
1024
SET @@global.net_buffer_length = -1024;
Warnings:
-Warning 1292 Truncated incorrect net_buffer_length value: '0'
+Warning 1292 Truncated incorrect net_buffer_length value: '-1024'
SELECT @@global.net_buffer_length;
@@global.net_buffer_length
1024
diff --git a/mysql-test/suite/sys_vars/r/net_read_timeout_basic.result b/mysql-test/suite/sys_vars/r/net_read_timeout_basic.result
index 90a6ef72718..aeee25c6526 100644
--- a/mysql-test/suite/sys_vars/r/net_read_timeout_basic.result
+++ b/mysql-test/suite/sys_vars/r/net_read_timeout_basic.result
@@ -61,7 +61,7 @@ SELECT @@global.net_read_timeout;
1
SET @@global.net_read_timeout = -1024;
Warnings:
-Warning 1292 Truncated incorrect net_read_timeout value: '0'
+Warning 1292 Truncated incorrect net_read_timeout value: '-1024'
SELECT @@global.net_read_timeout;
@@global.net_read_timeout
1
@@ -89,7 +89,7 @@ SELECT @@session.net_read_timeout;
1
SET @@session.net_read_timeout = -2;
Warnings:
-Warning 1292 Truncated incorrect net_read_timeout value: '0'
+Warning 1292 Truncated incorrect net_read_timeout value: '-2'
SELECT @@session.net_read_timeout;
@@session.net_read_timeout
1
diff --git a/mysql-test/suite/sys_vars/r/net_write_timeout_basic.result b/mysql-test/suite/sys_vars/r/net_write_timeout_basic.result
index 35a2cf069e3..8857b8c0e37 100644
--- a/mysql-test/suite/sys_vars/r/net_write_timeout_basic.result
+++ b/mysql-test/suite/sys_vars/r/net_write_timeout_basic.result
@@ -61,7 +61,7 @@ SELECT @@global.net_write_timeout;
1
SET @@global.net_write_timeout = -1024;
Warnings:
-Warning 1292 Truncated incorrect net_write_timeout value: '0'
+Warning 1292 Truncated incorrect net_write_timeout value: '-1024'
SELECT @@global.net_write_timeout;
@@global.net_write_timeout
1
@@ -89,7 +89,7 @@ SELECT @@session.net_write_timeout;
1
SET @@session.net_write_timeout = -2;
Warnings:
-Warning 1292 Truncated incorrect net_write_timeout value: '0'
+Warning 1292 Truncated incorrect net_write_timeout value: '-2'
SELECT @@session.net_write_timeout;
@@session.net_write_timeout
1
diff --git a/mysql-test/suite/sys_vars/r/optimizer_prune_level_basic.result b/mysql-test/suite/sys_vars/r/optimizer_prune_level_basic.result
index 46fe70c40d0..c126569ebcd 100644
--- a/mysql-test/suite/sys_vars/r/optimizer_prune_level_basic.result
+++ b/mysql-test/suite/sys_vars/r/optimizer_prune_level_basic.result
@@ -81,6 +81,8 @@ ERROR 42000: Incorrect argument type to variable 'optimizer_prune_level'
SET @@global.optimizer_prune_level = FELSE;
ERROR 42000: Incorrect argument type to variable 'optimizer_prune_level'
SET @@global.optimizer_prune_level = -1024;
+Warnings:
+Warning 1292 Truncated incorrect optimizer_prune_level value: '-1024'
SELECT @@global.optimizer_prune_level;
@@global.optimizer_prune_level
0
@@ -107,6 +109,8 @@ ERROR 42000: Incorrect argument type to variable 'optimizer_prune_level'
SET @@session.optimizer_prune_level = 'OFN';
ERROR 42000: Incorrect argument type to variable 'optimizer_prune_level'
SET @@session.optimizer_prune_level = -2;
+Warnings:
+Warning 1292 Truncated incorrect optimizer_prune_level value: '-2'
SELECT @@session.optimizer_prune_level;
@@session.optimizer_prune_level
0
diff --git a/mysql-test/suite/sys_vars/r/optimizer_search_depth_basic.result b/mysql-test/suite/sys_vars/r/optimizer_search_depth_basic.result
index 9c26339839e..9c49ae7e73f 100644
--- a/mysql-test/suite/sys_vars/r/optimizer_search_depth_basic.result
+++ b/mysql-test/suite/sys_vars/r/optimizer_search_depth_basic.result
@@ -72,6 +72,8 @@ SELECT @@global.optimizer_search_depth;
@@global.optimizer_search_depth
63
SET @@global.optimizer_search_depth = -1;
+Warnings:
+Warning 1292 Truncated incorrect optimizer_search_depth value: '-1'
SELECT @@global.optimizer_search_depth;
@@global.optimizer_search_depth
0
@@ -98,6 +100,8 @@ SELECT @@session.optimizer_search_depth;
@@session.optimizer_search_depth
63
SET @@session.optimizer_search_depth = -2;
+Warnings:
+Warning 1292 Truncated incorrect optimizer_search_depth value: '-2'
SELECT @@session.optimizer_search_depth;
@@session.optimizer_search_depth
0
diff --git a/mysql-test/suite/sys_vars/r/preload_buffer_size_basic.result b/mysql-test/suite/sys_vars/r/preload_buffer_size_basic.result
index 775b670d3bc..fd8bdd222d2 100644
--- a/mysql-test/suite/sys_vars/r/preload_buffer_size_basic.result
+++ b/mysql-test/suite/sys_vars/r/preload_buffer_size_basic.result
@@ -77,7 +77,7 @@ SELECT @@global.preload_buffer_size;
1024
SET @@global.preload_buffer_size = -1;
Warnings:
-Warning 1292 Truncated incorrect preload_buffer_size value: '0'
+Warning 1292 Truncated incorrect preload_buffer_size value: '-1'
SELECT @@global.preload_buffer_size;
@@global.preload_buffer_size
1024
@@ -111,7 +111,7 @@ SELECT @@session.preload_buffer_size;
1024
SET @@session.preload_buffer_size = -2;
Warnings:
-Warning 1292 Truncated incorrect preload_buffer_size value: '0'
+Warning 1292 Truncated incorrect preload_buffer_size value: '-2'
SELECT @@session.preload_buffer_size;
@@session.preload_buffer_size
1024
diff --git a/mysql-test/suite/sys_vars/r/read_buffer_size_basic.result b/mysql-test/suite/sys_vars/r/read_buffer_size_basic.result
index 3c007dc1515..046ba977c23 100644
--- a/mysql-test/suite/sys_vars/r/read_buffer_size_basic.result
+++ b/mysql-test/suite/sys_vars/r/read_buffer_size_basic.result
@@ -81,7 +81,7 @@ SELECT @@global.read_buffer_size= 8200 OR @@global.read_buffer_size= 8228 ;
1
SET @@global.read_buffer_size = -1024;
Warnings:
-Warning 1292 Truncated incorrect read_buffer_size value: '0'
+Warning 1292 Truncated incorrect read_buffer_size value: '-1024'
SELECT @@global.read_buffer_size= 8200 OR @@global.read_buffer_size= 8228 ;
@@global.read_buffer_size= 8200 OR @@global.read_buffer_size= 8228
1
@@ -109,7 +109,7 @@ SELECT @@session.read_buffer_size= 8200 OR @@session.read_buffer_size= 8228 ;
1
SET @@session.read_buffer_size = -2;
Warnings:
-Warning 1292 Truncated incorrect read_buffer_size value: '0'
+Warning 1292 Truncated incorrect read_buffer_size value: '-2'
SELECT @@session.read_buffer_size= 8200 OR @@session.read_buffer_size= 8228 ;
@@session.read_buffer_size= 8200 OR @@session.read_buffer_size= 8228
1
diff --git a/mysql-test/suite/sys_vars/r/read_rnd_buffer_size_basic.result b/mysql-test/suite/sys_vars/r/read_rnd_buffer_size_basic.result
index c6440ac032e..817d5a2324a 100644
--- a/mysql-test/suite/sys_vars/r/read_rnd_buffer_size_basic.result
+++ b/mysql-test/suite/sys_vars/r/read_rnd_buffer_size_basic.result
@@ -83,7 +83,7 @@ SELECT @@global.read_rnd_buffer_size= 8200 OR @@global.read_rnd_buffer_size= 822
1
SET @@global.read_rnd_buffer_size = -1024;
Warnings:
-Warning 1292 Truncated incorrect read_rnd_buffer_size value: '0'
+Warning 1292 Truncated incorrect read_rnd_buffer_size value: '-1024'
SELECT @@global.read_rnd_buffer_size= 8200 OR @@global.read_rnd_buffer_size= 8228;
@@global.read_rnd_buffer_size= 8200 OR @@global.read_rnd_buffer_size= 8228
1
@@ -111,7 +111,7 @@ SELECT @@session.read_rnd_buffer_size= 8200 OR @@session.read_rnd_buffer_size= 8
1
SET @@session.read_rnd_buffer_size = -2;
Warnings:
-Warning 1292 Truncated incorrect read_rnd_buffer_size value: '0'
+Warning 1292 Truncated incorrect read_rnd_buffer_size value: '-2'
SELECT @@session.read_rnd_buffer_size= 8200 OR @@session.read_rnd_buffer_size= 8228;
@@session.read_rnd_buffer_size= 8200 OR @@session.read_rnd_buffer_size= 8228
1
diff --git a/mysql-test/suite/sys_vars/r/rpl_recovery_rank_basic_32.result b/mysql-test/suite/sys_vars/r/rpl_recovery_rank_basic_32.result
index d4dd46eba71..2f0c9beea9c 100644
--- a/mysql-test/suite/sys_vars/r/rpl_recovery_rank_basic_32.result
+++ b/mysql-test/suite/sys_vars/r/rpl_recovery_rank_basic_32.result
@@ -23,13 +23,13 @@ SELECT @@global.rpl_recovery_rank;
123456789
SET @@global.rpl_recovery_rank = 2147483648*2;
Warnings:
-Warning 1292 Truncated incorrect rpl-recovery-rank value: '4294967296'
+Warning 1292 Truncated incorrect rpl_recovery_rank value: '4294967296'
SELECT @@global.rpl_recovery_rank;
@@global.rpl_recovery_rank
4294967295
SET @@global.rpl_recovery_rank = 2147483648*1024;
Warnings:
-Warning 1292 Truncated incorrect rpl-recovery-rank value: '2199023255552'
+Warning 1292 Truncated incorrect rpl_recovery_rank value: '2199023255552'
SELECT @@global.rpl_recovery_rank;
@@global.rpl_recovery_rank
4294967295
@@ -38,7 +38,7 @@ SELECT @@global.rpl_recovery_rank;
4294967295
SET @@global.rpl_recovery_rank = 2147483648*2147483648;
Warnings:
-Warning 1292 Truncated incorrect rpl-recovery-rank value: '4611686018427387904'
+Warning 1292 Truncated incorrect rpl_recovery_rank value: '4611686018427387904'
SELECT @@global.rpl_recovery_rank;
@@global.rpl_recovery_rank
4294967295
diff --git a/mysql-test/suite/sys_vars/r/server_id_basic_32.result b/mysql-test/suite/sys_vars/r/server_id_basic_32.result
index 6f801fc627b..b1e74736a10 100644
--- a/mysql-test/suite/sys_vars/r/server_id_basic_32.result
+++ b/mysql-test/suite/sys_vars/r/server_id_basic_32.result
@@ -61,7 +61,7 @@ SELECT @@global.server_id;
0
SET @@global.server_id = 2147483649*2;
Warnings:
-Warning 1292 Truncated incorrect server-id value: '4294967298'
+Warning 1292 Truncated incorrect server_id value: '4294967298'
SELECT @@global.server_id;
@@global.server_id
4294967295
diff --git a/mysql-test/suite/sys_vars/r/server_id_basic_64.result b/mysql-test/suite/sys_vars/r/server_id_basic_64.result
index b6f3095ccfe..12d49248f54 100644
--- a/mysql-test/suite/sys_vars/r/server_id_basic_64.result
+++ b/mysql-test/suite/sys_vars/r/server_id_basic_64.result
@@ -52,17 +52,23 @@ SET @@local.server_id = 4;
ERROR HY000: Variable 'server_id' is a GLOBAL variable and should be set with SET GLOBAL
'#------------------FN_DYNVARS_144_05-----------------------#'
SET @@global.server_id = -1;
+Warnings:
+Warning 1292 Truncated incorrect server_id value: '-1'
SELECT @@global.server_id;
@@global.server_id
0
SET @@global.server_id = -2147483648;
+Warnings:
+Warning 1292 Truncated incorrect server_id value: '-2147483648'
SELECT @@global.server_id;
@@global.server_id
0
SET @@global.server_id = 2147483649*2;
+Warnings:
+Warning 1292 Truncated incorrect server_id value: '4294967298'
SELECT @@global.server_id;
@@global.server_id
-4294967298
+4294967295
SET @@global.server_id = 65530.34.;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.' at line 1
SET @@global.server_id = '125';
diff --git a/mysql-test/suite/sys_vars/r/slave_net_timeout_basic.result b/mysql-test/suite/sys_vars/r/slave_net_timeout_basic.result
index 7903d7f8215..728ce106625 100644
--- a/mysql-test/suite/sys_vars/r/slave_net_timeout_basic.result
+++ b/mysql-test/suite/sys_vars/r/slave_net_timeout_basic.result
@@ -58,13 +58,13 @@ ERROR HY000: Variable 'slave_net_timeout' is a GLOBAL variable and should be set
'#------------------FN_DYNVARS_146_05-----------------------#'
SET @@global.slave_net_timeout = -1;
Warnings:
-Warning 1292 Truncated incorrect slave_net_timeout value: '0'
+Warning 1292 Truncated incorrect slave_net_timeout value: '-1'
SELECT @@global.slave_net_timeout;
@@global.slave_net_timeout
1
SET @@global.slave_net_timeout = -2147483648;
Warnings:
-Warning 1292 Truncated incorrect slave_net_timeout value: '0'
+Warning 1292 Truncated incorrect slave_net_timeout value: '-2147483648'
SELECT @@global.slave_net_timeout;
@@global.slave_net_timeout
1
diff --git a/mysql-test/suite/sys_vars/r/slow_launch_time_basic.result b/mysql-test/suite/sys_vars/r/slow_launch_time_basic.result
index c42942fba1a..da13af4f4e8 100644
--- a/mysql-test/suite/sys_vars/r/slow_launch_time_basic.result
+++ b/mysql-test/suite/sys_vars/r/slow_launch_time_basic.result
@@ -36,6 +36,8 @@ SELECT @@global.slow_launch_time;
65536
'#--------------------FN_DYNVARS_150_04-------------------------#'
SET @@global.slow_launch_time = -1;
+Warnings:
+Warning 1292 Truncated incorrect slow_launch_time value: '-1'
SELECT @@global.slow_launch_time;
@@global.slow_launch_time
0
@@ -57,6 +59,8 @@ SELECT @@global.slow_launch_time;
@@global.slow_launch_time
31536000
SET @@global.slow_launch_time = -1024;
+Warnings:
+Warning 1292 Truncated incorrect slow_launch_time value: '-1024'
SELECT @@global.slow_launch_time;
@@global.slow_launch_time
0
diff --git a/mysql-test/suite/sys_vars/r/table_definition_cache_basic.result b/mysql-test/suite/sys_vars/r/table_definition_cache_basic.result
index 5f0e1960358..612d4138003 100644
--- a/mysql-test/suite/sys_vars/r/table_definition_cache_basic.result
+++ b/mysql-test/suite/sys_vars/r/table_definition_cache_basic.result
@@ -45,7 +45,7 @@ SELECT @@global.table_definition_cache;
256
SET @@global.table_definition_cache = -1024;
Warnings:
-Warning 1292 Truncated incorrect table_definition_cache value: '0'
+Warning 1292 Truncated incorrect table_definition_cache value: '-1024'
SELECT @@global.table_definition_cache;
@@global.table_definition_cache
256
diff --git a/mysql-test/suite/sys_vars/r/table_lock_wait_timeout_basic.result b/mysql-test/suite/sys_vars/r/table_lock_wait_timeout_basic.result
index 13771980188..a500581c228 100644
--- a/mysql-test/suite/sys_vars/r/table_lock_wait_timeout_basic.result
+++ b/mysql-test/suite/sys_vars/r/table_lock_wait_timeout_basic.result
@@ -37,13 +37,13 @@ SELECT @@global.table_lock_wait_timeout ;
'#--------------------FN_DYNVARS_001_04-------------------------#'
SET @@global.table_lock_wait_timeout = -1;
Warnings:
-Warning 1292 Truncated incorrect table_lock_wait_timeout value: '0'
+Warning 1292 Truncated incorrect table_lock_wait_timeout value: '-1'
SET @@global.table_lock_wait_timeout= 100000000000;
Warnings:
Warning 1292 Truncated incorrect table_lock_wait_timeout value: '100000000000'
SET @@global.table_lock_wait_timeout= -1024;
Warnings:
-Warning 1292 Truncated incorrect table_lock_wait_timeout value: '0'
+Warning 1292 Truncated incorrect table_lock_wait_timeout value: '-1024'
SET @@global.table_lock_wait_timeout= 0;
Warnings:
Warning 1292 Truncated incorrect table_lock_wait_timeout value: '0'
diff --git a/mysql-test/suite/sys_vars/r/table_open_cache_basic.result b/mysql-test/suite/sys_vars/r/table_open_cache_basic.result
index ca02d32386f..080bcb6537e 100644
--- a/mysql-test/suite/sys_vars/r/table_open_cache_basic.result
+++ b/mysql-test/suite/sys_vars/r/table_open_cache_basic.result
@@ -39,7 +39,7 @@ SELECT @@global.table_open_cache ;
'#--------------------FN_DYNVARS_001_04-------------------------#'
SET @@global.table_open_cache = -1;
Warnings:
-Warning 1292 Truncated incorrect table_open_cache value: '0'
+Warning 1292 Truncated incorrect table_open_cache value: '-1'
SELECT @@global.table_open_cache ;
@@global.table_open_cache
1
@@ -51,7 +51,7 @@ SELECT @@global.table_open_cache ;
524288
SET @@global.table_open_cache = -1024;
Warnings:
-Warning 1292 Truncated incorrect table_open_cache value: '0'
+Warning 1292 Truncated incorrect table_open_cache value: '-1024'
SELECT @@global.table_open_cache ;
@@global.table_open_cache
1
diff --git a/mysql-test/suite/sys_vars/t/completion_type_func-master.opt b/mysql-test/suite/sys_vars/t/completion_type_func-master.opt
deleted file mode 100644
index 627becdbfb5..00000000000
--- a/mysql-test/suite/sys_vars/t/completion_type_func-master.opt
+++ /dev/null
@@ -1 +0,0 @@
---innodb
diff --git a/mysql-test/suite/sys_vars/t/completion_type_func.test b/mysql-test/suite/sys_vars/t/completion_type_func.test
index ed0f04c37b4..8e363ed2a7d 100644
--- a/mysql-test/suite/sys_vars/t/completion_type_func.test
+++ b/mysql-test/suite/sys_vars/t/completion_type_func.test
@@ -1,4 +1,4 @@
-############## mysql-test\t\completion_type_func.test ##########################
+############## mysql-test/suite/sys_vars/t/completion_type_func.test ###########
# #
# Variable Name: completion_type #
# Scope: GLOBAL & SESSION #
@@ -25,84 +25,154 @@
DROP TABLE IF EXISTS t1;
--enable_warnings
-#########################
-# Creating new table #
-#########################
+##############################
+# Setup: Table + connections #
+##############################
--echo ## Creating new table ##
CREATE TABLE t1
(
-id INT NOT NULL AUTO_INCREMENT,
+id INT NOT NULL,
PRIMARY KEY (id),
name VARCHAR(30)
) ENGINE = INNODB;
---echo '#--------------------FN_DYNVARS_017_01-------------------------#'
-#########################################################
-# Setting initial value of completion_type to zero #
-#########################################################
-
---echo ## Creating new connection ##
+--echo ## Creating new connections test_con1, test_con2 ##
connect (test_con1,localhost,root,,);
-connection test_con1;
+connect (test_con2,localhost,root,,);
+
+connection default;
+
+--echo #########################################################
+--echo # Setting initial value of completion_type to zero #
+--echo #########################################################
-INSERT INTO t1(name) VALUES('Record_1');
-SET @@autocommit = 0;
+INSERT INTO t1 VALUES(1,'Record_1');
SELECT * FROM t1;
--echo ## Setting value of variable to 0 ##
SET @@session.completion_type = 0;
--echo ## Here commit & rollback should work normally ##
+--echo ## test commit ##
+START TRANSACTION;
+INSERT INTO t1 VALUES(2,'Record_2');
+INSERT INTO t1 VALUES(3,'Record_3');
+SELECT * FROM t1;
+
+--echo Switching to connection test_con1
+connection test_con1;
+--echo ## Don't expect to see id's 2 and 3 in the table w/o COMMIT ##
+SELECT * FROM t1;
+
+--echo Switching to default connection
+connection default;
+COMMIT;
+
+--echo ## test rollback ##
START TRANSACTION;
+INSERT INTO t1 VALUES(4,'Record_4');
+INSERT INTO t1 VALUES(5,'Record_5');
SELECT * FROM t1;
-INSERT INTO t1(name) VALUES('Record_2');
-INSERT INTO t1(name) VALUES('Record_3');
+
+--echo Switching to connection test_con1
+connection test_con1;
+--echo ## Don't expect to see id's 4 and 5 here ##
+--echo ## Expect to see 3, Record_3 ##
SELECT * FROM t1;
-DELETE FROM t1 WHERE id = 2;
+
+--echo Switching to connection default;
+connection default;
+
+
+ROLLBACK;
+--echo ## Don't expect to see id's 4 and 5 now ##
SELECT * FROM t1;
+--echo
+--echo #########################################################
+--echo # Setting initial value of completion_type to one #
+--echo #########################################################
+
+--echo Switching to connection test_con1;
+connection test_con1;
+SET @@session.completion_type = 1;
START TRANSACTION;
SELECT * FROM t1;
-INSERT INTO t1(name) VALUES('Record_4');
-INSERT INTO t1(name) VALUES('Record_5');
+INSERT INTO t1 VALUES(6,'Record_6');
+INSERT INTO t1 VALUES(7,'Record_7');
COMMIT;
+--echo ## Expect to immediately have a new transaction ##
+INSERT INTO t1 VALUES(8,'Record_8');
+SELECT * FROM t1;
+
+connection test_con2;
+--echo switching to test_con2
+--echo ## Do not expect to see 8, Record_8 as no COMMIT has occurred ##
+SELECT * FROM t1;
+
+--echo switch to connection test_con1
+connection test_con1;
+
+--echo ## Testing ROLLBACK behavior
+START TRANSACTION;
+INSERT INTO t1 VALUES(9, 'Record_9');
+INSERT INTO t1 VALUES(10, 'Record_10');
+--echo ## Expect to see id's 8, 9, 10 here ##
+--echo ## 8, Record_8 COMMITted with the start of this transaction ##
+SELECT * FROM t1;
+ROLLBACK;
+--echo ## id's 9 and 10 are gone now due to ROLLBACK ##
+SELECT * FROM t1;
+
+--echo ## Expect a new transaction ##
+INSERT INTO t1 VALUES(9, 'Record_9');
---echo '#--------------------FN_DYNVARS_017_02-------------------------#'
-#########################################################
-# Setting initial value of completion_type to 2 #
-#########################################################
+--echo Switching to connection test_con2
+connection test_con2;
+--echo ## Don't expect to see 9, Record_9 due to no COMMIT yet ##
+SELECT * FROM t1;
+
+--echo Switching to connection test_con1
+connection test_con1;
+ROLLBACK;
+--echo ## Don't expect to see 9, Record_9
+SELECT * FROM t1;
+
+--echo #########################################################
+--echo # Setting initial value of completion_type to 2 #
+--echo #########################################################
SET @@session.completion_type = 2;
--echo ## Here commit should work as COMMIT RELEASE ##
START TRANSACTION;
SELECT * FROM t1;
-INSERT INTO t1(name) VALUES('Record_6');
-INSERT INTO t1(name) VALUES('Record_7');
+INSERT INTO t1 VALUES(9,'Record_9');
+INSERT INTO t1 VALUES(10,'Record_10');
COMMIT;
--echo ## Inserting rows should give error here because connection should ##
--echo ## disconnect after using COMMIT ##
---Error 2006,2013,1053
-INSERT INTO t1(name) VALUES('Record_4');
+--Error 2006,2013,ER_SERVER_SHUTDOWN
+INSERT INTO t1 VALUES(4,'Record_4');
---echo ## Creating new connection test_con2 ##
-connect (test_con2,localhost,root,,);
+--echo switch to connection test_con2
connection test_con2;
SET @@session.completion_type = 2;
--echo ## Inserting rows and using Rollback which should Rollback & release ##
START TRANSACTION;
SELECT * FROM t1;
-INSERT INTO t1(name) VALUES('Record_8');
-INSERT INTO t1(name) VALUES('Record_9');
+INSERT INTO t1 VALUES(11,'Record_11');
+INSERT INTO t1 VALUES(12,'Record_12');
ROLLBACK;
---Error 2006,2013,1053
-INSERT INTO t1(name) VALUES('Record_4');
+--echo ## Expect a failure due to COMMIT/ROLLBACK AND RELEASE behavior ##
+--Error 2006,2013,ER_SERVER_SHUTDOWN,
+INSERT INTO t1 VALUES(4,'Record_4');
connection default;
disconnect test_con1;
diff --git a/mysql-test/t/alter_table-big.test b/mysql-test/t/alter_table-big.test
index 5d2c0ba0bb6..1dcc1f1c9bd 100644
--- a/mysql-test/t/alter_table-big.test
+++ b/mysql-test/t/alter_table-big.test
@@ -9,10 +9,9 @@
# in proper order.
--source include/have_binlog_format_mixed_or_statement.inc
-
#
-# Test for bug #25044 "ALTER TABLE ... ENABLE KEYS acquires global
-# 'opening tables' lock".
+# Test for Bug#25044 ALTER TABLE ... ENABLE KEYS acquires global
+# 'opening tables' lock
#
# ALTER TABLE ... ENABLE KEYS should not acquire LOCK_open mutex for
# the whole its duration as it prevents other queries from execution.
@@ -56,6 +55,7 @@ show binlog events in 'master-bin.000001' from 106;
# Clean up
drop tables t1, t2;
+disconnect addconroot;
--echo End of 5.0 tests
@@ -76,6 +76,7 @@ create table t1 (i int);
reset master;
set session debug="+d,sleep_alter_before_main_binlog";
--send alter table t1 change i c char(10) default 'Test1';
+connect (addconroot, localhost, root,,);
connection addconroot;
--sleep 2
insert into t1 values ();
@@ -105,6 +106,7 @@ connection addconroot;
rename table t1 to t3;
connection default;
--reap
+disconnect addconroot;
drop table t3;
set session debug="-d,sleep_alter_before_main_binlog";
@@ -114,3 +116,4 @@ show binlog events in 'master-bin.000001' from 106;
--echo End of 5.1 tests
+
diff --git a/mysql-test/t/archive.test b/mysql-test/t/archive.test
index 7139d95ab49..0d521f95b38 100644
--- a/mysql-test/t/archive.test
+++ b/mysql-test/t/archive.test
@@ -1599,3 +1599,18 @@ INSERT INTO t1 VALUES (NULL, NULL),(NULL, NULL);
FLUSH TABLE t1;
SELECT * FROM t1 ORDER BY a;
DROP TABLE t1;
+
+--echo #
+--echo # BUG#32880 - Repairing Archive table fails with internal error 144
+--echo #
+--echo
+--echo # Test with an existing table which is corrupted
+--echo # Copy t1 from std_data
+let $MYSQLD_DATADIR= `select @@datadir`;
+copy_file std_data/bug32880.frm $MYSQLD_DATADIR/test/t1.frm;
+copy_file std_data/bug32880.ARZ $MYSQLD_DATADIR/test/t1.ARZ;
+copy_file std_data/bug32880.ARN $MYSQLD_DATADIR/test/t1.ARN;
+SHOW CREATE TABLE t1;
+CHECK TABLE t1;
+REPAIR TABLE t1;
+DROP TABLE t1;
diff --git a/mysql-test/t/connect.test b/mysql-test/t/connect.test
index 0893bf9ad18..f609240646a 100644
--- a/mysql-test/t/connect.test
+++ b/mysql-test/t/connect.test
@@ -9,11 +9,14 @@
# of the log tables (which are CSV-based). By connect mysql; show tables;
--source include/have_csv.inc
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
+
+
--disable_warnings
drop table if exists t1,t2;
--enable_warnings
-
#connect (con1,localhost,root,,"");
#show tables;
connect (con1,localhost,root,,mysql);
@@ -22,12 +25,16 @@ connect (con2,localhost,root,,test);
show tables;
--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT
---error 1045
+--error ER_ACCESS_DENIED_ERROR
connect (fail_con,localhost,root,z,test2);
--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT
---error 1045
+--error ER_ACCESS_DENIED_ERROR
connect (fail_con,localhost,root,z,);
+connection default;
+disconnect con1;
+disconnect con2;
+
grant ALL on *.* to test@localhost identified by "gambling";
grant ALL on *.* to test@127.0.0.1 identified by "gambling";
@@ -39,20 +46,23 @@ show tables;
connect (con4,localhost,test,gambling,test);
show tables;
+connection default;
+disconnect con3;
+disconnect con4;
+
--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT
---error 1045
+--error ER_ACCESS_DENIED_ERROR
connect (fail_con,localhost,test,,test2);
--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT
---error 1045
+--error ER_ACCESS_DENIED_ERROR
connect (fail_con,localhost,test,,"");
--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT
---error 1045
+--error ER_ACCESS_DENIED_ERROR
connect (fail_con,localhost,test,zorro,test2);
--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT
---error 1045
+--error ER_ACCESS_DENIED_ERROR
connect (fail_con,localhost,test,zorro,);
-
# check if old password version also works
update mysql.user set password=old_password("gambling2") where user=_binary"test";
flush privileges;
@@ -61,55 +71,57 @@ connect (con10,localhost,test,gambling2,);
connect (con5,localhost,test,gambling2,mysql);
connection con5;
set password="";
---error 1372
+--error ER_PASSWD_LENGTH
set password='gambling3';
set password=old_password('gambling3');
show tables;
connect (con6,localhost,test,gambling3,test);
show tables;
+connection default;
+disconnect con10;
+disconnect con5;
+disconnect con6;
+
--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT
---error 1045
+--error ER_ACCESS_DENIED_ERROR
connect (fail_con,localhost,test,,test2);
--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT
---error 1045
+--error ER_ACCESS_DENIED_ERROR
connect (fail_con,localhost,test,,);
--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT
---error 1045
+--error ER_ACCESS_DENIED_ERROR
connect (fail_con,localhost,test,zorro,test2);
--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT
---error 1045
+--error ER_ACCESS_DENIED_ERROR
connect (fail_con,localhost,test,zorro,);
# remove user 'test' so that other tests which may use 'test'
# do not depend on this test.
-
delete from mysql.user where user=_binary"test";
flush privileges;
#
-# Bug#12517: Clear user variables and replication events before
-# closing temp tables in thread cleanup.
+# Bug#12517 Clear user variables and replication events before
+# closing temp tables in thread cleanup.
connect (con7,localhost,root,,test);
connection con7;
+let $connection_id= `select connection_id()`;
create table t1 (id integer not null auto_increment primary key);
create temporary table t2(id integer not null auto_increment primary key);
set @id := 1;
delete from t1 where id like @id;
-disconnect con7;
---sleep 5
connection default;
+disconnect con7;
+# Wait till the session con7 is disconnected
+let $wait_condition =
+ SELECT COUNT(*) = 0
+ FROM information_schema.processlist
+ WHERE id = '$connection_id';
+--source include/wait_condition.inc
drop table t1;
---disconnect con1
---disconnect con2
---disconnect con3
---disconnect con4
---disconnect con5
---disconnect con6
---disconnect con10
-
--echo # ------------------------------------------------------------------
--echo # -- End of 4.1 tests
--echo # ------------------------------------------------------------------
@@ -147,7 +159,7 @@ let $wait_condition =
--echo # -- Check that we allow exactly three user connections, no matter how
--echo # -- many threads are running.
---echo
+--echo
--echo # -- Connecting (1)...
let $con_name = con_1;
let $con_user_name = mysqltest_u1;
@@ -237,7 +249,7 @@ DROP USER mysqltest_u1@localhost;
###########################################################################
---echo # -- Bug#35074: max_used_connections is not correct.
+--echo # -- Bug#35074: max_used_connections is not correct.
--echo
FLUSH STATUS;
@@ -250,11 +262,7 @@ SHOW STATUS LIKE 'max_used_connections';
SET GLOBAL event_scheduler = ON;
--echo # -- Waiting for Event Scheduler to start...
-let $wait_condition =
- SELECT COUNT(*) = 1
- FROM information_schema.processlist
- WHERE user = 'event_scheduler';
---source include/wait_condition.inc
+--source include/running_event_scheduler.inc
# NOTE: We should use a new connection here instead of reconnect in order to
# avoid races (we can not for sure when the connection being disconnected is
@@ -278,11 +286,7 @@ SHOW STATUS LIKE 'max_used_connections';
SET GLOBAL event_scheduler = OFF;
--echo # -- Waiting for Event Scheduler to stop...
-let $wait_condition =
- SELECT COUNT(*) = 0
- FROM information_schema.processlist
- WHERE user = 'event_scheduler';
---source include/wait_condition.inc
+--source include/no_running_events.inc
--echo
--echo # -- End of Bug#35074.
@@ -291,3 +295,7 @@ let $wait_condition =
--echo # ------------------------------------------------------------------
--echo # -- End of 5.1 tests
--echo # ------------------------------------------------------------------
+
+# Wait till all disconnects are completed
+--source include/wait_until_count_sessions.inc
+
diff --git a/mysql-test/t/consistent_snapshot.test b/mysql-test/t/consistent_snapshot.test
index 8da8e9ce660..82edf2e22b2 100644
--- a/mysql-test/t/consistent_snapshot.test
+++ b/mysql-test/t/consistent_snapshot.test
@@ -1,43 +1,61 @@
--- source include/have_innodb.inc
+--source include/have_innodb.inc
+
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
--disable_warnings
-drop table if exists t1;
+DROP TABLE IF EXISTS t1;
--enable_warnings
+--echo # Establish connection con1 (user=root)
connect (con1,localhost,root,,);
+--echo # Establish connection con2 (user=root)
connect (con2,localhost,root,,);
### Test 1:
### - While a consistent snapshot transaction is executed,
### no external inserts should be visible to the transaction.
+--echo # Switch to connection con1
connection con1;
-create table t1 (a int) engine=innodb;
-start transaction with consistent snapshot;
+CREATE TABLE t1 (a INT) ENGINE=innodb;
+START TRANSACTION WITH CONSISTENT SNAPSHOT;
+--echo # Switch to connection con2
connection con2;
-insert into t1 values(1);
+INSERT INTO t1 VALUES(1);
+--echo # Switch to connection con1
connection con1;
-select * from t1; # if consistent snapshot was set as expected, we
+SELECT * FROM t1; # if consistent snapshot was set as expected, we
# should see nothing.
-commit;
+COMMIT;
### Test 2:
### - For any non-consistent snapshot transaction, external
### committed inserts should be visible to the transaction.
-delete from t1;
-start transaction; # Now we omit WITH CONSISTENT SNAPSHOT
+DELETE FROM t1;
+START TRANSACTION; # Now we omit WITH CONSISTENT SNAPSHOT
+--echo # Switch to connection con2
connection con2;
-insert into t1 values(1);
+INSERT INTO t1 VALUES(1);
+--echo # Switch to connection con1
connection con1;
-select * from t1; # if consistent snapshot was not set, as expected, we
+SELECT * FROM t1; # if consistent snapshot was not set, as expected, we
# should see 1.
-commit;
+COMMIT;
-drop table t1;
+--echo # Switch to connection default + close connections con1 and con2
+connection default;
+disconnect con1;
+disconnect con2;
+DROP TABLE t1;
# End of 4.1 tests
+
+# Wait till all disconnects are completed
+--source include/wait_until_count_sessions.inc
+
diff --git a/mysql-test/t/ddl_i18n_koi8r.test b/mysql-test/t/ddl_i18n_koi8r.test
index e3bed098126..2d94a899aad 100644
--- a/mysql-test/t/ddl_i18n_koi8r.test
+++ b/mysql-test/t/ddl_i18n_koi8r.test
@@ -143,10 +143,12 @@ set names koi8r|
# - Dump mysqltest1;
+--let $views_dump1 = $MYSQLTEST_VARDIR/tmp/ddl_i18n_koi8r.views.mysqltest1.sql
+
--echo
--echo ---> Dumping mysqltest1 to ddl_i18n_koi8r.views.mysqltest1.sql
---exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --databases mysqltest1 > $MYSQLTEST_VARDIR/tmp/ddl_i18n_koi8r.views.mysqltest1.sql
+--exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --databases mysqltest1 > $views_dump1
# - Clean mysqltest1;
@@ -161,7 +163,9 @@ DROP DATABASE mysqltest1|
--echo
--echo ---> Restoring mysqltest1...
---exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/ddl_i18n_koi8r.views.mysqltest1.sql
+--exec $MYSQL test < $views_dump1
+
+--remove_file $views_dump1
#
# Third-round checks.
@@ -398,6 +402,9 @@ set names koi8r|
# - Dump mysqltest1, mysqltest2;
+--let $sp_dump1 = $MYSQLTEST_VARDIR/tmp/ddl_i18n_koi8r.sp.mysqltest1.sql
+--let $sp_dump2 = $MYSQLTEST_VARDIR/tmp/ddl_i18n_koi8r.sp.mysqltest2.sql
+
--echo
--echo ---> Dump of mysqltest1
@@ -406,7 +413,7 @@ set names koi8r|
--echo
--echo ---> Dumping mysqltest1 to ddl_i18n_koi8r.sp.mysqltest1.sql
---exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --routines --databases mysqltest1 > $MYSQLTEST_VARDIR/tmp/ddl_i18n_koi8r.sp.mysqltest1.sql
+--exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --routines --databases mysqltest1 > $sp_dump1
--echo
--echo ---> Dump of mysqltest2
@@ -416,7 +423,7 @@ set names koi8r|
--echo
--echo ---> Dumping mysqltest2 to ddl_i18n_koi8r.sp.mysqltest2.sql
---exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --routines --databases mysqltest2 > $MYSQLTEST_VARDIR/tmp/ddl_i18n_koi8r.sp.mysqltest2.sql
+--exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --routines --databases mysqltest2 > $sp_dump2
# - Clean mysqltest1, mysqltest2;
@@ -432,10 +439,13 @@ DROP DATABASE mysqltest2|
--echo
--echo ---> Restoring mysqltest1...
---exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/ddl_i18n_koi8r.sp.mysqltest1.sql
+--exec $MYSQL test < $sp_dump1
--echo ---> Restoring mysqltest2...
---exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/ddl_i18n_koi8r.sp.mysqltest2.sql
+--exec $MYSQL test < $sp_dump2
+
+--remove_file $sp_dump1
+--remove_file $sp_dump2
#
# Third-round checks.
@@ -669,6 +679,9 @@ use mysqltest1|
# - Dump mysqltest1, mysqltest2;
+--let $triggers_dump1 = $MYSQLTEST_VARDIR/tmp/ddl_i18n_koi8r.triggers.mysqltest1.sql
+--let $triggers_dump2 = $MYSQLTEST_VARDIR/tmp/ddl_i18n_koi8r.triggers.mysqltest2.sql
+
--echo
--echo ---> Dump of mysqltest1
@@ -677,7 +690,7 @@ use mysqltest1|
--echo
--echo ---> Dumping mysqltest1 to ddl_i18n_koi8r.triggers.mysqltest1.sql
---exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --triggers --databases mysqltest1 > $MYSQLTEST_VARDIR/tmp/ddl_i18n_koi8r.triggers.mysqltest1.sql
+--exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --triggers --databases mysqltest1 > $triggers_dump1
--echo
--echo ---> Dump of mysqltest2
@@ -687,7 +700,7 @@ use mysqltest1|
--echo
--echo ---> Dumping mysqltest2 to ddl_i18n_koi8r.triggers.mysqltest2.sql
---exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --triggers --databases mysqltest2 > $MYSQLTEST_VARDIR/tmp/ddl_i18n_koi8r.triggers.mysqltest2.sql
+--exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --triggers --databases mysqltest2 > $triggers_dump2
# - Clean mysqltest1, mysqltest2;
@@ -703,10 +716,13 @@ DROP DATABASE mysqltest2|
--echo
--echo ---> Restoring mysqltest1...
---exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/ddl_i18n_koi8r.triggers.mysqltest1.sql
+--exec $MYSQL test < $triggers_dump1
--echo ---> Restoring mysqltest2...
---exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/ddl_i18n_koi8r.triggers.mysqltest2.sql
+--exec $MYSQL test < $triggers_dump2
+
+--remove_file $triggers_dump1
+--remove_file $triggers_dump2
#
# Third-round checks.
@@ -924,6 +940,9 @@ set names koi8r|
# - Dump mysqltest1, mysqltest2;
+--let $events_dump1 = $MYSQLTEST_VARDIR/tmp/ddl_i18n_koi8r.events.mysqltest1.sql
+--let $events_dump2 = $MYSQLTEST_VARDIR/tmp/ddl_i18n_koi8r.events.mysqltest2.sql
+
--echo
--echo ---> Dump of mysqltest1
@@ -932,7 +951,7 @@ set names koi8r|
--echo
--echo ---> Dumping mysqltest1 to ddl_i18n_koi8r.events.mysqltest1.sql
---exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --events --databases mysqltest1 > $MYSQLTEST_VARDIR/tmp/ddl_i18n_koi8r.events.mysqltest1.sql
+--exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --events --databases mysqltest1 > $events_dump1
--echo
--echo ---> Dump of mysqltest2
@@ -942,7 +961,7 @@ set names koi8r|
--echo
--echo ---> Dumping mysqltest2 to ddl_i18n_koi8r.events.mysqltest2.sql
---exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --events --databases mysqltest2 > $MYSQLTEST_VARDIR/tmp/ddl_i18n_koi8r.events.mysqltest2.sql
+--exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --events --databases mysqltest2 > $events_dump2
# - Clean mysqltest1, mysqltest2;
@@ -958,10 +977,13 @@ DROP DATABASE mysqltest2|
--echo
--echo ---> Restoring mysqltest1...
---exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/ddl_i18n_koi8r.events.mysqltest1.sql
+--exec $MYSQL test < $events_dump1
--echo ---> Restoring mysqltest2...
---exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/ddl_i18n_koi8r.events.mysqltest2.sql
+--exec $MYSQL test < $events_dump2
+
+--remove_file $events_dump1
+--remove_file $events_dump2
#
# Third-round checks.
diff --git a/mysql-test/t/ddl_i18n_utf8.test b/mysql-test/t/ddl_i18n_utf8.test
index d76debcba5b..1d5415d9373 100644
--- a/mysql-test/t/ddl_i18n_utf8.test
+++ b/mysql-test/t/ddl_i18n_utf8.test
@@ -143,10 +143,12 @@ set names utf8|
# - Dump mysqltest1;
+--let $views_dump1 = $MYSQLTEST_VARDIR/tmp/ddl_i18n_utf8views.mysqltest1.sql
+
--echo
--echo ---> Dumping mysqltest1 to ddl_i18n_utf8views.mysqltest1.sql
---exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --databases mysqltest1 > $MYSQLTEST_VARDIR/tmp/ddl_i18n_utf8views.mysqltest1.sql
+--exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --databases mysqltest1 > $views_dump1
# - Clean mysqltest1;
@@ -161,7 +163,9 @@ DROP DATABASE mysqltest1|
--echo
--echo ---> Restoring mysqltest1...
---exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/ddl_i18n_utf8views.mysqltest1.sql
+--exec $MYSQL test < $views_dump1
+
+--remove_file $views_dump1
#
# Third-round checks.
@@ -398,6 +402,9 @@ set names utf8|
# - Dump mysqltest1, mysqltest2;
+--let $sp_dump1 = $MYSQLTEST_VARDIR/tmp/ddl_i18n_utf8sp.mysqltest1.sql
+--let $sp_dump2 = $MYSQLTEST_VARDIR/tmp/ddl_i18n_utf8sp.mysqltest2.sql
+
--echo
--echo ---> Dump of mysqltest1
@@ -406,7 +413,7 @@ set names utf8|
--echo
--echo ---> Dumping mysqltest1 to ddl_i18n_utf8sp.mysqltest1.sql
---exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --routines --databases mysqltest1 > $MYSQLTEST_VARDIR/tmp/ddl_i18n_utf8sp.mysqltest1.sql
+--exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --routines --databases mysqltest1 > $sp_dump1
--echo
--echo ---> Dump of mysqltest2
@@ -416,7 +423,7 @@ set names utf8|
--echo
--echo ---> Dumping mysqltest2 to ddl_i18n_utf8sp.mysqltest2.sql
---exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --routines --databases mysqltest2 > $MYSQLTEST_VARDIR/tmp/ddl_i18n_utf8sp.mysqltest2.sql
+--exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --routines --databases mysqltest2 > $sp_dump2
# - Clean mysqltest1, mysqltest2;
@@ -432,10 +439,13 @@ DROP DATABASE mysqltest2|
--echo
--echo ---> Restoring mysqltest1...
---exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/ddl_i18n_utf8sp.mysqltest1.sql
+--exec $MYSQL test < $sp_dump1
--echo ---> Restoring mysqltest2...
---exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/ddl_i18n_utf8sp.mysqltest2.sql
+--exec $MYSQL test < $sp_dump2
+
+--remove_file $sp_dump1
+--remove_file $sp_dump2
#
# Third-round checks.
@@ -669,6 +679,9 @@ use mysqltest1|
# - Dump mysqltest1, mysqltest2;
+--let $triggers_dump1 = $MYSQLTEST_VARDIR/tmp/ddl_i18n_utf8triggers.mysqltest1.sql
+--let $triggers_dump2 = $MYSQLTEST_VARDIR/tmp/ddl_i18n_utf8triggers.mysqltest2.sql
+
--echo
--echo ---> Dump of mysqltest1
@@ -677,7 +690,7 @@ use mysqltest1|
--echo
--echo ---> Dumping mysqltest1 to ddl_i18n_utf8triggers.mysqltest1.sql
---exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --triggers --databases mysqltest1 > $MYSQLTEST_VARDIR/tmp/ddl_i18n_utf8triggers.mysqltest1.sql
+--exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --triggers --databases mysqltest1 > $triggers_dump1
--echo
--echo ---> Dump of mysqltest2
@@ -687,7 +700,7 @@ use mysqltest1|
--echo
--echo ---> Dumping mysqltest2 to ddl_i18n_utf8triggers.mysqltest2.sql
---exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --triggers --databases mysqltest2 > $MYSQLTEST_VARDIR/tmp/ddl_i18n_utf8triggers.mysqltest2.sql
+--exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --triggers --databases mysqltest2 > $triggers_dump2
# - Clean mysqltest1, mysqltest2;
@@ -703,10 +716,13 @@ DROP DATABASE mysqltest2|
--echo
--echo ---> Restoring mysqltest1...
---exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/ddl_i18n_utf8triggers.mysqltest1.sql
+--exec $MYSQL test < $triggers_dump1
--echo ---> Restoring mysqltest2...
---exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/ddl_i18n_utf8triggers.mysqltest2.sql
+--exec $MYSQL test < $triggers_dump2
+
+--remove_file $triggers_dump1
+--remove_file $triggers_dump2
#
# Third-round checks.
@@ -924,6 +940,9 @@ set names utf8|
# - Dump mysqltest1, mysqltest2;
+--let $events_dump1 = $MYSQLTEST_VARDIR/tmp/ddl_i18n_utf8events.mysqltest1.sql
+--let $events_dump2 = $MYSQLTEST_VARDIR/tmp/ddl_i18n_utf8events.mysqltest2.sql
+
--echo
--echo ---> Dump of mysqltest1
@@ -932,7 +951,7 @@ set names utf8|
--echo
--echo ---> Dumping mysqltest1 to ddl_i18n_utf8events.mysqltest1.sql
---exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --events --databases mysqltest1 > $MYSQLTEST_VARDIR/tmp/ddl_i18n_utf8events.mysqltest1.sql
+--exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --events --databases mysqltest1 > $events_dump1
--echo
--echo ---> Dump of mysqltest2
@@ -942,7 +961,7 @@ set names utf8|
--echo
--echo ---> Dumping mysqltest2 to ddl_i18n_utf8events.mysqltest2.sql
---exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --events --databases mysqltest2 > $MYSQLTEST_VARDIR/tmp/ddl_i18n_utf8events.mysqltest2.sql
+--exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --compact --events --databases mysqltest2 > $events_dump2
# - Clean mysqltest1, mysqltest2;
@@ -958,10 +977,13 @@ DROP DATABASE mysqltest2|
--echo
--echo ---> Restoring mysqltest1...
---exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/ddl_i18n_utf8events.mysqltest1.sql
+--exec $MYSQL test < $events_dump1
--echo ---> Restoring mysqltest2...
---exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/ddl_i18n_utf8events.mysqltest2.sql
+--exec $MYSQL test < $events_dump2
+
+--remove_file $events_dump1
+--remove_file $events_dump2
#
# Third-round checks.
diff --git a/mysql-test/t/dirty_close.test b/mysql-test/t/dirty_close.test
index f1c2c88ae83..1bbd53e8c06 100644
--- a/mysql-test/t/dirty_close.test
+++ b/mysql-test/t/dirty_close.test
@@ -1,3 +1,7 @@
+
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
+
connect (con1,localhost,root,,);
connect (con2,localhost,root,,);
connection con1;
@@ -5,12 +9,19 @@ dirty_close con1;
connection con2;
--disable_warnings
-drop table if exists t1;
+DROP TABLE IF EXISTS t1;
--enable_warnings
-create table t1 (n int);
-insert into t1 values (1),(2),(3);
-select * from t1;
-drop table t1;
+CREATE TABLE t1 (n INT);
+INSERT INTO t1 VALUES (1),(2),(3);
+SELECT * FROM t1;
+DROP TABLE t1;
+
+connection default;
+disconnect con2;
# End of 4.1 tests
+
+# Wait till all disconnects are completed
+--source include/wait_until_count_sessions.inc
+
diff --git a/mysql-test/t/disabled.def b/mysql-test/t/disabled.def
index 3f61176e37b..eab0542314a 100644
--- a/mysql-test/t/disabled.def
+++ b/mysql-test/t/disabled.def
@@ -11,3 +11,5 @@
##############################################################################
kill : Bug#37780 2008-12-03 HHunger need some changes to be robust enough for pushbuild.
innodb_bug39438 : BUG#42383 2009-01-28 lsoares "This fails in embedded and on windows. Note that this test is not run on windows and on embedded in PB for main trees currently"
+#concurrent_innodb_safelog: disabled for embedded server due to bug#43733 Select on processlist let the embedded server crash (concurrent_innodb_safelog).
+#concurrent_innodb_unsafelog: disabled for embedded server due to bug#43733.
diff --git a/mysql-test/t/drop.test b/mysql-test/t/drop.test
index 4f0777922b8..91345886e93 100644
--- a/mysql-test/t/drop.test
+++ b/mysql-test/t/drop.test
@@ -150,17 +150,30 @@ DROP DATABASE IF EXISTS mysql_test;
CREATE DATABASE mysql_test;
let $MYSQLD_DATADIR= `select @@datadir`;
---copy_file $MYSQLD_DATADIR/mysql/proc.frm $MYSQLTEST_VARDIR/tmp/bug29958.proc.frm
---copy_file $MYSQLD_DATADIR/mysql/proc.MYD $MYSQLTEST_VARDIR/tmp/bug29958.proc.MYD
---copy_file $MYSQLD_DATADIR/mysql/proc.MYI $MYSQLTEST_VARDIR/tmp/bug29958.proc.MYI
+
+--let $proc_frm = $MYSQLD_DATADIR/mysql/proc.frm
+--let $proc_MYD = $MYSQLD_DATADIR/mysql/proc.MYD
+--let $proc_MYI = $MYSQLD_DATADIR/mysql/proc.MYI
+
+--let $copy_of_proc_frm = $MYSQLTEST_VARDIR/tmp/bug29958.copy.frm
+--let $copy_of_proc_MYD = $MYSQLTEST_VARDIR/tmp/bug29958.copy.MYD
+--let $copy_of_proc_MYI = $MYSQLTEST_VARDIR/tmp/bug29958.copy.MYI
+
+--copy_file $proc_frm $copy_of_proc_frm
+--copy_file $proc_MYD $copy_of_proc_MYD
+--copy_file $proc_MYI $copy_of_proc_MYI
DROP TABLE mysql.proc;
DROP DATABASE mysql_test;
---copy_file $MYSQLTEST_VARDIR/tmp/bug29958.proc.frm $MYSQLD_DATADIR/mysql/proc.frm
---copy_file $MYSQLTEST_VARDIR/tmp/bug29958.proc.MYD $MYSQLD_DATADIR/mysql/proc.MYD
---copy_file $MYSQLTEST_VARDIR/tmp/bug29958.proc.MYI $MYSQLD_DATADIR/mysql/proc.MYI
+--copy_file $copy_of_proc_frm $proc_frm
+--copy_file $copy_of_proc_MYD $proc_MYD
+--copy_file $copy_of_proc_MYI $proc_MYI
+
+--remove_file $copy_of_proc_frm
+--remove_file $copy_of_proc_MYD
+--remove_file $copy_of_proc_MYI
--echo
--echo # --
diff --git a/mysql-test/t/events_bugs.test b/mysql-test/t/events_bugs.test
index 69e2f681aa2..81397b333f9 100644
--- a/mysql-test/t/events_bugs.test
+++ b/mysql-test/t/events_bugs.test
@@ -1209,6 +1209,18 @@ select replace(@full_mode, 'ALLOW_INVALID_DATES', 'INVALID_DATES') into @full_mo
select name from mysql.event where name = 'p' and sql_mode = @full_mode;
drop event e1;
+#
+# Bug#36540: CREATE EVENT and ALTER EVENT statements fail with large server_id
+#
+
+SET @old_server_id = @@GLOBAL.server_id;
+SET GLOBAL server_id = (1 << 32) - 1;
+SELECT @@GLOBAL.server_id;
+CREATE EVENT ev1 ON SCHEDULE EVERY 1 DAY DO SELECT 1;
+SELECT event_name, originator FROM INFORMATION_SCHEMA.EVENTS;
+DROP EVENT ev1;
+SET GLOBAL server_id = @old_server_id;
+
###########################################################################
#
# End of tests
diff --git a/mysql-test/t/explain.test b/mysql-test/t/explain.test
index 3a71fde4421..755e126baf2 100644
--- a/mysql-test/t/explain.test
+++ b/mysql-test/t/explain.test
@@ -123,6 +123,21 @@ execute s1;
DROP TABLE t1,t2;
+
+#
+# Bug #43354: Use key hint can crash server in explain extended query
+#
+
+CREATE TABLE t1 (a INT PRIMARY KEY);
+
+--error ER_KEY_DOES_NOT_EXITS
+EXPLAIN EXTENDED SELECT COUNT(a) FROM t1 USE KEY(a);
+
+DROP TABLE t1;
+
+
+# End of 5.0 tests.
+
--echo #
--echo # Bug#37870: Usage of uninitialized value caused failed assertion.
--echo #
@@ -141,4 +156,4 @@ flush tables;
SELECT OUTR.dt FROM t1 AS OUTR WHERE OUTR.dt IN ( SELECT INNR.dt FROM t2 AS INNR WHERE OUTR.t < '2005-11-13 7:41:31' );
drop tables t1, t2;
-# End of 5.0 tests.
+--echo End of 5.1 tests.
diff --git a/mysql-test/t/flush_block_commit.test b/mysql-test/t/flush_block_commit.test
index 0c1d2b82df6..74892def63f 100644
--- a/mysql-test/t/flush_block_commit.test
+++ b/mysql-test/t/flush_block_commit.test
@@ -4,74 +4,106 @@
# This is intended to mimick how mysqldump and innobackup work.
# And it requires InnoDB
--- source include/have_innodb.inc
+--source include/have_innodb.inc
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
+
+--echo # Establish connection con1 (user=root)
connect (con1,localhost,root,,);
+--echo # Establish connection con2 (user=root)
connect (con2,localhost,root,,);
+--echo # Establish connection con3 (user=root)
connect (con3,localhost,root,,);
+--echo # Switch to connection con1
connection con1;
--disable_warnings
-drop table if exists t1;
+DROP TABLE IF EXISTS t1;
--enable_warnings
-create table t1 (a int) engine=innodb;
+CREATE TABLE t1 (a INT) ENGINE=innodb;
# blocks COMMIT ?
-begin;
-insert into t1 values(1);
+BEGIN;
+INSERT INTO t1 VALUES(1);
+--echo # Switch to connection con2
connection con2;
-flush tables with read lock;
-select * from t1;
+FLUSH TABLES WITH READ LOCK;
+SELECT * FROM t1;
+--echo # Switch to connection con1
connection con1;
-send commit; # blocked by con2
+send COMMIT; # blocked by con2
sleep 1;
+--echo # Switch to connection con2
connection con2;
-select * from t1; # verify con1 was blocked and data did not move
-unlock tables;
+SELECT * FROM t1; # verify con1 was blocked and data did not move
+UNLOCK TABLES;
+--echo # Switch to connection con1
connection con1;
reap;
# No deadlock ?
+--echo # Switch to connection con1
connection con1;
-begin;
-select * from t1 for update;
+BEGIN;
+SELECT * FROM t1 FOR UPDATE;
+--echo # Switch to connection con2
connection con2;
-begin;
-send select * from t1 for update; # blocked by con1
+BEGIN;
+send SELECT * FROM t1 FOR UPDATE; # blocked by con1
sleep 1;
+--echo # Switch to connection con3
connection con3;
-send flush tables with read lock; # blocked by con2
+send FLUSH TABLES WITH READ LOCK; # blocked by con2
+--echo # Switch to connection con1
connection con1;
-commit; # should not be blocked by con3
+COMMIT; # should not be blocked by con3
+--echo # Switch to connection con2
connection con2;
reap;
+--echo # Switch to connection con3
connection con3;
reap;
-unlock tables;
+UNLOCK TABLES;
-# BUG#6732 FLUSH TABLES WITH READ LOCK + COMMIT hangs later FLUSH TABLES
-# WITH READ LOCK
+# Bug#6732 FLUSH TABLES WITH READ LOCK + COMMIT hangs later FLUSH TABLES
+# WITH READ LOCK
+--echo # Switch to connection con2
connection con2;
-commit; # unlock InnoDB row locks to allow insertions
+COMMIT; # unlock InnoDB row locks to allow insertions
+--echo # Switch to connection con1
connection con1;
-begin;
-insert into t1 values(10);
-flush tables with read lock;
-commit;
-unlock tables;
+BEGIN;
+INSERT INTO t1 VALUES(10);
+FLUSH TABLES WITH READ LOCK;
+COMMIT;
+UNLOCK TABLES;
+--echo # Switch to connection con2
connection con2;
-flush tables with read lock; # bug caused hang here
-unlock tables;
+FLUSH TABLES WITH READ LOCK; # bug caused hang here
+UNLOCK TABLES;
+
+# Bug#7358 SHOW CREATE DATABASE fails if open transaction
+
+BEGIN;
+SELECT * FROM t1;
+SHOW CREATE DATABASE test;
-# BUG#7358 SHOW CREATE DATABASE fails if open transaction
+DROP TABLE t1;
-begin;
-select * from t1;
-show create database test;
-drop table t1;
+# Cleanup
+--echo # Switch to connection default and close connections con1, con2, con3
+connection default;
+disconnect con1;
+disconnect con2;
+disconnect con3;
# End of 4.1 tests
+
+# Wait till all disconnects are completed
+--source include/wait_until_count_sessions.inc
+
diff --git a/mysql-test/t/flush_block_commit_notembedded.test b/mysql-test/t/flush_block_commit_notembedded.test
index 4a0300acf78..aea38250218 100644
--- a/mysql-test/t/flush_block_commit_notembedded.test
+++ b/mysql-test/t/flush_block_commit_notembedded.test
@@ -3,32 +3,51 @@
# We verify that we did not introduce a deadlock.
# This is intended to mimick how mysqldump and innobackup work.
--- source include/have_log_bin.inc
+--source include/have_log_bin.inc
# And it requires InnoDB
--- source include/have_log_bin.inc
--- source include/have_innodb.inc
+--source include/have_log_bin.inc
+--source include/have_innodb.inc
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
+
+
+--echo # Establish connection con1 (user=root)
connect (con1,localhost,root,,);
+--echo # Establish connection con2 (user=root)
connect (con2,localhost,root,,);
# FLUSH TABLES WITH READ LOCK should block writes to binlog too
+--echo # Switch to connection con1
connection con1;
-create table t1 (a int) engine=innodb;
-reset master;
-set autocommit=0;
-insert t1 values (1);
+CREATE TABLE t1 (a INT) ENGINE=innodb;
+RESET MASTER;
+SET AUTOCOMMIT=0;
+INSERT t1 VALUES (1);
+--echo # Switch to connection con2
connection con2;
-flush tables with read lock;
-show master status;
+FLUSH TABLES WITH READ LOCK;
+SHOW MASTER STATUS;
+--echo # Switch to connection con1
connection con1;
-send commit;
+send COMMIT;
+--echo # Switch to connection con2
connection con2;
sleep 1;
-show master status;
-unlock tables;
+SHOW MASTER STATUS;
+UNLOCK TABLES;
+--echo # Switch to connection con1
connection con1;
reap;
-drop table t1;
-set autocommit=1;
+DROP TABLE t1;
+SET AUTOCOMMIT=1;
+
+--echo # Switch to connection default and close connections con1 and con2
+connection default;
+disconnect con1;
+disconnect con2;
+
+# Wait till all disconnects are completed
+--source include/wait_until_count_sessions.inc
diff --git a/mysql-test/t/flush_read_lock_kill.test b/mysql-test/t/flush_read_lock_kill.test
index c03f3be2534..aeb09d52460 100644
--- a/mysql-test/t/flush_read_lock_kill.test
+++ b/mysql-test/t/flush_read_lock_kill.test
@@ -8,24 +8,27 @@
# won't test anything interesting).
# This also won't work with the embedded server test
--- source include/not_embedded.inc
+--source include/not_embedded.inc
--- source include/have_debug.inc
+--source include/have_debug.inc
+
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
# Disable concurrent inserts to avoid test failures when reading the
# connection id which was inserted into a table by another thread.
-set @old_concurrent_insert= @@global.concurrent_insert;
-set @@global.concurrent_insert= 0;
+SET @old_concurrent_insert= @@global.concurrent_insert;
+SET @@global.concurrent_insert= 0;
connect (con1,localhost,root,,);
connect (con2,localhost,root,,);
connection con1;
--disable_warnings
-drop table if exists t1;
+DROP TABLE IF EXISTS t1;
--enable_warnings
-create table t1 (kill_id int);
-insert into t1 values(connection_id());
+CREATE TABLE t1 (kill_id INT);
+INSERT INTO t1 VALUES(connection_id());
# Thanks to the parameter we passed to --debug, this FLUSH will
# block on a debug build running with our --debug=make_global... It
@@ -33,11 +36,11 @@ insert into t1 values(connection_id());
# --debug) it will succeed immediately
connection con1;
-send flush tables with read lock;
+send FLUSH TABLES WITH READ LOCK;
# kill con1
connection con2;
-select ((@id := kill_id) - kill_id) from t1;
+SELECT ((@id := kill_id) - kill_id) FROM t1;
# Wait for the debug sync point, test won't run on non-debug
# builds anyway.
@@ -47,7 +50,7 @@ let $wait_condition=
and info = "flush tables with read lock";
--source include/wait_condition.inc
-kill connection @id;
+KILL CONNECTION @id;
connection con1;
# On debug builds it will be error 1053 (killed); on non-debug, or
@@ -58,8 +61,14 @@ connection con1;
reap;
connection con2;
-drop table t1;
+DROP TABLE t1;
+
connection default;
+disconnect con2;
# Restore global concurrent_insert value
-set @@global.concurrent_insert= @old_concurrent_insert;
+SET @@global.concurrent_insert= @old_concurrent_insert;
+
+# Wait till all disconnects are completed
+--source include/wait_until_count_sessions.inc
+
diff --git a/mysql-test/t/func_group.test b/mysql-test/t/func_group.test
index be4e9c32686..b0a3d0feb79 100644
--- a/mysql-test/t/func_group.test
+++ b/mysql-test/t/func_group.test
@@ -18,6 +18,8 @@ insert into t1 values (3,5,"C");
insert into t1 values (3,6,"D");
# Test of MySQL field extension with and without matching records.
+#### Note: The two following statements may fail if the execution plan
+#### or optimizer is changed. The result for column c is undefined.
select a,c,sum(a) from t1 group by a;
select a,c,sum(a) from t1 where a > 10 group by a;
select sum(a) from t1 where a > 10;
diff --git a/mysql-test/t/func_math.test b/mysql-test/t/func_math.test
index 87b172a6436..e67f5f29e3a 100644
--- a/mysql-test/t/func_math.test
+++ b/mysql-test/t/func_math.test
@@ -248,6 +248,27 @@ INSERT INTO t1 VALUES ('a');
SELECT a DIV 2 FROM t1 UNION SELECT a DIV 2 FROM t1;
DROP TABLE t1;
+#
+# Bug #15936: "round" differs on Windows to Unix
+#
+
+CREATE TABLE t1 (a DOUBLE);
+
+INSERT INTO t1 VALUES (-1.1), (1.1),
+ (-1.5), (1.5),
+ (-1.9), (1.9),
+ (-2.1), (2.1),
+ (-2.5), (2.5),
+ (-2.9), (2.9),
+# Check numbers with absolute values > 2^53 - 1
+# (see comments for MAX_EXACT_INTEGER)
+ (-1e16 - 0.5), (1e16 + 0.5),
+ (-1e16 - 1.5), (1e16 + 1.5);
+
+SELECT a, ROUND(a) FROM t1;
+
+DROP TABLE t1;
+
--echo End of 5.0 tests
#
diff --git a/mysql-test/t/group_by.test b/mysql-test/t/group_by.test
index e3cf3ca856d..5b96213034a 100644
--- a/mysql-test/t/group_by.test
+++ b/mysql-test/t/group_by.test
@@ -1139,4 +1139,22 @@ DROP TABLE t1;
SET @@sql_mode = @old_sql_mode;
+#
+# Bug#42567 Invalid GROUP BY error
+#
+
+# Setup of the subtest
+SET @old_sql_mode = @@sql_mode;
+SET @@sql_mode='ONLY_FULL_GROUP_BY';
+
+CREATE TABLE t1(i INT);
+INSERT INTO t1 VALUES (1), (10);
+
+# The actual test
+SELECT COUNT(i) FROM t1;
+SELECT COUNT(i) FROM t1 WHERE i > 1;
+
+# Cleanup of subtest
+DROP TABLE t1;
+SET @@sql_mode = @old_sql_mode;
diff --git a/mysql-test/t/group_min_max.test b/mysql-test/t/group_min_max.test
index a7f4325b2d1..adfa77c881c 100644
--- a/mysql-test/t/group_min_max.test
+++ b/mysql-test/t/group_min_max.test
@@ -961,3 +961,25 @@ insert into t1 (a,b) select a, max(b)+1 from t1 where a = 0 group by a;
select * from t1;
explain extended select sql_buffer_result a, max(b)+1 from t1 where a = 0 group by a;
drop table t1;
+
+
+#
+# Bug #41610: key_infix_len can be overwritten causing some group by queries
+# to return no rows
+#
+
+CREATE TABLE t1 (a int, b int, c int, d int,
+ KEY foo (c,d,a,b), KEY bar (c,a,b,d));
+
+INSERT INTO t1 VALUES (1, 1, 1, 1), (1, 1, 1, 2), (1, 1, 1, 3), (1, 1, 1, 4);
+INSERT INTO t1 SELECT * FROM t1;
+INSERT INTO t1 SELECT * FROM t1;
+INSERT INTO t1 SELECT a,b,c+1,d FROM t1;
+
+#Should be non-empty
+EXPLAIN SELECT DISTINCT c FROM t1 WHERE d=4;
+SELECT DISTINCT c FROM t1 WHERE d=4;
+
+DROP TABLE t1;
+
+--echo End of 5.0 tests
diff --git a/mysql-test/t/information_schema.test b/mysql-test/t/information_schema.test
index ef6e3eaca12..392d1062492 100644
--- a/mysql-test/t/information_schema.test
+++ b/mysql-test/t/information_schema.test
@@ -1410,6 +1410,15 @@ CREATE TABLE t1(a INT) KEY_BLOCK_SIZE=1;
SELECT CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='t1';
DROP TABLE t1;
+#
+# Bug #22047: Time in SHOW PROCESSLIST for SQL thread in replication seems
+# to become negative
+#
+
+SET TIMESTAMP=@@TIMESTAMP + 10000000;
+SELECT 'OK' AS TEST_RESULT FROM INFORMATION_SCHEMA.PROCESSLIST WHERE time < 0;
+SET TIMESTAMP=DEFAULT;
+
--echo End of 5.1 tests.
# Wait till all disconnects are completed
diff --git a/mysql-test/t/init_connect.test b/mysql-test/t/init_connect.test
index 0a08559279c..b6bac5f65fa 100644
--- a/mysql-test/t/init_connect.test
+++ b/mysql-test/t/init_connect.test
@@ -5,6 +5,9 @@
# should work with embedded server after mysqltest is fixed
--source include/not_embedded.inc
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
+
--source include/add_anonymous_users.inc
connect (con0,localhost,root,,);
@@ -233,7 +236,8 @@ connect (con1,localhost,mysqltest1,,);
connection con1;
select * from t1;
-connection con0;
+connection default;
+disconnect con0;
disconnect con1;
drop trigger trg1;
@@ -244,3 +248,7 @@ set global init_connect="set @a='a\\0c'";
revoke all privileges, grant option from mysqltest1@localhost;
drop user mysqltest1@localhost;
drop table t1, t2;
+
+# Wait till all disconnects are completed
+--source include/wait_until_count_sessions.inc
+
diff --git a/mysql-test/t/innodb-autoinc.test b/mysql-test/t/innodb-autoinc.test
index e6b804c4fff..d76b29a7dc8 100644
--- a/mysql-test/t/innodb-autoinc.test
+++ b/mysql-test/t/innodb-autoinc.test
@@ -390,3 +390,91 @@ INSERT INTO t1 VALUES (NULL);
#endif
SELECT * FROM t1;
DROP TABLE t1;
+
+#
+# Check for floating point autoinc column handling
+#
+SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1;
+SET @@INSERT_ID=1;
+SHOW VARIABLES LIKE "%auto_inc%";
+CREATE TABLE t1 (c1 DOUBLE NOT NULL AUTO_INCREMENT, c2 INT, PRIMARY KEY (c1)) ENGINE=InnoDB;
+INSERT INTO t1 VALUES(NULL, 1);
+INSERT INTO t1 VALUES(NULL, 2);
+SELECT * FROM t1;
+ALTER TABLE t1 CHANGE c1 c1 SERIAL;
+SELECT * FROM t1;
+INSERT INTO t1 VALUES(NULL, 3);
+INSERT INTO t1 VALUES(NULL, 4);
+SELECT * FROM t1;
+DROP TABLE IF EXISTS t1;
+CREATE TABLE t1 (c1 FLOAT NOT NULL AUTO_INCREMENT, c2 INT, PRIMARY KEY (c1)) ENGINE=InnoDB;
+INSERT INTO t1 VALUES(NULL, 1);
+INSERT INTO t1 VALUES(NULL, 2);
+SELECT * FROM t1;
+ALTER TABLE t1 CHANGE c1 c1 SERIAL;
+SELECT * FROM t1;
+INSERT INTO t1 VALUES(NULL, 3);
+INSERT INTO t1 VALUES(NULL, 4);
+SELECT * FROM t1;
+DROP TABLE t1;
+
+#
+# Bug# 42714: AUTOINC column calculated next value not greater than highest
+# value stored in table.
+#
+SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=5;
+DROP TABLE IF EXISTS t1;
+DROP TABLE IF EXISTS t2;
+CREATE TABLE t1 (
+ a INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+ b INT(10) UNSIGNED NOT NULL,
+ c ENUM('FALSE','TRUE') DEFAULT NULL,
+ PRIMARY KEY (a)) ENGINE = InnoDB;
+CREATE TABLE t2 (
+ m INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+ n INT(10) UNSIGNED NOT NULL,
+ o enum('FALSE','TRUE') DEFAULT NULL,
+ PRIMARY KEY (m)) ENGINE = InnoDB;
+INSERT INTO t2 (n,o) VALUES
+ (1 , 'true'), (1 , 'false'), (2 , 'true'), (2 , 'false'), (3 , 'true'),
+ (3 , 'false'), (4 , 'true'), (4 , 'false'), (5 , 'true'), (5 , 'false');
+SHOW CREATE TABLE t2;
+INSERT INTO t1 (b,c) SELECT n,o FROM t2 ;
+SHOW CREATE TABLE t1;
+INSERT INTO t1 (b,c) SELECT n,o FROM t2 ;
+SELECT * FROM t1;
+SHOW CREATE TABLE t1;
+INSERT INTO t1 (b,c) SELECT n,o FROM t2 WHERE o = 'false';
+SELECT * FROM t1;
+SHOW CREATE TABLE t1;
+INSERT INTO t1 (b,c) SELECT n,o FROM t2 WHERE o = 'false';
+SELECT * FROM t1;
+SHOW CREATE TABLE t1;
+INSERT INTO t1 (b,c) SELECT n,o FROM t2 WHERE o = 'false';
+SHOW CREATE TABLE t1;
+INSERT INTO t1 (b,c) SELECT n,o FROM t2 WHERE o = 'false';
+SHOW CREATE TABLE t1;
+INSERT INTO t1 (b,c) SELECT n,o FROM t2 WHERE o = 'false';
+SELECT * FROM t1;
+SHOW CREATE TABLE t1;
+DROP TABLE t1;
+DROP TABLE t2;
+#
+# 43203: Overflow from auto incrementing causes server segv
+#
+
+DROP TABLE IF EXISTS t1;
+DROP TABLE IF EXISTS t2;
+CREATE TABLE t1(
+ c1 INT(10) UNSIGNED NOT NULL AUTO_INCREMENT
+ PRIMARY KEY) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL);
+CREATE TABLE t2(
+ c1 TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT
+ PRIMARY KEY) ENGINE=InnoDB;
+-- error ER_DUP_ENTRY,1062
+INSERT INTO t2 SELECT c1 FROM t1;
+-- error ER_DUP_ENTRY,1467
+INSERT INTO t2 SELECT NULL FROM t1;
+DROP TABLE t1;
+DROP TABLE t2;
diff --git a/mysql-test/t/innodb_bug42419.test b/mysql-test/t/innodb_bug42419.test
new file mode 100644
index 00000000000..93c4764252a
--- /dev/null
+++ b/mysql-test/t/innodb_bug42419.test
@@ -0,0 +1,78 @@
+#
+# Testcase for InnoDB
+# Bug#42419 Server crash with "Pure virtual method called" on two concurrent connections
+#
+
+--source include/not_embedded.inc
+--source include/have_innodb.inc
+
+let $innodb_lock_wait_timeout= query_get_value(SHOW VARIABLES LIKE 'innodb_lock_wait_timeout%', Value, 1);
+if (`SELECT $innodb_lock_wait_timeout < 10`)
+{
+ --echo # innodb_lock_wait_timeout must be >= 10 seconds
+ --echo # so that this test can work all time fine on an overloaded testing box
+ SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';
+ exit;
+}
+
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
+
+# First session
+connection default;
+
+
+--enable_warnings
+CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b INT) ENGINE = InnoDB;
+
+INSERT INTO t1 VALUES (1,1),(2,2),(3,3);
+COMMIT;
+SET AUTOCOMMIT = 0;
+
+CREATE TEMPORARY TABLE t1_tmp ( b INT );
+
+INSERT INTO t1_tmp (b) SELECT b FROM t1 WHERE a = 3;
+INSERT INTO t1_tmp (b) SELECT b FROM t1 WHERE a = 2;
+
+# Second session
+connect (user2,localhost,root,,,$MASTER_MYPORT,$MASTER_MYSOCK);
+
+SET AUTOCOMMIT = 0;
+
+CREATE TEMPORARY TABLE t2_tmp ( a int, new_a int );
+INSERT INTO t2_tmp VALUES (1,51),(2,52),(3,53);
+
+UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 1;
+send
+UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 2;
+
+# The last update will wait for a lock held by the first session
+
+# First session
+connection default;
+
+# Poll till the UPDATE of the second session waits for lock
+let $show_statement= SHOW PROCESSLIST;
+let $field= State;
+let $condition= = 'Updating';
+--source include/wait_show_condition.inc
+
+# If the testing box is overloadeded and innodb_lock_wait_timeout is too small
+# we might get here ER_LOCK_WAIT_TIMEOUT.
+--error ER_LOCK_DEADLOCK
+INSERT INTO t1_tmp (b) SELECT b FROM t1 WHERE a = 1;
+
+# Second session
+connection user2;
+--echo Reap the server message for connection user2 UPDATE t1 ...
+reap;
+
+# The server crashed when executing this UPDATE or the succeeding SQL command.
+UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 3;
+
+connection default;
+disconnect user2;
+DROP TABLE t1;
+
+# Wait till all disconnects are completed
+--source include/wait_until_count_sessions.inc
diff --git a/mysql-test/t/innodb_mysql-master.opt b/mysql-test/t/innodb_mysql-master.opt
index c8613e0ccd5..205c733455d 100644
--- a/mysql-test/t/innodb_mysql-master.opt
+++ b/mysql-test/t/innodb_mysql-master.opt
@@ -1 +1 @@
---innodb-lock-wait-timeout=3
+--innodb-lock-wait-timeout=2
diff --git a/mysql-test/t/innodb_mysql.test b/mysql-test/t/innodb_mysql.test
index 77140fd85d7..4a6249eeccd 100644
--- a/mysql-test/t/innodb_mysql.test
+++ b/mysql-test/t/innodb_mysql.test
@@ -55,57 +55,6 @@ SELECT * FROM t1 WHERE a = 'abcde';
DROP TABLE t1;
#
-# Bug #42419: Server crash with "Pure virtual method called" on two
-# concurrent connections
-#
-
-connect (c1, localhost, root,,);
-connect (c2, localhost, root,,);
-
-CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT)
- ENGINE=InnoDB;
-
-INSERT INTO t1 VALUES (1,1),(2,2),(3,3);
-
-connection c1;
-
-SET AUTOCOMMIT = 0;
-
-CREATE TEMPORARY TABLE t1_tmp (b INT);
-
-INSERT INTO t1_tmp SELECT b FROM t1 WHERE a = 3;
-INSERT INTO t1_tmp SELECT b FROM t1 WHERE a = 2;
-
-connection c2;
-
-SET AUTOCOMMIT = 0;
-
-CREATE TEMPORARY TABLE t2_tmp ( a INT, new_a INT);
-INSERT INTO t2_tmp VALUES (1,51),(2,52),(3,53);
-
-UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 1;
-
---send
-UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 2;
-
---sleep 3
-
-connection c1;
-
---error ER_LOCK_DEADLOCK
-INSERT INTO t1_tmp SELECT b FROM t1 WHERE a = 1;
-
-connection c2;
-
---reap
-UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 3;
-
-connection default;
-disconnect c1;
-disconnect c2;
-DROP TABLE t1;
-
-#
# Bug #37742: HA_EXTRA_KEYREAD flag is set when key contains only prefix of
# requested column
#
diff --git a/mysql-test/t/lock.test b/mysql-test/t/lock.test
index 6069bbf7018..30f4d4d6c61 100644
--- a/mysql-test/t/lock.test
+++ b/mysql-test/t/lock.test
@@ -214,4 +214,34 @@ create view v_bug5719 as select * from t2;
--echo
drop table t2, t3;
+--echo #
+--echo # Bug#39843 DELETE requires write access to table in subquery in where clause
+--echo #
+--disable_warnings
+DROP TABLE IF EXISTS t1,t2;
+--enable_warnings
+CREATE TABLE t1 (
+table1_rowid SMALLINT NOT NULL
+);
+CREATE TABLE t2 (
+table2_rowid SMALLINT NOT NULL
+);
+INSERT INTO t1 VALUES (1);
+INSERT INTO t2 VALUES (1);
+LOCK TABLES t1 WRITE, t2 READ;
+--echo # Sub-select should not try to aquire a write lock.
+DELETE FROM t1
+WHERE EXISTS
+(
+SELECT 'x'
+FROM t2
+WHERE t1.table1_rowid = t2.table2_rowid
+) ;
+--echo # While implementing the patch we didn't break old behavior;
+--echo # The following sub-select should still requires a write lock:
+--error ER_TABLE_NOT_LOCKED_FOR_WRITE
+SELECT * FROM t1 WHERE 1 IN (SELECT * FROM t2 FOR UPDATE);
+UNLOCK TABLES;
+DROP TABLE t1,t2;
+
--echo End of 5.1 tests.
diff --git a/mysql-test/t/lock_multi.test b/mysql-test/t/lock_multi.test
index 08747b0f92e..586cfb174be 100644
--- a/mysql-test/t/lock_multi.test
+++ b/mysql-test/t/lock_multi.test
@@ -1,4 +1,8 @@
-- source include/not_embedded.inc
+
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
+
--disable_warnings
drop table if exists t1,t2;
--enable_warnings
@@ -14,14 +18,18 @@ create table t1(n int);
insert into t1 values (1);
lock tables t1 write;
connection writer;
-send update low_priority t1 set n = 4;
+send
+update low_priority t1 set n = 4;
connection reader;
+# Sleep a bit till the update of connection writer is in work and hangs
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Locked" and info = "update low_priority t1 set n = 4";
--source include/wait_condition.inc
-send select n from t1;
+send
+select n from t1;
connection locker;
+# Sleep a bit till the select of connection reader is in work and hangs
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Locked" and info = "select n from t1";
@@ -38,8 +46,10 @@ create table t1(n int);
insert into t1 values (1);
lock tables t1 read;
connection writer;
-send update low_priority t1 set n = 4;
+send
+update low_priority t1 set n = 4;
connection reader;
+# Sleep a bit till the update of connection writer is in work and hangs
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Locked" and info = "update low_priority t1 set n = 4";
@@ -72,7 +82,7 @@ drop table t1;
drop table t2;
#
-# Test problem when using locks on many tables and droping a table that
+# Test problem when using locks on many tables and dropping a table that
# is to-be-locked by another thread
#
#
@@ -81,7 +91,8 @@ create table t1 (a int);
create table t2 (a int);
lock table t1 write, t2 write;
connection reader;
-send insert t1 select * from t2;
+send
+insert t1 select * from t2;
connection locker;
let $wait_condition=
select count(*) = 1 from information_schema.processlist
@@ -89,7 +100,7 @@ let $wait_condition=
--source include/wait_condition.inc
drop table t2;
connection reader;
---error 1146
+--error ER_NO_SUCH_TABLE
reap;
connection locker;
drop table t1;
@@ -103,15 +114,17 @@ create table t1 (a int);
create table t2 (a int);
lock table t1 write, t2 write, t1 as t1_2 write, t2 as t2_2 write;
connection reader;
-send insert t1 select * from t2;
+send
+insert t1 select * from t2;
connection locker;
+# Sleep a bit till the insert of connection reader is in work and hangs
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Locked" and info = "insert t1 select * from t2";
--source include/wait_condition.inc
drop table t2;
connection reader;
---error 1146
+--error ER_NO_SUCH_TABLE
reap;
connection locker;
drop table t1;
@@ -120,7 +133,7 @@ drop table t1;
--echo End of 4.1 tests
#
-# BUG#9998 - MySQL client hangs on USE "database"
+# Bug#9998 MySQL client hangs on USE "database"
#
create table t1(a int);
lock tables t1 write;
@@ -131,26 +144,28 @@ unlock tables;
drop table t1;
#
-# Bug#16986 - Deadlock condition with MyISAM tables
+# Bug#16986 Deadlock condition with MyISAM tables
#
# Need a matching user in mysql.user for multi-table select
--source include/add_anonymous_users.inc
connection locker;
-use mysql;
+USE mysql;
LOCK TABLES columns_priv WRITE, db WRITE, host WRITE, user WRITE;
FLUSH TABLES;
#
connection reader;
-use mysql;
-#NOTE: This must be a multi-table select, otherwise the deadlock will not occur
-send SELECT user.Select_priv FROM user, db WHERE user.user = db.user LIMIT 1;
+USE mysql;
+# Note: This must be a multi-table select, otherwise the deadlock will not occur
+send
+SELECT user.Select_priv FROM user, db WHERE user.user = db.user LIMIT 1;
#
connection locker;
+# Sleep a bit till the select of connection reader is in work and hangs
let $wait_condition=
select count(*) = 1 from information_schema.processlist
- where state = "Waiting for table" and info =
+ where state = "Waiting for table" and info =
"SELECT user.Select_priv FROM user, db WHERE user.user = db.user LIMIT 1";
--source include/wait_condition.inc
# Make test case independent from earlier grants.
@@ -160,7 +175,7 @@ UNLOCK TABLES;
#
connection reader;
reap;
-use test;
+USE test;
#
connection locker;
use test;
@@ -175,9 +190,11 @@ LOCK TABLE t1 WRITE;
#
# This waits until t1 is unlocked.
connection locker;
-send FLUSH TABLES WITH READ LOCK;
+send
+FLUSH TABLES WITH READ LOCK;
#
connection writer;
+# Sleep a bit till the flush of connection locker is in work and hangs
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Flushing tables" and info = "FLUSH TABLES WITH READ LOCK";
@@ -202,15 +219,17 @@ LOCK TABLE t1 WRITE;
#
# This waits until t1 is unlocked.
connection locker;
-send FLUSH TABLES WITH READ LOCK;
+send
+FLUSH TABLES WITH READ LOCK;
#
# This must not block.
connection writer;
+# Sleep a bit till the flush of connection locker is in work and hangs
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Flushing tables" and info = "FLUSH TABLES WITH READ LOCK";
--source include/wait_condition.inc
---error 1100
+--error ER_TABLE_NOT_LOCKED
CREATE TABLE t2 AS SELECT * FROM t1;
UNLOCK TABLES;
#
@@ -225,7 +244,7 @@ DROP TABLE t1;
--source include/delete_anonymous_users.inc
#
-# Bug#19815 - CREATE/RENAME/DROP DATABASE can deadlock on a global read lock
+# Bug#19815 CREATE/RENAME/DROP DATABASE can deadlock on a global read lock
#
connect (con1,localhost,root,,);
connect (con2,localhost,root,,);
@@ -237,7 +256,8 @@ FLUSH TABLES WITH READ LOCK;
# With bug in place: acquire LOCK_mysql_create_table and
# wait in wait_if_global_read_lock().
connection con2;
-send DROP DATABASE mysqltest_1;
+send
+DROP DATABASE mysqltest_1;
#
# With bug in place: try to acquire LOCK_mysql_create_table...
# When fixed: Reject dropping db because of the read lock.
@@ -263,7 +283,7 @@ disconnect con2;
DROP DATABASE mysqltest_1;
#
-# Bug #17264: MySQL Server freeze
+# Bug#17264 MySQL Server freeze
#
connection locker;
# Disable warnings to allow test to run also without InnoDB
@@ -272,14 +292,18 @@ create table t1 (f1 int(12) unsigned not null auto_increment, primary key(f1)) e
--enable_warnings
lock tables t1 write;
connection writer;
-send alter table t1 auto_increment=0;
+send
+alter table t1 auto_increment=0;
connection reader;
+# Wait till connection writer is blocked
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Locked" and info = "alter table t1 auto_increment=0";
--source include/wait_condition.inc
-send alter table t1 auto_increment=0;
+send
+alter table t1 auto_increment=0;
connection locker;
+# Wait till connection reader is blocked
let $wait_condition=
select count(*) = 2 from information_schema.processlist
where state = "Locked" and info = "alter table t1 auto_increment=0";
@@ -293,8 +317,8 @@ connection locker;
drop table t1;
#
-# Bug #38691: segfault/abort in ``UPDATE ...JOIN'' while
-# ``FLUSH TABLES WITH READ LOCK''
+# Bug#38691 segfault/abort in ``UPDATE ...JOIN'' while
+# ``FLUSH TABLES WITH READ LOCK''
#
--connection default
@@ -365,7 +389,7 @@ while ($i) {
dec $i;
--connection locker
---error 0,1060
+--error 0,ER_DUP_FIELDNAME
ALTER TABLE t2 ADD COLUMN a int(11) unsigned default NULL;
UPDATE t2 SET a=b;
@@ -373,11 +397,11 @@ while ($i) {
--send UPDATE t2 INNER JOIN (t1 JOIN t3 USING(a)) USING(a) SET a = NULL WHERE t1.b <> t2.b
--connection locker
---error 0,1091
+--error 0,ER_CANT_DROP_FIELD_OR_KEY
ALTER TABLE t2 DROP COLUMN a;
--connection writer
---error 0,1054
+--error 0,ER_BAD_FIELD_ERROR
--reap
}
--enable_query_log
@@ -390,7 +414,7 @@ while ($i) {
dec $i;
--connection locker
---error 0,1060
+--error 0,ER_DUP_FIELDNAME
ALTER TABLE t2 ADD COLUMN a int(11) unsigned default NULL;
UPDATE t2 SET a=b;
@@ -399,11 +423,11 @@ while ($i) {
--send EXECUTE stmt
--connection locker
---error 0,1091
+--error 0,ER_CANT_DROP_FIELD_OR_KEY
ALTER TABLE t2 DROP COLUMN a;
--connection writer
---error 0,1054
+--error 0,ER_BAD_FIELD_ERROR
--reap
}
@@ -411,9 +435,10 @@ while ($i) {
--connection default
DROP TABLE t1, t2, t3;
+
#
-# Bug#38499: flush tables and multitable table update with derived table cause
-# crash
+# Bug#38499 flush tables and multitable table update with derived table cause
+# crash
#
CREATE TABLE t1( a INT, b INT );
@@ -471,7 +496,7 @@ while ($i) {
dec $i;
--connection locker
---error 0,1060
+--error 0,ER_DUP_FIELDNAME
ALTER TABLE t1 ADD COLUMN a int(11) unsigned default NULL;
UPDATE t1 SET a=b;
@@ -479,11 +504,11 @@ while ($i) {
--send UPDATE t1, (SELECT 1 FROM t1 t1i) d SET a = 0 WHERE 1=0;
--connection locker
---error 0,1091
+--error 0,ER_CANT_DROP_FIELD_OR_KEY
ALTER TABLE t1 DROP COLUMN a;
--connection writer
---error 0,1054 # unknown column error
+--error 0,ER_BAD_FIELD_ERROR # unknown column error
--reap
}
--enable_query_log
@@ -496,7 +521,7 @@ while ($i) {
dec $i;
--connection locker
---error 0,1060
+--error 0,ER_DUP_FIELDNAME
ALTER TABLE t1 ADD COLUMN a INT;
UPDATE t1 SET a=b;
@@ -505,11 +530,11 @@ while ($i) {
--send EXECUTE stmt
--connection locker
---error 0,1091
+--error 0,ER_CANT_DROP_FIELD_OR_KEY
ALTER TABLE t1 DROP COLUMN a;
--connection writer
---error 0,1054 # Unknown column 'a' in 'field list'
+--error 0,ER_BAD_FIELD_ERROR # Unknown column 'a' in 'field list'
--reap
}
--enable_query_log
@@ -568,7 +593,7 @@ while ($i) {
dec $i;
--connection locker
---error 0,1060
+--error 0,ER_DUP_FIELDNAME
ALTER TABLE t1 ADD COLUMN a int(11) unsigned default NULL;
UPDATE t1 SET a=b;
@@ -576,11 +601,11 @@ while ($i) {
--send UPDATE t1, ((SELECT 1 FROM t1 t1i) UNION (SELECT 2 FROM t1 t1ii)) e SET a = 0 WHERE 1=0;
--connection locker
---error 0,1091
+--error 0,ER_CANT_DROP_FIELD_OR_KEY
ALTER TABLE t1 DROP COLUMN a;
--connection writer
---error 0,1054 # Unknown column 'a' in 'field list'
+--error 0,ER_BAD_FIELD_ERROR # Unknown column 'a' in 'field list'
--reap
}
--enable_query_log
@@ -593,7 +618,7 @@ while ($i) {
dec $i;
--connection locker
---error 0,1060
+--error 0,ER_DUP_FIELDNAME
ALTER TABLE t1 ADD COLUMN a INT;
UPDATE t1 SET a=b;
@@ -602,11 +627,11 @@ while ($i) {
--send EXECUTE stmt
--connection locker
---error 0,1091
+--error 0,ER_CANT_DROP_FIELD_OR_KEY
ALTER TABLE t1 DROP COLUMN a;
--connection writer
---error 0,1054 # Unknown column 'a' in 'field list'
+--error 0,ER_BAD_FIELD_ERROR # Unknown column 'a' in 'field list'
--reap
}
--enable_query_log
@@ -617,20 +642,22 @@ DROP TABLE t1;
#
-# Bug #21281 "Pending write lock is incorrectly removed when its
-# statement being KILLed"
+# Bug#21281 Pending write lock is incorrectly removed when its
+# statement being KILLed
#
create table t1 (i int);
connection locker;
lock table t1 read;
connection writer;
---send update t1 set i= 10;
+send
+update t1 set i= 10;
connection reader;
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Locked" and info = "update t1 set i= 10";
--source include/wait_condition.inc
---send select * from t1;
+send
+select * from t1;
connection default;
let $wait_condition=
select count(*) = 1 from information_schema.processlist
@@ -642,7 +669,7 @@ eval kill query $ID;
connection reader;
--reap
connection writer;
---error ER_QUERY_INTERRUPTED
+--error ER_QUERY_INTERRUPTED
--reap
connection locker;
unlock tables;
@@ -650,7 +677,7 @@ connection default;
drop table t1;
#
-# Bug#25856 - HANDLER table OPEN in one connection lock DROP TABLE in another one
+# Bug#25856 HANDLER table OPEN in one connection lock DROP TABLE in another one
#
--disable_warnings
drop table if exists t1;
@@ -658,12 +685,19 @@ drop table if exists t1;
create table t1 (a int) ENGINE=MEMORY;
--echo --> client 2
connection locker;
---error 1031
+--error ER_ILLEGAL_HA
handler t1 open;
--echo --> client 1
connection default;
drop table t1;
+
+# Disconnect sessions used in many subtests above
+disconnect locker;
+disconnect reader;
+disconnect writer;
+
+
#
# Bug#32395 Alter table under a impending global read lock causes a server crash
#
@@ -764,7 +798,7 @@ disconnect flush;
drop table t1;
#
-# Bug#30331: Table_locks_waited shows inaccurate values
+# Bug#30331 Table_locks_waited shows inaccurate values
#
--disable_warnings
@@ -794,3 +828,7 @@ eval SET @tlwb= SUBSTRING_INDEX('$tlwb', ' ', -1);
select @tlwa < @tlwb;
--echo End of 5.1 tests
+
+# Wait till all disconnects are completed
+--source include/wait_until_count_sessions.inc
+
diff --git a/mysql-test/t/log_tables.test b/mysql-test/t/log_tables.test
index 326914f09d9..076f2e8bc3b 100644
--- a/mysql-test/t/log_tables.test
+++ b/mysql-test/t/log_tables.test
@@ -287,7 +287,7 @@ CREATE TABLE `general_log` (
ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`thread_id` int(11) NOT NULL,
- `server_id` int(11) NOT NULL,
+ `server_id` int(10) unsigned NOT NULL,
`command_type` varchar(64) NOT NULL,
`argument` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log';
@@ -303,7 +303,7 @@ CREATE TABLE `slow_log` (
`db` varchar(512) NOT NULL,
`last_insert_id` int(11) NOT NULL,
`insert_id` int(11) NOT NULL,
- `server_id` int(11) NOT NULL,
+ `server_id` int(10) unsigned NOT NULL,
`sql_text` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log';
diff --git a/mysql-test/t/merge.test b/mysql-test/t/merge.test
index 2fbfe2721e2..f12187ea143 100644
--- a/mysql-test/t/merge.test
+++ b/mysql-test/t/merge.test
@@ -1496,4 +1496,22 @@ UNLOCK TABLES;
--echo # drop the created tables
DROP TABLE t1, t2, t3;
+#
+# Bug #41305 server crashes when inserting duplicate row into a merge table
+#
+--echo # insert duplicate value in child table while merge table doesn't have key
+create table t1 (
+ col1 int(10),
+ primary key (col1)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+CREATE TABLE m1 (
+ col1 int(10) NOT NULL
+) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(t1);
+
+insert into m1 (col1) values (1);
+--error ER_DUP_ENTRY
+insert into m1 (col1) values (1);
+
+drop table m1, t1;
--echo End of 5.1 tests
diff --git a/mysql-test/t/mysql.test b/mysql-test/t/mysql.test
index a182da5fbea..33184988d47 100644
--- a/mysql-test/t/mysql.test
+++ b/mysql-test/t/mysql.test
@@ -98,35 +98,43 @@ drop table t1;
# Bug #20432: mysql client interprets commands in comments
#
+--let $file = $MYSQLTEST_VARDIR/tmp/bug20432.sql
+
# if the client sees the 'use' within the comment, we haven't fixed
---exec echo "/*" > $MYSQLTEST_VARDIR/tmp/bug20432.sql
---exec echo "use" >> $MYSQLTEST_VARDIR/tmp/bug20432.sql
---exec echo "*/" >> $MYSQLTEST_VARDIR/tmp/bug20432.sql
---exec $MYSQL < $MYSQLTEST_VARDIR/tmp/bug20432.sql 2>&1
+--exec echo "/*" > $file
+--exec echo "use" >> $file
+--exec echo "*/" >> $file
+--exec $MYSQL < $file 2>&1
# SQL can have embedded comments => workie
---exec echo "select /*" > $MYSQLTEST_VARDIR/tmp/bug20432.sql
---exec echo "use" >> $MYSQLTEST_VARDIR/tmp/bug20432.sql
---exec echo "*/ 1" >> $MYSQLTEST_VARDIR/tmp/bug20432.sql
---exec $MYSQL < $MYSQLTEST_VARDIR/tmp/bug20432.sql 2>&1
+--exec echo "select /*" > $file
+--exec echo "use" >> $file
+--exec echo "*/ 1" >> $file
+--exec $MYSQL < $file 2>&1
# client commands on the other hand must be at BOL => error
---exec echo "/*" > $MYSQLTEST_VARDIR/tmp/bug20432.sql
---exec echo "xxx" >> $MYSQLTEST_VARDIR/tmp/bug20432.sql
---exec echo "*/ use" >> $MYSQLTEST_VARDIR/tmp/bug20432.sql
+--exec echo "/*" > $file
+--exec echo "xxx" >> $file
+--exec echo "*/ use" >> $file
--error 1
---exec $MYSQL < $MYSQLTEST_VARDIR/tmp/bug20432.sql 2>&1
+--exec $MYSQL < $file 2>&1
# client comment recognized, but parameter missing => error
---exec echo "use" > $MYSQLTEST_VARDIR/tmp/bug20432.sql
---exec $MYSQL < $MYSQLTEST_VARDIR/tmp/bug20432.sql 2>&1
+--exec echo "use" > $file
+--exec $MYSQL < $file 2>&1
+
+--remove_file $file
#
# Bug #20328: mysql client interprets commands in comments
#
---exec $MYSQL -e "help" > $MYSQLTEST_VARDIR/tmp/bug20328_1.result
---exec $MYSQL -e "help " > $MYSQLTEST_VARDIR/tmp/bug20328_2.result
---diff_files $MYSQLTEST_VARDIR/tmp/bug20328_1.result $MYSQLTEST_VARDIR/tmp/bug20328_2.result
+--let $file1 = $MYSQLTEST_VARDIR/tmp/bug20328_1.result
+--let $file2 = $MYSQLTEST_VARDIR/tmp/bug20328_2.result
+--exec $MYSQL -e "help" > $file1
+--exec $MYSQL -e "help " > $file2
+--diff_files $file1 $file2
+--remove_file $file1
+--remove_file $file2
#
# Bug #19216: Client crashes on long SELECT
@@ -152,13 +160,15 @@ EOF
#
# Bug #20103: Escaping with backslash does not work
#
---exec echo "SET SQL_MODE = 'NO_BACKSLASH_ESCAPES';" > $MYSQLTEST_VARDIR/tmp/bug20103.sql
---exec echo "SELECT '\';" >> $MYSQLTEST_VARDIR/tmp/bug20103.sql
---exec $MYSQL < $MYSQLTEST_VARDIR/tmp/bug20103.sql 2>&1
+--let $file = $MYSQLTEST_VARDIR/tmp/bug20103.sql
+--exec echo "SET SQL_MODE = 'NO_BACKSLASH_ESCAPES';" > $file
+--exec echo "SELECT '\';" >> $file
+--exec $MYSQL < $file 2>&1
---exec echo "SET SQL_MODE = '';" > $MYSQLTEST_VARDIR/tmp/bug20103.sql
---exec echo "SELECT '\';';" >> $MYSQLTEST_VARDIR/tmp/bug20103.sql
---exec $MYSQL < $MYSQLTEST_VARDIR/tmp/bug20103.sql 2>&1
+--exec echo "SET SQL_MODE = '';" > $file
+--exec echo "SELECT '\';';" >> $file
+--exec $MYSQL < $file 2>&1
+--remove_file $file
#
# Bug#17583: mysql drops connection when stdout is not writable
@@ -315,6 +325,50 @@ remove_file $MYSQLTEST_VARDIR/tmp/bug38158.sql;
#
--exec $MYSQL -e "select @z:='1',@z=database()"
+
+#
+# Bug #31060: MySQL CLI parser bug 2
+#
+
+--write_file $MYSQLTEST_VARDIR/tmp/bug31060.sql
+;DELIMITER DELIMITER
+;
+SELECT 1DELIMITER
+DELIMITER ;
+SELECT 1;
+EOF
+
+--exec $MYSQL < $MYSQLTEST_VARDIR/tmp/bug31060.sql 2>&1
+
+remove_file $MYSQLTEST_VARDIR/tmp/bug31060.sql;
+
+#
+# Bug #41486: extra character appears in BLOB for every ~40Mb after
+# mysqldump/import
+#
+
+# Have to change the global variable as the mysql client will use
+# a separate session
+set @old_max_allowed_packet = @@global.max_allowed_packet;
+# 2 MB blob length + some space for the rest of INSERT query
+set @@global.max_allowed_packet = 2 * 1024 * 1024 + 1024;
+set @@max_allowed_packet = @@global.max_allowed_packet;
+
+CREATE TABLE t1(data LONGBLOB);
+INSERT INTO t1 SELECT REPEAT('1', 2*1024*1024);
+
+--exec $MYSQL_DUMP test t1 >$MYSQLTEST_VARDIR/tmp/bug41486.sql
+# Check that the mysql client does not insert extra newlines when loading
+# strings longer than client's max_allowed_packet
+--exec $MYSQL --max_allowed_packet=1M test < $MYSQLTEST_VARDIR/tmp/bug41486.sql 2>&1
+SELECT LENGTH(data) FROM t1;
+
+remove_file $MYSQLTEST_VARDIR/tmp/bug41486.sql;
+DROP TABLE t1;
+
+set @@global.max_allowed_packet = @old_max_allowed_packet;
+set @@max_allowed_packet = @@global.max_allowed_packet;
+
--echo End of 5.0 tests
#
diff --git a/mysql-test/t/mysqlbinlog.test b/mysql-test/t/mysqlbinlog.test
index e0595674cf9..46060649784 100644
--- a/mysql-test/t/mysqlbinlog.test
+++ b/mysql-test/t/mysqlbinlog.test
@@ -24,7 +24,7 @@ insert into t2 values ();
# set @a:=1
# insert into t2 values (@a);
-# test for load data and load data distributed among the several
+# test for load data and load data distributed among the several
# files (we need to fill up first binlog)
load data infile '../../std_data/words.dat' into table t1;
load data infile '../../std_data/words.dat' into table t1;
@@ -109,7 +109,7 @@ select "--- --position --" as "";
--replace_regex /SQL_LOAD_MB-[0-9]-[0-9]/SQL_LOAD_MB-#-#/
--exec $MYSQL_BINLOG --short-form --local-load=$MYSQLTEST_VARDIR/tmp/ --read-from-remote-server --position=239 --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000002
-# Bug#7853 (mysqlbinlog does not accept input from stdin)
+# Bug#7853 mysqlbinlog does not accept input from stdin
--disable_query_log
select "--- reading stdin --" as "";
--enable_query_log
@@ -123,7 +123,7 @@ select "--- reading stdin --" as "";
drop table t1,t2;
#
-#BUG#14157: utf8 encoding in binlog without set character_set_client
+# Bug#14157 utf8 encoding in binlog without set character_set_client
#
flush logs;
--write_file $MYSQLTEST_VARDIR/tmp/bug14157.sql
@@ -136,8 +136,8 @@ EOF
--exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/bug14157.sql
--remove_file $MYSQLTEST_VARDIR/tmp/bug14157.sql
-# resulted binlog, parly consisting of multi-byte utf8 chars,
-# must be digestable for both client and server. In 4.1 the client
+# resulted binlog, parly consisting of multi-byte utf8 chars,
+# must be digestable for both client and server. In 4.1 the client
# should use default-character-set same as the server.
flush logs;
--exec $MYSQL_BINLOG --short-form $MYSQLD_DATADIR/master-bin.000004 | $MYSQL
@@ -164,7 +164,7 @@ select * from t5 order by c1;
drop table t5;
#
-# Bug#20396 Bin Log does not get DELIMETER cmd - Recover StoredProc fails
+# Bug#20396 Bin Log does not get DELIMETER cmd - Recover StoredProc fails
#
--disable_warnings
drop procedure if exists p1;
@@ -180,7 +180,7 @@ delimiter ;//
flush logs;
call p1();
drop procedure p1;
---error 1305
+--error ER_SP_DOES_NOT_EXIST
call p1();
--replace_regex /SQL_LOAD_MB-[0-9]-[0-9]/SQL_LOAD_MB-#-#/
--exec $MYSQL_BINLOG --short-form $MYSQLD_DATADIR/master-bin.000008
@@ -223,53 +223,73 @@ flush logs;
#
# Bug#28293 missed '#' sign in the hex dump when the dump length
-# is divisible by 16.
+# is divisible by 16.
#
CREATE TABLE t1 (c1 CHAR(10));
# we need this for getting fixed timestamps inside of this test
-flush logs;
+FLUSH LOGS;
INSERT INTO t1 VALUES ('0123456789');
-flush logs;
+FLUSH LOGS;
DROP TABLE t1;
---exec $MYSQL_BINLOG --hexdump --local-load=$MYSQLTEST_VARDIR/tmp/ $MYSQLD_DATADIR/master-bin.000012 | grep 'Query' | sed 's/[0-9]\{1,\}/REMOVED/g'
+
+# We create a table, patch, and load the output into it
+# By using LINES STARTING BY '#' + SELECT WHERE a LIKE 'Query'
+# We can easily see if a 'Query' line is missing the '#' character
+# as described in the original bug
+
+--disable_query_log
+CREATE TABLE patch (a BLOB);
+--exec $MYSQL_BINLOG --hexdump --local-load=$MYSQLTEST_VARDIR/tmp/ $MYSQLD_DATADIR/master-bin.000012 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_tmp.dat
+eval LOAD DATA LOCAL INFILE '$MYSQLTEST_VARDIR/tmp/mysqlbinlog_tmp.dat'
+ INTO TABLE patch FIELDS TERMINATED BY '' LINES STARTING BY '#';
+--remove_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog_tmp.dat
+--enable_query_log
+
+--echo We expect this value to be 1
+--echo The bug being tested was that 'Query' lines were not preceded by '#'
+--echo If the line is in the table, it had to have been preceded by a '#'
+--echo
+SELECT COUNT(*) AS `BUG#28293_expect_1` FROM patch WHERE a LIKE '%Query%';
+DROP TABLE patch;
#
-# Bug #29928: incorrect connection_id() restoring from mysqlbinlog out
+# Bug#29928 incorrect connection_id() restoring from mysqlbinlog out
#
-flush logs;
-create table t1(a int);
-insert into t1 values(connection_id());
-let $a= `select a from t1`;
-flush logs;
---exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000014 > $MYSQLTEST_VARDIR/tmp/bug29928.sql
-drop table t1;
-connect (con1, localhost, root, , test);
+FLUSH LOGS;
+CREATE TABLE t1(a INT);
+INSERT INTO t1 VALUES(connection_id());
+let $a= `SELECT a FROM t1`;
+FLUSH LOGS;
+let $outfile= $MYSQLTEST_VARDIR/tmp/bug29928.sql;
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000014 > $outfile
+DROP TABLE t1;
+connect (con1, localhost, root, , test);
connection con1;
---exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/bug29928.sql
---remove_file $MYSQLTEST_VARDIR/tmp/bug29928.sql
-let $b= `select a from t1`;
+--exec $MYSQL test < $outfile
+--remove_file $outfile
+let $b= `SELECT a FROM t1`;
disconnect con1;
connection default;
-let $c= `select $a=$b`;
+let $c= `SELECT $a=$b`;
--echo $c
-drop table t1;
+DROP TABLE t1;
echo shell> mysqlbinlog std_data/corrupt-relay-bin.000624 > var/tmp/bug31793.sql;
error 1;
exec $MYSQL_BINLOG $MYSQL_TEST_DIR/std_data/corrupt-relay-bin.000624 > $MYSQLTEST_VARDIR/tmp/bug31793.sql;
+--remove_file $MYSQLTEST_VARDIR/tmp/bug31793.sql
---echo End of 5.0 tests
#
# Test --disable-force-if-open and --force-if-open
#
-flush logs;
+FLUSH LOGS;
--error 1
--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000016 >/dev/null 2>/dev/null
--exec $MYSQL_BINLOG --force-if-open $MYSQLD_DATADIR/master-bin.000016 >/dev/null 2>/dev/null
---echo BUG#31611: Security risk with BINLOG statement
+--echo Bug#31611 Security risk with BINLOG statement
SET BINLOG_FORMAT=ROW;
CREATE DATABASE mysqltest1;
@@ -288,6 +308,7 @@ connect (unsecure,localhost,untrusted,,mysqltest1);
echo mysql mysqltest1 -uuntrusted < var/tmp/bug31611.sql;
error 1;
exec $MYSQL mysqltest1 -uuntrusted < $MYSQLTEST_VARDIR/tmp/bug31611.sql;
+--remove_file $MYSQLTEST_VARDIR/tmp/bug31611.sql
connection unsecure;
error ER_TABLEACCESS_DENIED_ERROR;
INSERT INTO t1 VALUES (1,USER());
@@ -297,7 +318,7 @@ connection default;
DROP DATABASE mysqltest1;
DROP USER untrusted@localhost;
---echo BUG#32580: mysqlbinlog cannot read binlog event with user variables
+--echo Bug#32580 mysqlbinlog cannot read binlog event with user variables
# Testing that various kinds of events can be read and restored properly.
@@ -324,4 +345,26 @@ remove_file $MYSQLTEST_VARDIR/tmp/bug32580.sql;
query_vertical SELECT * FROM t1;
DROP TABLE t1;
+#
+# Bug#37313 BINLOG Contains Incorrect server id
+#
+
+let $binlog_file= $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug37313.binlog;
+let $save_server_id= `SELECT @@global.server_id`;
+let $s_id_max= `SELECT (1 << 32) - 1`;
+eval SET @@global.server_id= $s_id_max;
+
+RESET MASTER;
+FLUSH LOGS;
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 > $binlog_file
+--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
+eval SELECT
+(@a:=LOAD_FILE("$binlog_file"))
+IS NOT NULL;
+let $s_id_unsigned= `SELECT @a LIKE "%server id $s_id_max%" /* must return 1 */`;
+echo *** Unsigned server_id $s_id_max is found: $s_id_unsigned ***;
+
+eval SET @@global.server_id= $save_server_id;
+--remove_file $binlog_file
+
--echo End of 5.1 tests
diff --git a/mysql-test/t/mysqldump-compat.test b/mysql-test/t/mysqldump-compat.test
index 848d66cc728..9a830b16f26 100644
--- a/mysql-test/t/mysqldump-compat.test
+++ b/mysql-test/t/mysqldump-compat.test
@@ -5,9 +5,13 @@
# Bug #30126: semicolon before closing */ in /*!... CREATE DATABASE ;*/
#
+--let $file = $MYSQLTEST_VARDIR/tmp/bug30126.sql
+
CREATE DATABASE mysqldump_30126;
USE mysqldump_30126;
CREATE TABLE t1 (c1 int);
---exec $MYSQL_DUMP --add-drop-database mysqldump_30126 > $MYSQLTEST_VARDIR/tmp/bug30126.sql
---exec $MYSQL mysqldump_30126 < $MYSQLTEST_VARDIR/tmp/bug30126.sql
+--exec $MYSQL_DUMP --add-drop-database mysqldump_30126 > $file
+--exec $MYSQL mysqldump_30126 < $file
DROP DATABASE mysqldump_30126;
+
+--remove_file $file
diff --git a/mysql-test/t/mysqldump.test b/mysql-test/t/mysqldump.test
index e93c9cbd274..51becb01fff 100644
--- a/mysql-test/t/mysqldump.test
+++ b/mysql-test/t/mysqldump.test
@@ -1647,6 +1647,40 @@ DROP TABLE t1,t2;
--replace_regex /-- [^D][^u][^m][^p].*// /\/\*!.*// / on [0-9 :-]+/ on DATE/
--exec $MYSQL_DUMP test
+# We reset concurrent_inserts value to whatever it was at the start of the test
+SET @@GLOBAL.CONCURRENT_INSERT = @OLD_CONCURRENT_INSERT;
+
+--echo #
+--echo # Bug #42635: mysqldump includes views that were excluded using
+--echo # the --ignore-table option
+--echo #
+
+create database db42635;
+use db42635;
+create table t1 (id int);
+create view db42635.v1 (c) as select * from db42635.t1;
+create view db42635.v2 (c) as select * from db42635.t1;
+--exec $MYSQL_DUMP --skip-comments --ignore-table=db42635.v1 db42635
+use test;
+drop database db42635;
+
+--echo #
+--echo # Bug#33550 mysqldump 4.0 compatibility broken
+--echo #
+
+SET NAMES utf8;
+CREATE TABLE `straße` ( f1 INT );
+--exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --skip-comments --default-character-set=utf8 --compatible=mysql323 test
+--exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --skip-comments --default-character-set=latin1 --compatible=mysql323 test
+DROP TABLE `straße`;
+
+CREATE TABLE `כדשגכחךלדגכחשךדגחכךלדגכ` ( f1 INT );
+--exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --skip-comments --default-character-set=utf8 --compatible=mysql323 test
+--error 2
+--exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --skip-comments --default-character-set=latin1 --compatible=mysql323 test
+DROP TABLE `כדשגכחךלדגכחשךדגחכךלדגכ`;
+SET NAMES latin1;
+
--echo #
--echo # End of 5.0 tests
diff --git a/mysql-test/t/mysqltest.test b/mysql-test/t/mysqltest.test
index 6c5efba8b5b..55cd041aaf5 100644
--- a/mysql-test/t/mysqltest.test
+++ b/mysql-test/t/mysqltest.test
@@ -6,6 +6,9 @@
# This test uses chmod, can't be run with root permissions
-- source include/not_as_root.inc
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
+
# ============================================================================
#
# Test of mysqltest itself
@@ -50,7 +53,7 @@ select otto from (select 1 as otto) as t1;
# ----------------------------------------------------------------------------
# Negative case(statement):
-# The derived table t1 does not contain a column named 'friedrich' .
+# The derived table t1 does not contain a column named 'friedrich' .
# --> ERROR 42S22: Unknown column 'friedrich' in 'field list and
# --> 1054: Unknown column 'friedrich' in 'field list'
# ----------------------------------------------------------------------------
@@ -62,7 +65,8 @@ select otto from (select 1 as otto) as t1;
--exec echo "select friedrich from (select 1 as otto) as t1;" | $MYSQL_TEST 2>&1
# expectation = response
---error 1054
+--error ER_BAD_FIELD_ERROR
+
select friedrich from (select 1 as otto) as t1;
# The following unmasked unsuccessful statement must give
@@ -120,7 +124,7 @@ select friedrich from (select 1 as otto) as t1;
# $mysql_errno is a builtin variable of mysqltest and contains the return code
# of the last command sent to the server.
#
-# The following test cases often initialize $mysql_errno to 1064 by
+# The following test cases often initialize $mysql_errno to 1064 by
# a command with wrong syntax.
# Example: --error 1064 To prevent the abort after the error.
# garbage ;
@@ -135,14 +139,16 @@ eval select $mysql_errno as "after_successful_stmt_errno" ;
#----------------------------------------------------------------------------
# check mysql_errno = 1064 after statement with wrong syntax
# ----------------------------------------------------------------------------
---error 1064
+--error ER_PARSE_ERROR
+
garbage ;
eval select $mysql_errno as "after_wrong_syntax_errno" ;
# ----------------------------------------------------------------------------
# check if let $my_var= 'abc' ; affects $mysql_errno
# ----------------------------------------------------------------------------
---error 1064
+--error ER_PARSE_ERROR
+
garbage ;
let $my_var= 'abc' ;
eval select $mysql_errno as "after_let_var_equal_value" ;
@@ -150,7 +156,8 @@ eval select $mysql_errno as "after_let_var_equal_value" ;
# ----------------------------------------------------------------------------
# check if set @my_var= 'abc' ; affects $mysql_errno
# ----------------------------------------------------------------------------
---error 1064
+--error ER_PARSE_ERROR
+
garbage ;
set @my_var= 'abc' ;
eval select $mysql_errno as "after_set_var_equal_value" ;
@@ -159,7 +166,8 @@ eval select $mysql_errno as "after_set_var_equal_value" ;
# check if the setting of --disable-warnings itself affects $mysql_errno
# (May be --<whatever> modifies $mysql_errno.)
# ----------------------------------------------------------------------------
---error 1064
+--error ER_PARSE_ERROR
+
garbage ;
--disable_warnings
eval select $mysql_errno as "after_disable_warnings_command" ;
@@ -170,7 +178,8 @@ eval select $mysql_errno as "after_disable_warnings_command" ;
# (May be disabled warnings affect $mysql_errno.)
# ----------------------------------------------------------------------------
drop table if exists t1 ;
---error 1064
+--error ER_PARSE_ERROR
+
garbage ;
drop table if exists t1 ;
eval select $mysql_errno as "after_disable_warnings" ;
@@ -179,21 +188,26 @@ eval select $mysql_errno as "after_disable_warnings" ;
# ----------------------------------------------------------------------------
# check if masked errors affect $mysql_errno
# ----------------------------------------------------------------------------
---error 1064
+--error ER_PARSE_ERROR
+
garbage ;
---error 1146
+--error ER_NO_SUCH_TABLE
+
select 3 from t1 ;
eval select $mysql_errno as "after_minus_masked" ;
---error 1064
+--error ER_PARSE_ERROR
+
garbage ;
---error 1146
+--error ER_NO_SUCH_TABLE
+
select 3 from t1 ;
eval select $mysql_errno as "after_!_masked" ;
# ----------------------------------------------------------------------------
# Will manipulations of $mysql_errno be possible and visible ?
# ----------------------------------------------------------------------------
---error 1064
+--error ER_PARSE_ERROR
+
garbage ;
let $mysql_errno= -1;
eval select $mysql_errno as "after_let_errno_equal_value" ;
@@ -202,50 +216,61 @@ eval select $mysql_errno as "after_let_errno_equal_value" ;
# How affect actions on prepared statements $mysql_errno ?
# ----------------------------------------------------------------------------
# failing prepare
---error 1064
+--error ER_PARSE_ERROR
+
garbage ;
---error 1146
+--error ER_NO_SUCH_TABLE
+
prepare stmt from "select 3 from t1" ;
eval select $mysql_errno as "after_failing_prepare" ;
create table t1 ( f1 char(10));
# successful prepare
---error 1064
+--error ER_PARSE_ERROR
+
garbage ;
prepare stmt from "select 3 from t1" ;
eval select $mysql_errno as "after_successful_prepare" ;
# successful execute
---error 1064
+--error ER_PARSE_ERROR
+
garbage ;
execute stmt;
eval select $mysql_errno as "after_successful_execute" ;
# failing execute (table has been dropped)
drop table t1;
---error 1064
+--error ER_PARSE_ERROR
+
garbage ;
---error 1146
+--error ER_NO_SUCH_TABLE
+
execute stmt;
eval select $mysql_errno as "after_failing_execute" ;
# failing execute (unknown statement)
---error 1064
+--error ER_PARSE_ERROR
+
garbage ;
---error 1243
+--error ER_UNKNOWN_STMT_HANDLER
+
execute __stmt_;
eval select $mysql_errno as "after_failing_execute" ;
# successful deallocate
---error 1064
+--error ER_PARSE_ERROR
+
garbage ;
deallocate prepare stmt;
eval select $mysql_errno as "after_successful_deallocate" ;
# failing deallocate ( statement handle does not exist )
---error 1064
+--error ER_PARSE_ERROR
+
garbage ;
---error 1243
+--error ER_UNKNOWN_STMT_HANDLER
+
deallocate prepare __stmt_;
eval select $mysql_errno as "after_failing_deallocate" ;
@@ -270,7 +295,8 @@ eval select $mysql_errno as "after_failing_deallocate" ;
# ----------------------------------------------------------------------------
# Switch off the abort on error and check the effect on $mysql_errno
# ----------------------------------------------------------------------------
---error 1064
+--error ER_PARSE_ERROR
+
garbage ;
--disable_abort_on_error
eval select $mysql_errno as "after_--disable_abort_on_error" ;
@@ -284,9 +310,11 @@ select 3 from t1 ;
# masked failing statements
# ----------------------------------------------------------------------------
# expected error = response
---error 1146
+--error ER_NO_SUCH_TABLE
+
select 3 from t1 ;
---error 1146
+--error ER_NO_SUCH_TABLE
+
select 3 from t1 ;
eval select $mysql_errno as "after_!errno_masked_error" ;
# expected error <> response
@@ -300,7 +328,8 @@ eval select $mysql_errno as "after_!errno_masked_error" ;
# ----------------------------------------------------------------------------
# Switch the abort on error on and check the effect on $mysql_errno
# ----------------------------------------------------------------------------
---error 1064
+--error ER_PARSE_ERROR
+
garbage ;
--enable_abort_on_error
eval select $mysql_errno as "after_--enable_abort_on_error" ;
@@ -309,7 +338,8 @@ eval select $mysql_errno as "after_--enable_abort_on_error" ;
# masked failing statements
# ----------------------------------------------------------------------------
# expected error = response
---error 1146
+--error ER_NO_SUCH_TABLE
+
select 3 from t1 ;
# ----------------------------------------------------------------------------
@@ -458,7 +488,7 @@ remove_file $MYSQLTEST_VARDIR/tmp/mysqltest.sql;
# Allow trailing # comment
--sleep 1 # Wait for insert delayed to be executed.
---sleep 1 # Wait for insert delayed to be executed.
+--sleep 1 # Wait for insert delayed to be executed.
# ----------------------------------------------------------------------------
# Test error
@@ -573,9 +603,6 @@ echo ;
# Illegal use of exec
--error 1
---exec echo "--exec false" | $MYSQL_TEST 2>&1
-
---error 1
--exec echo "--exec " | $MYSQL_TEST 2>&1
# ----------------------------------------------------------------------------
@@ -683,7 +710,7 @@ echo Not a banana: $cat;
--error 1
--exec echo "let hi;" | $MYSQL_TEST 2>&1
-# More advanced test for bug#17280
+# More advanced test for Bug#17280
let $success= 1;
--echo # Execute: --echo # <whatever> success: \$success
--echo # <whatever> success: $success
@@ -955,8 +982,6 @@ system echo "hej" > /dev/null;
--exec echo "system;" | $MYSQL_TEST 2>&1
--error 1
--exec echo "system $NONEXISTSINFVAREABLI;" | $MYSQL_TEST 2>&1
---error 1
---exec echo "system false;" | $MYSQL_TEST 2>&1
--disable_abort_on_error
system NonExistsinfComamdn 2> /dev/null;
@@ -1364,17 +1389,18 @@ connection default;
# ----------------------------------------------------------------------------
-# TODO Test queries, especially their errormessages... so it's easy to debug
+# TODO Test queries, especially their errormessages... so it's easy to debug
# new scripts and diagnose errors
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
-# Test bug#12386
+# Test Bug#12386
# ----------------------------------------------------------------------------
let $num= 2;
while ($num)
{
- --error 1064
+ --error ER_PARSE_ERROR
+
failing_statement;
dec $num;
@@ -1384,7 +1410,7 @@ SELECT 1 as a;
#
-# Bug #10251: Identifiers containing quotes not handled correctly
+# Bug#10251 Identifiers containing quotes not handled correctly
#
select 1 as `a'b`, 2 as `a"b`;
@@ -1405,7 +1431,7 @@ let $message= `SELECT USER()`;
# The message contains more then 80 characters on multiple lines
# and is kept between double quotes.
-let $message=
+let $message=
"Here comes a very very long message that
- is longer then 80 characters and
- consists of several lines";
@@ -1433,14 +1459,16 @@ select "this will be executed";
#
# Test zero length result file. Should not pass
#
---exec touch $MYSQLTEST_VARDIR/tmp/zero_length_file.result
+--exec echo '' > $MYSQLTEST_VARDIR/tmp/zero_length_file.result
--exec echo "echo ok;" > $MYSQLTEST_VARDIR/tmp/query.sql
--error 1
--exec $MYSQL_TEST -x $MYSQLTEST_VARDIR/tmp/query.sql -R $MYSQLTEST_VARDIR/tmp/zero_length_file.result > /dev/null 2>&1
remove_file $MYSQLTEST_VARDIR/tmp/zero_length_file.result;
--error 0,1
-remove_file $MYSQLTEST_VARDIR/log/zero_length_file.reject;
+remove_file $MYSQLTEST_VARDIR/tmp/zero_length_file.reject;
+--error 0,1
+remove_file $MYSQLTEST_VARDIR/tmp/zero_length_file.log;
--error 0,1
remove_file $MYSQL_TEST_DIR/r/zero_length_file.reject;
@@ -1464,8 +1492,8 @@ remove_file $MYSQLTEST_VARDIR/tmp/query.sql;
#--exec $MYSQL_TEST -x $MYSQLTEST_VARDIR/tmp/query.sql -R $MYSQLTEST_VARDIR/tmp/result_file.result 2>&1
#
-# Bug #11731 mysqltest in multi-statement queries ignores errors in
-# non-1st queries
+# Bug#11731 mysqltest in multi-statement queries ignores errors in
+# non-1st queries
#
echo Failing multi statement query;
@@ -1486,7 +1514,8 @@ drop table t1;
--error 1
--exec $MYSQL_TEST --record -x $MYSQLTEST_VARDIR/tmp/bug11731.sql -R $MYSQLTEST_VARDIR/tmp/bug11731.out 2>&1
# The .out file should be non existent
---exec test ! -s $MYSQLTEST_VARDIR/tmp/bug11731.out
+--error 1
+--file_exists $MYSQLTEST_VARDIR/tmp/bug11731.out
drop table t1;
@@ -1508,26 +1537,29 @@ drop table t1;
--exec $MYSQL_TEST --record -x $MYSQLTEST_VARDIR/tmp/bug11731.sql -R $MYSQLTEST_VARDIR/tmp/bug11731.out 2>&1
# The .out file should exist
---exec test -s $MYSQLTEST_VARDIR/tmp/bug11731.out
+--file_exists $MYSQLTEST_VARDIR/tmp/bug11731.out
drop table t1;
remove_file $MYSQLTEST_VARDIR/tmp/bug11731.out;
remove_file $MYSQLTEST_VARDIR/log/bug11731.log;
remove_file $MYSQLTEST_VARDIR/tmp/bug11731.sql;
#
-# Bug#19890 mysqltest: "query" command is broken
+# Bug#19890 mysqltest "query" command is broken
#
# It should be possible to use the command "query" to force mysqltest to
# send the command to the server although it's a builtin mysqltest command.
---error 1064
+--error ER_PARSE_ERROR
+
query sleep;
---error 1064
+--error ER_PARSE_ERROR
+
--query sleep
# Just an empty query command
---error 1065
+--error ER_EMPTY_QUERY
+
query ;
# test for replace_regex
@@ -1538,7 +1570,7 @@ select "at" as col1, "c" as col2;
select "at" as col1, "AT" as col2, "c" as col3;
--replace_regex /a/b/ /ct/d/
-select "a" as col1, "ct" as col2;
+select "a" as col1, "ct" as col2;
--replace_regex /(strawberry)/raspberry and \1/ /blueberry/blackberry/ /potato/tomato/;
select "strawberry","blueberry","potato";
@@ -1556,7 +1588,7 @@ select "strawberry","blueberry","potato";
--error 1
--exec echo "--replace_regex /a b c" | $MYSQL_TEST 2>&1
--error 1
---exec echo "replace_regex /a /b c ;" | $MYSQL_TEST 2>&1
+--exec echo "replace_regex /a /b c ;" | $MYSQL_TEST 2>&1
# REQUIREMENT
# replace_regex should replace substitutions from left to right in output
@@ -1921,12 +1953,13 @@ eval $my_stmt;
# 8. Ensure that "sorted_result " does not change the semantics of
# "--error ...." or the protocol output after such an expected failure
--sorted_result
---error 1146
+--error ER_NO_SUCH_TABLE
+
SELECT '2' as "my_col1",2 as "my_col2"
UNION
SELECT '1',1 from t2;
-# 9. Ensure that several result formatting options including "sorted_result"
+# 9. Ensure that several result formatting options including "sorted_result"
# - have all an effect
# - "--sorted_result" does not need to be direct before the statement
# - Row sorting is applied after modification of the column content
@@ -2142,15 +2175,15 @@ remove_file $MYSQLTEST_VARDIR/tmp/testdir/file3.txt;
rmdir $MYSQLTEST_VARDIR/tmp/testdir;
#
-# Bug #36041: mysql-test-run doesn't seem to string match 100% effectively
-# on Windows
+# Bug#36041 mysql-test-run doesn't seem to string match 100% effectively
+# on Windows
#
--replace_result c:\\a.txt z
SELECT 'c:\\a.txt' AS col;
#
-# Bug #32307 mysqltest - does not detect illegal if syntax
+# Bug#32307 mysqltest - does not detect illegal if syntax
#
let $test= 1;
@@ -2184,12 +2217,14 @@ select 1;
# ----------------------------------------------------------------------------
-# BUG#35701: please allow test language variables in connection and sync_slave_with_master
+# BUG#35701 please allow test language variables in connection and sync_slave_with_master
# Test that "connection $variable" works and that $CURRENT_CONNECTION has the right value.
# ----------------------------------------------------------------------------
connect (con1,localhost,root,,);
--echo $CURRENT_CONNECTION
+connect (con2,localhost,root,,);
+--echo $CURRENT_CONNECTION
connection default;
--echo $CURRENT_CONNECTION
@@ -2197,8 +2232,11 @@ connection default;
connection con1;
--echo $CURRENT_CONNECTION
-let $x= default;
-let $y= con1;
+connection con2;
+--echo $CURRENT_CONNECTION
+
+let $x= con1;
+let $y= con2;
connection $x;
--echo $CURRENT_CONNECTION
@@ -2217,3 +2255,6 @@ disconnect $y;
--echo End of tests
+connection default;
+# Wait till we reached the initial number of concurrent sessions
+--source include/wait_until_count_sessions.inc
diff --git a/mysql-test/t/partition.test b/mysql-test/t/partition.test
index 23a300de9e5..fc6a33819d6 100644
--- a/mysql-test/t/partition.test
+++ b/mysql-test/t/partition.test
@@ -17,6 +17,14 @@ drop table if exists t1, t2;
--enable_warnings
#
+# Bug#36001: Partitions: spelling and using some error messages
+#
+--error ER_FOREIGN_KEY_ON_PARTITIONED
+CREATE TABLE t1 (a INT, FOREIGN KEY (a) REFERENCES t0 (a))
+ENGINE=MyISAM
+PARTITION BY HASH (a);
+
+#
# Bug#40954: Crash if range search and order by.
#
CREATE TABLE t1 (
diff --git a/mysql-test/t/partition_error.test b/mysql-test/t/partition_error.test
index 41b904b876f..49632f95dfb 100644
--- a/mysql-test/t/partition_error.test
+++ b/mysql-test/t/partition_error.test
@@ -1,5 +1,5 @@
#
-# Simple test for the erroneos create statements using the
+# Simple test for the erroneos statements using the
# partition storage engine
#
-- source include/have_partition.inc
@@ -7,6 +7,19 @@
--disable_warnings
drop table if exists t1;
--enable_warnings
+
+#
+# Bug#38719: Partitioning returns a different error code for a
+# duplicate key error
+CREATE TABLE t1 (a INTEGER NOT NULL, PRIMARY KEY (a));
+-- error ER_DUP_ENTRY
+INSERT INTO t1 VALUES (1),(1);
+DROP TABLE t1;
+CREATE TABLE t1 (a INTEGER NOT NULL, PRIMARY KEY (a))
+PARTITION BY KEY (a) PARTITIONS 2;
+-- error ER_DUP_ENTRY
+INSERT INTO t1 VALUES (1),(1);
+DROP TABLE t1;
#
# Bug#31931: Mix of handlers error message
diff --git a/mysql-test/t/ps.test b/mysql-test/t/ps.test
index 91cb6eef8ad..db5994d434b 100644
--- a/mysql-test/t/ps.test
+++ b/mysql-test/t/ps.test
@@ -230,6 +230,10 @@ drop table t1;
# statements or are correctly created and deleted on each execute
#
+--let $outfile=$MYSQLTEST_VARDIR/tmp/f1.txt
+--error 0,1
+--remove_file $outfile
+
prepare stmt1 from "select 1 into @var";
execute stmt1;
execute stmt1;
@@ -240,11 +244,14 @@ execute stmt1;
prepare stmt1 from "insert into t1 select i from t1";
execute stmt1;
execute stmt1;
-prepare stmt1 from "select * from t1 into outfile 'f1.txt'";
+--replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR>
+eval prepare stmt1 from "select * from t1 into outfile '$outfile'";
execute stmt1;
deallocate prepare stmt1;
drop table t1;
+--remove_file $outfile
+
#
# BUG#5242 "Prepared statement names are case sensitive"
#
@@ -939,8 +946,13 @@ set global max_prepared_stmt_count=3;
select @@max_prepared_stmt_count;
show status like 'prepared_stmt_count';
prepare stmt from "select 1";
+
connect (con1,localhost,root,,);
+
+# Switch to connection con1
connection con1;
+let $con1_id=`SELECT CONNECTION_ID()`;
+
prepare stmt from "select 2";
prepare stmt1 from "select 3";
--error ER_MAX_PREPARED_STMT_COUNT_REACHED
@@ -950,18 +962,17 @@ connection default;
prepare stmt2 from "select 4";
select @@max_prepared_stmt_count;
show status like 'prepared_stmt_count';
+
+# Disconnect connection con1 and switch to default connection
disconnect con1;
connection default;
-# Wait for the connection to die: deal with a possible race
+
+# Wait for the connection con1 to die
+let $wait_condition=SELECT COUNT(*)=0 FROM information_schema.processlist WHERE id=$con1_id;
+--source include/wait_condition.inc
+
deallocate prepare stmt;
-let $query= select variable_value from information_schema.global_status
- where variable_name = 'prepared_stmt_count';
-let $count= `$query`;
-if ($count)
-{
---sleep 1
- let $count= `$query`;
-}
+
select @@max_prepared_stmt_count;
show status like 'prepared_stmt_count';
#
diff --git a/mysql-test/t/query_cache_28249.test b/mysql-test/t/query_cache_28249.test
index 3cf6c89369e..390a1ce6e3d 100644
--- a/mysql-test/t/query_cache_28249.test
+++ b/mysql-test/t/query_cache_28249.test
@@ -11,6 +11,7 @@
#
--source include/have_query_cache.inc
+--source include/not_embedded.inc
SET @query_cache_type= @@global.query_cache_type;
SET @query_cache_limit= @@global.query_cache_limit;
diff --git a/mysql-test/t/read_only.test b/mysql-test/t/read_only.test
index 5a498404b03..abc016bafce 100644
--- a/mysql-test/t/read_only.test
+++ b/mysql-test/t/read_only.test
@@ -3,10 +3,12 @@
# should work with embedded server after mysqltest is fixed
--source include/not_embedded.inc
---source include/count_sessions.inc
set @start_read_only= @@global.read_only;
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
+
--disable_warnings
DROP TABLE IF EXISTS t1,t2,t3;
--enable_warnings
@@ -110,7 +112,7 @@ drop table t1;
insert into t1 values(1);
#
-# BUG#11733: COMMITs should not happen if read-only is set
+# Bug#11733 COMMITs should not happen if read-only is set
#
# LOCK TABLE ... WRITE / READ_ONLY
@@ -238,8 +240,9 @@ set global read_only=1;
connection default;
select @@global.read_only;
unlock tables;
+disconnect root2;
-# BUG #22077 "DROP TEMPORARY TABLE fails with wrong error if read_only is set"
+# Bug#22077 DROP TEMPORARY TABLE fails with wrong error if read_only is set
#
# check if DROP TEMPORARY on a non-existing temporary table returns the right
# error
@@ -256,10 +259,12 @@ drop temporary table if exists ttt;
--echo connection default;
connection default;
set global read_only=0;
+disconnect con1;
drop table t1,t2;
drop user test@localhost;
+
--echo #
---echo # Bug #27440 read_only allows create and drop database
+--echo # Bug#27440 read_only allows create and drop database
--echo #
set global read_only= 1;
--disable_warnings
@@ -297,7 +302,7 @@ delete from mysql.columns_priv where User like 'mysqltest_%';
flush privileges;
drop database mysqltest_db1;
set global read_only= @start_read_only;
-disconnect con1;
-disconnect root2;
+
+# Wait till all disconnects are completed
--source include/wait_until_count_sessions.inc
diff --git a/mysql-test/t/select.test b/mysql-test/t/select.test
index ccdb53ec11f..8981ddbe2e4 100644
--- a/mysql-test/t/select.test
+++ b/mysql-test/t/select.test
@@ -3769,4 +3769,20 @@ SELECT date_nokey FROM C
DROP TABLE A,C;
+#
+# Bug #42957: no results from
+# select where .. (col=col and col=col) or ... (false expression)
+#
+CREATE TABLE t1 (a INT NOT NULL, b INT);
+INSERT INTO t1 VALUES (1, 1);
+EXPLAIN EXTENDED SELECT * FROM t1 WHERE (a=a AND a=a) OR b > 2;
+SELECT * FROM t1 WHERE (a=a AND a=a) OR b > 2;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL, c INT NOT NULL);
+EXPLAIN EXTENDED SELECT * FROM t1 WHERE (a=a AND b=b AND c=c) OR b > 20;
+EXPLAIN EXTENDED SELECT * FROM t1 WHERE (a=a AND a=a AND b=b) OR b > 20;
+EXPLAIN EXTENDED SELECT * FROM t1 WHERE (a=a AND b=b AND a=a) OR b > 20;
+DROP TABLE t1;
+
--echo End of 5.1 tests
diff --git a/mysql-test/t/show_check.test b/mysql-test/t/show_check.test
index 116298a9c80..0ce807ae73e 100644
--- a/mysql-test/t/show_check.test
+++ b/mysql-test/t/show_check.test
@@ -5,6 +5,9 @@
# depends on the presence of the log tables (which are CSV-based).
--source include/have_csv.inc
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
+
#
# Test of some show commands
#
@@ -195,7 +198,7 @@ show columns from t1;
drop table t1;
#
-# Test for Bug #2593 "SHOW CREATE TABLE doesn't properly double quotes"
+# Test for Bug#2593 SHOW CREATE TABLE doesn't properly double quotes
#
SET @old_sql_mode= @@sql_mode, sql_mode= '';
@@ -223,7 +226,7 @@ CREATE TABLE """a" (i INT);
SHOW CREATE TABLE """a";
DROP TABLE """a";
-#Bug #4374 SHOW TABLE STATUS FROM ignores collation_connection
+# Bug#4374 SHOW TABLE STATUS FROM ignores collation_connection
#set names latin1;
#create database `ä`;
#create table `ä`.`ä` (a int) engine=heap;
@@ -248,7 +251,7 @@ SET sql_quote_show_create= @old_sql_quote_show_create;
SET sql_mode= @old_sql_mode;
#
-# Test for bug #2719 "Heap tables status shows wrong or missing data."
+# Test for Bug#2719 Heap tables status shows wrong or missing data.
#
select @@max_heap_table_size;
@@ -309,7 +312,7 @@ show table status;
drop table t1, t2, t3;
#
-# Test for bug #3342 SHOW CREATE DATABASE seems to require DROP privilege
+# Test for Bug#3342 SHOW CREATE DATABASE seems to require DROP privilege
#
create database mysqltest;
@@ -324,35 +327,38 @@ connect (con1,localhost,mysqltest_1,,mysqltest);
connection con1;
select * from t1;
show create database mysqltest;
---error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
drop table t1;
---error 1044
+--error ER_DBACCESS_DENIED_ERROR
drop database mysqltest;
+disconnect con1;
connect (con2,localhost,mysqltest_2,,test);
connection con2;
---error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
select * from mysqltest.t1;
---error 1044
+--error ER_DBACCESS_DENIED_ERROR
show create database mysqltest;
---error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
drop table mysqltest.t1;
---error 1044
+--error ER_DBACCESS_DENIED_ERROR
drop database mysqltest;
+disconnect con2;
connect (con3,localhost,mysqltest_3,,test);
connection con3;
---error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
select * from mysqltest.t1;
show create database mysqltest;
drop table mysqltest.t1;
drop database mysqltest;
+disconnect con3;
connection default;
set names binary;
-delete from mysql.user
+delete from mysql.user
where user='mysqltest_1' || user='mysqltest_2' || user='mysqltest_3';
-delete from mysql.db
+delete from mysql.db
where user='mysqltest_1' || user='mysqltest_2' || user='mysqltest_3';
flush privileges;
@@ -366,7 +372,7 @@ flush privileges;
#drop database `ä`;
# Test that USING <keytype> is always shown in SHOW CREATE TABLE when it was
-# specified during table creation, but not otherwise. (Bug #7235)
+# specified during table creation, but not otherwise. (Bug#7235)
CREATE TABLE t1 (i int, KEY (i)) ENGINE=MEMORY;
SHOW CREATE TABLE t1;
DROP TABLE t1;
@@ -397,7 +403,7 @@ ALTER TABLE t1 ENGINE=MEMORY;
SHOW CREATE TABLE t1;
DROP TABLE t1;
-# Test for BUG#9439 "Reporting wrong datatype for sub_part on show index"
+# Test for Bug#9439 Reporting wrong datatype for sub_part on show index
CREATE TABLE t1(
field1 text NOT NULL,
PRIMARY KEY(field1(1000))
@@ -407,7 +413,7 @@ show index from t1;
--disable_metadata
drop table t1;
-# Test for BUG#11635: mysqldump exports TYPE instead of USING for HASH
+# Test for Bug#11635 mysqldump exports TYPE instead of USING for HASH
create table t1 (
c1 int NOT NULL,
c2 int NOT NULL,
@@ -417,7 +423,7 @@ create table t1 (
SHOW CREATE TABLE t1;
DROP TABLE t1;
-# Test for BUG#93: 4.1 protocl crash on corupted frm and SHOW TABLE STATUS
+# Test for Bug#93 4.1 protocl crash on corupted frm and SHOW TABLE STATUS
flush tables;
@@ -426,19 +432,19 @@ let $MYSQLD_DATADIR= `select @@datadir`;
system echo "this is a junk file for test" >> $MYSQLD_DATADIR/test/t1.frm ;
--replace_column 6 # 7 # 8 # 9 #
SHOW TABLE STATUS like 't1';
---error 1033
+--error ER_NOT_FORM_FILE
show create table t1;
drop table if exists t1;
--error 1,0
--remove_file $MYSQLD_DATADIR/test/t1.frm
#
-# BUG 12183 - SHOW OPEN TABLES behavior doesn't match grammar
+# Bug#12183 SHOW OPEN TABLES behavior doesn't match grammar
# First we close all open tables with FLUSH tables and then we open some.
#
--echo
---echo # Bug#12183: SHOW OPEN TABLES behavior doesn't match grammar.
+--echo # Bug#12183 SHOW OPEN TABLES behavior doesn't match grammar.
--echo
# NOTE: SHOW OPEN TABLES does not sort result list by database or table names.
@@ -497,15 +503,15 @@ use test;
--echo
#
-# BUG #12591 (SHOW TABLES FROM dbname produces wrong error message)
+# Bug#12591 SHOW TABLES FROM dbname produces wrong error message
#
---error 1049
+--error ER_BAD_DB_ERROR
SHOW TABLES FROM non_existing_database;
--echo End of 4.1 tests
#
-# Bug#17203: "sql_no_cache sql_cache" in views created from prepared
+# Bug#17203 "sql_no_cache sql_cache" in views created from prepared
# statement
#
# The problem was that initial user setting was forgotten, and current
@@ -585,7 +591,7 @@ SHOW COLUMNS FROM no_such_table;
#
-# Bug #19764: SHOW commands end up in the slow log as table scans
+# Bug#19764 SHOW commands end up in the slow log as table scans
#
flush status;
show status like 'slow_queries';
@@ -597,7 +603,7 @@ select 1 from information_schema.tables limit 1;
show status like 'slow_queries';
create table t1 (a int);
-create trigger tr1 before insert on t1 for each row
+create trigger tr1 before insert on t1 for each row
begin
end;
create view v1 as select a from t1;
@@ -657,9 +663,10 @@ drop table t1;
drop procedure p1;
drop function f1;
drop event e1;
+
#
-# BUG#10491: Server returns data as charset binary SHOW CREATE TABLE or SELECT
-# FROM I_S.
+# Bug#10491 Server returns data as charset binary SHOW CREATE TABLE or SELECT
+# FROM I_S.
#
#
@@ -774,7 +781,7 @@ SHOW TRIGGERS LIKE 't1';
--echo ----------------------------------------------------------------
-SELECT
+SELECT
TRIGGER_CATALOG,
TRIGGER_SCHEMA,
TRIGGER_NAME,
@@ -897,10 +904,12 @@ CREATE TABLE t1(ËÏÌÏÎËÁ1 INT);
# Check:
# - Dump mysqltest1;
+--let $outfile1=$MYSQLTEST_VARDIR/tmp/show_check.mysqltest1.sql
+
--echo
---echo ---> Dumping mysqltest1 to show_check.mysqltest1.sql
+--echo ---> Dumping mysqltest1 to outfile1
---exec $MYSQL_DUMP --default-character-set=latin1 --character-sets-dir=$CHARSETSDIR --databases mysqltest1 > $MYSQLTEST_VARDIR/tmp/show_check.mysqltest1.sql
+--exec $MYSQL_DUMP --default-character-set=latin1 --character-sets-dir=$CHARSETSDIR --databases mysqltest1 > $outfile1
# - Clean mysqltest1;
@@ -915,7 +924,8 @@ DROP DATABASE mysqltest1;
--echo
--echo ---> Restoring mysqltest1...
---exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/show_check.mysqltest1.sql
+--exec $MYSQL test < $outfile1
+--remove_file $outfile1
# - Check definition of the table.
@@ -927,7 +937,7 @@ DROP DATABASE mysqltest1;
use test;
#
-# Bug #28808: log_queries_not_using_indexes variable dynamic change is ignored
+# Bug#28808 log_queries_not_using_indexes variable dynamic change is ignored
#
flush status;
show variables like "log_queries_not_using_indexes";
@@ -943,7 +953,7 @@ select 1 from information_schema.tables limit 1;
show status like 'slow_queries';
#
-# Bug #30088: Can't disable myisam-recover by a value of ""
+# Bug#30088 Can't disable myisam-recover by a value of ""
#
show variables like 'myisam_recover_options';
@@ -974,7 +984,8 @@ SHOW AUTHORS;
--enable_result_log
#
-# Test for bug #9785 SELECT privilege for the whole database is needed to do SHOW CREATE DATABASE
+# Bug#9785 SELECT privilege for the whole database is needed to do
+# SHOW CREATE DATABASE
#
create database mysqltest;
show create database mysqltest;
@@ -990,6 +1001,8 @@ delete from mysql.db where user='mysqltest_4';
delete from mysql.tables_priv where user='mysqltest_4';
flush privileges;
drop database mysqltest;
+connection default;
+disconnect con4;
#
# Ensure that show plugin code is tested
@@ -1005,8 +1018,8 @@ show plugins;
--enable_result_log
#
-# Bug #19874: SHOW COLUMNS and SHOW KEYS handle identifiers containing
-# \ incorrectly
+# Bug#19874 SHOW COLUMNS and SHOW KEYS handle identifiers containing
+# \ incorrectly
#
create database `mysqlttest\1`;
create table `mysqlttest\1`.`a\b` (a int);
@@ -1018,7 +1031,7 @@ drop table `mysqlttest\1`.`a\b`;
drop database `mysqlttest\1`;
#
-# Bug#24392: SHOW ENGINE MUTEX STATUS is a synonym for SHOW INNODB STATUS
+# Bug#24392 SHOW ENGINE MUTEX STATUS is a synonym for SHOW INNODB STATUS
#
--error ER_UNKNOWN_STORAGE_ENGINE
@@ -1104,8 +1117,8 @@ DROP PROCEDURE p1;
DEALLOCATE PREPARE stmt1;
#
-# BUG#10491: Server returns data as charset binary SHOW CREATE TABLE or SELECT
-# FROM INFORMATION_SCHEMA.
+# Bug#10491 Server returns data as charset binary SHOW CREATE TABLE or SELECT
+# FROM INFORMATION_SCHEMA.
#
# Before the change performed to fix the bug, the metadata of the output of
# SHOW CREATE statements would always describe the result as 'binary'. That
@@ -1168,17 +1181,17 @@ DROP TABLE t1;
DROP EVENT ev1;
#
-# Bug #30036: SHOW TABLE TYPES causes the debug client to crash
+# Bug#30036 SHOW TABLE TYPES causes the debug client to crash
#
--disable_result_log
SHOW TABLE TYPES;
--enable_result_log
+
#
-# Bug #32710: SHOW INNODB STATUS requires SUPER
+# Bug#32710 SHOW INNODB STATUS requires SUPER
#
-
CREATE USER test_u@localhost;
GRANT PROCESS ON *.* TO test_u@localhost;
@@ -1195,3 +1208,7 @@ DROP USER test_u@localhost;
--echo End of 5.1 tests
+
+# Wait till all disconnects are completed
+--source include/wait_until_count_sessions.inc
+
diff --git a/mysql-test/t/skip_name_resolve.test b/mysql-test/t/skip_name_resolve.test
index 3f732c8912b..df010d15fa0 100644
--- a/mysql-test/t/skip_name_resolve.test
+++ b/mysql-test/t/skip_name_resolve.test
@@ -1,7 +1,10 @@
# Can't be tested with embedded server
--- source include/not_embedded.inc
+--source include/not_embedded.inc
-# Bug #8471: IP address with mask fail when skip-name-resolve is on
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
+
+# Bug#8471 IP address with mask fail when skip-name-resolve is on
GRANT ALL ON test.* TO mysqltest_1@'127.0.0.1/255.255.255.255';
SHOW GRANTS FOR mysqltest_1@'127.0.0.1/255.255.255.255';
REVOKE ALL ON test.* FROM mysqltest_1@'127.0.0.1/255.255.255.255';
@@ -9,12 +12,20 @@ DROP USER mysqltest_1@'127.0.0.1/255.255.255.255';
# End of 4.1 tests
-# Bug #13407 "Remote connecting crashes server".
+# Bug#13407 Remote connecting crashes server
# Server crashed when one used USER() function in connection for which
# was impossible to obtain peer hostname.
connect (con1, 127.0.0.1, root, , test, $MASTER_MYPORT, );
--replace_column 1 #
-select user();
---replace_column 1 <id> 3 <host> 5 <command> 6 <time> 7 <state> 8 <info>
-show processlist;
+SELECT USER();
+# We are only interested in the fact that statement below doesn't
+# crash server.
+--disable_result_log
+SHOW PROCESSLIST;
+--enable_result_log
connection default;
+disconnect con1;
+
+# Wait till all disconnects are completed
+--source include/wait_until_count_sessions.inc
+
diff --git a/mysql-test/t/sp-security.test b/mysql-test/t/sp-security.test
index b372c05b6e3..a80fe89082a 100644
--- a/mysql-test/t/sp-security.test
+++ b/mysql-test/t/sp-security.test
@@ -5,6 +5,9 @@
# Can't test with embedded server that doesn't support grants
-- source include/not_embedded.inc
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
+
connect (con1root,localhost,root,,);
connection con1root;
@@ -156,7 +159,7 @@ call db1_secret.stamp(6);
select db1_secret.db();
#
-# BUG#2777
+# Bug#2777 Stored procedure doesn't observe definer's rights
#
connection con1root;
@@ -215,7 +218,7 @@ call q();
select * from t2;
#
-# BUG#6030: Stored procedure has no appropriate DROP privilege
+# Bug#6030 Stored procedure has no appropriate DROP privilege
# (or ALTER for that matter)
# still connection con2user1 in db2
@@ -330,7 +333,7 @@ flush privileges;
drop table t1;
#
-# BUG#9503: reseting correct parameters of thread after error in SP function
+# Bug#9503 reseting correct parameters of thread after error in SP function
#
connect (root,localhost,root,,test);
connection root;
@@ -366,10 +369,12 @@ REVOKE ALL PRIVILEGES, GRANT OPTION FROM user1@localhost;
drop function bug_9503;
use test;
drop database mysqltest;
+connection default;
+disconnect root;
#
# correct value from current_user() in function run from "security definer"
-# (BUG#7291)
+# (Bug#7291 Stored procedures: wrong CURRENT_USER value)
#
connection con1root;
use test;
@@ -398,10 +403,10 @@ REVOKE ALL PRIVILEGES, GRANT OPTION FROM user1@localhost;
drop user user1@localhost;
#
-# Bug #12318: Wrong error message when accessing an inaccessible stored
+# Bug#12318 Wrong error message when accessing an inaccessible stored
# procedure in another database when the current database is
# information_schema.
-#
+#
--disable_warnings
drop database if exists mysqltest_1;
@@ -438,7 +443,7 @@ revoke usage on *.* from mysqltest_1@localhost;
drop user mysqltest_1@localhost;
#
-# BUG#12812 create view calling a function works without execute right
+# Bug#12812 create view calling a function works without execute right
# on function
delimiter |;
--disable_warnings
@@ -464,7 +469,7 @@ delimiter ;|
#
-# BUG#14834: Server denies to execute Stored Procedure
+# Bug#14834 Server denies to execute Stored Procedure
#
# The problem here was with '_' in the database name.
#
@@ -507,7 +512,7 @@ drop database db_bug14834;
#
-# BUG#14533: 'desc tbl' in stored procedure causes error
+# Bug#14533 'desc tbl' in stored procedure causes error
# ER_TABLEACCESS_DENIED_ERROR
#
create database db_bug14533;
@@ -546,7 +551,7 @@ drop database db_bug14533;
#
-# WL#2897: Complete definer support in the stored routines.
+# WL#2897 Complete definer support in the stored routines.
#
# The following cases are tested:
# 1. check that if DEFINER-clause is not explicitly specified, stored routines
@@ -591,7 +596,7 @@ GRANT ALL PRIVILEGES ON mysqltest.* TO mysqltest_2@localhost;
--echo ---> connection: mysqltest_2_con
--connection mysqltest_2_con
-use mysqltest;
+USE mysqltest;
CREATE PROCEDURE wl2897_p1() SELECT 1;
@@ -603,7 +608,7 @@ CREATE FUNCTION wl2897_f1() RETURNS INT RETURN 1;
--echo ---> connection: mysqltest_1_con
--connection mysqltest_1_con
-use mysqltest;
+USE mysqltest;
--error ER_SPECIFIC_ACCESS_DENIED_ERROR
CREATE DEFINER=root@localhost PROCEDURE wl2897_p2() SELECT 2;
@@ -629,7 +634,7 @@ CREATE DEFINER='a @ b @ c'@localhost FUNCTION wl2897_f3() RETURNS INT RETURN 3;
--echo ---> connection: con1root
--connection con1root
-use mysqltest;
+USE mysqltest;
SHOW CREATE PROCEDURE wl2897_p1;
SHOW CREATE PROCEDURE wl2897_p3;
@@ -649,7 +654,7 @@ DROP DATABASE mysqltest;
#
-# BUG#13198: SP executes if definer does not exist
+# Bug#13198 SP executes if definer does not exist
#
# Prepare environment.
@@ -679,7 +684,7 @@ GRANT ALL PRIVILEGES ON mysqltest.* TO mysqltest_2@localhost;
--echo ---> connection: mysqltest_1_con
--connection mysqltest_1_con
-use mysqltest;
+USE mysqltest;
CREATE PROCEDURE bug13198_p1()
SELECT 1;
@@ -697,7 +702,7 @@ SELECT bug13198_f1();
--echo ---> connection: mysqltest_2_con
--connection mysqltest_2_con
-use mysqltest;
+USE mysqltest;
CALL bug13198_p1();
@@ -719,7 +724,7 @@ DROP USER mysqltest_1@localhost;
--echo ---> connection: mysqltest_2_con
--connection mysqltest_2_con
-use mysqltest;
+USE mysqltest;
--error ER_NO_SUCH_USER
CALL bug13198_p1();
@@ -740,8 +745,8 @@ DROP USER mysqltest_2@localhost;
DROP DATABASE mysqltest;
#
-# Bug#19857 - When a user with CREATE ROUTINE priv creates a routine,
-# it results in NULL p/w
+# Bug#19857 When a user with CREATE ROUTINE priv creates a routine,
+# it results in NULL p/w
#
# Can't test with embedded server that doesn't support grants
@@ -756,7 +761,7 @@ SELECT Host,User,Password FROM mysql.user WHERE User='user19857';
--echo ---> connection: mysqltest_2_con
--connection mysqltest_2_con
-use test;
+USE test;
DELIMITER //;
CREATE PROCEDURE sp19857() DETERMINISTIC
@@ -790,8 +795,7 @@ DROP USER user19857@localhost;
use test;
#
-# BUG#18630: Arguments of suid routine calculated in wrong security
-# context
+# Bug#18630 Arguments of suid routine calculated in wrong security context
#
# Arguments of suid routines were calculated in definer's security
# context instead of caller's context thus creating security hole.
@@ -862,3 +866,7 @@ DROP FUNCTION f_suid;
DROP TABLE t1;
--echo End of 5.0 tests.
+
+# Wait till all disconnects are completed
+--source include/wait_until_count_sessions.inc
+
diff --git a/mysql-test/t/sp_notembedded.test b/mysql-test/t/sp_notembedded.test
index 16ebb710f25..f540126c405 100644
--- a/mysql-test/t/sp_notembedded.test
+++ b/mysql-test/t/sp_notembedded.test
@@ -4,13 +4,17 @@
set @old_concurrent_insert= @@global.concurrent_insert;
set @@global.concurrent_insert= 0;
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
+
--disable_warnings
drop table if exists t1,t3;
--enable_warnings
delimiter |;
+
#
-# BUG#4902: Stored procedure with SHOW WARNINGS leads to packet error
+# Bug#4902 Stored procedure with SHOW WARNINGS leads to packet error
#
# Added tests for show grants command
--disable_warnings
@@ -52,15 +56,14 @@ show warnings|
drop procedure bug4902_2|
#
-# BUG#3583: query cache doesn't work for stored procedures
+# Bug#3583 query cache doesn't work for stored procedures
#
-
--disable_warnings
drop table if exists t1|
--enable_warnings
create table t1 (
- id char(16) not null default '',
- data int not null
+ id char(16) not null default '',
+ data int not null
)|
--disable_warnings
drop procedure if exists bug3583|
@@ -97,8 +100,9 @@ delete from t1|
drop procedure bug3583|
drop table t1|
+
#
-# BUG#6807: Stored procedure crash if CREATE PROCEDURE ... KILL QUERY
+# Bug#6807 Stored procedure crash if CREATE PROCEDURE ... KILL QUERY
#
--disable_warnings
drop procedure if exists bug6807|
@@ -112,16 +116,16 @@ begin
select 'Not reached';
end|
---error 1317
+--error ER_QUERY_INTERRUPTED
call bug6807()|
---error 1317
+--error ER_QUERY_INTERRUPTED
call bug6807()|
drop procedure bug6807|
#
-# BUG#10100: function (and stored procedure?) recursivity problem
+# Bug#10100 function (and stored procedure?) recursivity problem
#
--disable_warnings
drop function if exists bug10100f|
@@ -220,11 +224,11 @@ begin
close c;
end|
-#end of the stack checking
+# end of the stack checking
set @@max_sp_recursion_depth=255|
set @var=1|
-#disable log because error about stack overrun contains numbers which
-#depend on a system
+# disable log because error about stack overrun contains numbers which
+# depend on a system
-- disable_result_log
-- error ER_STACK_OVERRUN_NEED_MORE
call bug10100p(255, @var)|
@@ -253,6 +257,7 @@ drop table t3|
delimiter ;|
+
#
# Bug#15298 SHOW GRANTS FOR CURRENT_USER: Incorrect output in DEFINER context
#
@@ -269,6 +274,7 @@ call 15298_1();
call 15298_2();
connection default;
+disconnect con1;
drop user mysqltest_1@localhost;
drop procedure 15298_1;
drop procedure 15298_2;
@@ -334,6 +340,7 @@ connection default;
disconnect rl_holder;
disconnect rl_acquirer;
disconnect rl_wait;
+disconnect rl_contender;
drop procedure p1;
drop table t1;
set session low_priority_updates=default;
@@ -343,3 +350,7 @@ set session low_priority_updates=default;
#
set @@global.concurrent_insert= @old_concurrent_insert;
+
+# Wait till all disconnects are completed
+--source include/wait_until_count_sessions.inc
+
diff --git a/mysql-test/t/ssl-big.test b/mysql-test/t/ssl-big.test
index 099c64df08f..91103f1d782 100644
--- a/mysql-test/t/ssl-big.test
+++ b/mysql-test/t/ssl-big.test
@@ -4,12 +4,15 @@
-- source include/have_ssl.inc
-- source include/big_test.inc
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
+
--disable_warnings
DROP TABLE IF EXISTS t1, t2;
--enable_warnings
#
-# Bug #29579 Clients using SSL can hang the server
+# Bug#29579 Clients using SSL can hang the server
#
connect (ssl_con,localhost,root,,,,,SSL);
@@ -18,7 +21,7 @@ create table t1 (a int);
disconnect ssl_con;
-
+
--disable_query_log
--disable_result_log
@@ -26,31 +29,36 @@ let $count= 2000;
while ($count)
{
connect (ssl_con,localhost,root,,,,,SSL);
-
+
eval insert into t1 values ($count);
dec $count;
-
- # This select causes the net buffer to fill as the server sends the results
+
+ # This select causes the net buffer to fill as the server sends the results
# but the client doesn't reap the results. The results are larger each time
# through the loop, so that eventually the buffer is completely full
# at the exact moment the server attempts to the close the connection with
# the lock held.
send select * from t1;
-
+
# now send the quit the command so the server will initiate the shutdown.
- send_quit ssl_con;
-
+ send_quit ssl_con;
+
# if the server is hung, this will hang too:
connect (ssl_con2,localhost,root,,,,,SSL);
-
+
# no hang if we get here, close and retry
disconnect ssl_con2;
disconnect ssl_con;
-}
+}
--enable_query_log
--enable_result_log
connect (ssl_con,localhost,root,,,,,SSL);
drop table t1;
+connection default;
+disconnect ssl_con;
+
+# Wait till all disconnects are completed
+--source include/wait_until_count_sessions.inc
diff --git a/mysql-test/t/ssl.test b/mysql-test/t/ssl.test
index a15f0212fbd..936652eaa3d 100644
--- a/mysql-test/t/ssl.test
+++ b/mysql-test/t/ssl.test
@@ -3,6 +3,9 @@
-- source include/have_ssl.inc
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
+
connect (ssl_con,localhost,root,,,,,SSL);
# Check ssl turned on
@@ -14,4 +17,9 @@ SHOW STATUS LIKE 'Ssl_cipher';
# Check ssl turned on
SHOW STATUS LIKE 'Ssl_cipher';
+connection default;
+disconnect ssl_con;
+
+# Wait till all disconnects are completed
+--source include/wait_until_count_sessions.inc
diff --git a/mysql-test/t/ssl_compress.test b/mysql-test/t/ssl_compress.test
index 23051c0e367..b6e11621bf6 100644
--- a/mysql-test/t/ssl_compress.test
+++ b/mysql-test/t/ssl_compress.test
@@ -4,6 +4,9 @@
-- source include/have_ssl.inc
-- source include/have_compress.inc
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
+
connect (ssl_compress_con,localhost,root,,,,,SSL COMPRESS);
# Check ssl turned on
@@ -20,3 +23,10 @@ SHOW STATUS LIKE 'Ssl_cipher';
# Check compression turned on
SHOW STATUS LIKE 'Compression';
+
+connection default;
+disconnect ssl_compress_con;
+
+# Wait till all disconnects are completed
+--source include/wait_until_count_sessions.inc
+
diff --git a/mysql-test/t/status.test b/mysql-test/t/status.test
index 69ae56ff9a2..5842f59af5c 100644
--- a/mysql-test/t/status.test
+++ b/mysql-test/t/status.test
@@ -268,6 +268,7 @@ show status like 'Com%function';
#
connect (root, localhost, root,,test);
connection root;
+let $root_connection_id= `select connection_id()`;
--disable_warnings
create database db37908;
--enable_warnings
@@ -282,6 +283,7 @@ delimiter ;|
connect (user1,localhost,mysqltest_1,,test);
connection user1;
+let $user1_connection_id= `select connection_id()`;
--error ER_TABLEACCESS_DENIED_ERROR
select * from db37908.t1;
@@ -300,8 +302,12 @@ drop procedure proc37908;
drop function func37908;
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_1@localhost;
DROP USER mysqltest_1@localhost;
-# Wait till we reached the initial number of concurrent sessions
---source include/wait_until_count_sessions.inc
+# Wait till the sessions user1 and root are disconnected
+let $wait_condition =
+ SELECT COUNT(*) = 0
+ FROM information_schema.processlist
+ WHERE id in ('$root_connection_id','$user1_connection_id');
+--source include/wait_condition.inc
#
# Bug#41131 "Questions" fails to increment - ignores statements instead stored procs
diff --git a/mysql-test/t/strict.test b/mysql-test/t/strict.test
index f2ce045840c..5779ea97bc2 100644
--- a/mysql-test/t/strict.test
+++ b/mysql-test/t/strict.test
@@ -1163,11 +1163,11 @@ set @@sql_mode= @org_mode;
# Bug #13934 Silent truncation of table comments
#
set @@sql_mode='traditional';
---error 1105
+--error ER_TOO_LONG_TABLE_COMMENT
create table t1 (i int)
comment '123456789*123456789*123456789*123456789*123456789*
123456789*123456789*123456789*123456789*123456789*';
---error 1105
+--error ER_TOO_LONG_FIELD_COMMENT
create table t1 (
i int comment
'123456789*123456789*123456789*123456789*
diff --git a/mysql-test/t/trigger-compat.test b/mysql-test/t/trigger-compat.test
index bf119cd89e6..2cc86692d0d 100644
--- a/mysql-test/t/trigger-compat.test
+++ b/mysql-test/t/trigger-compat.test
@@ -49,9 +49,7 @@ GRANT CREATE, TRIGGER ON mysqltest_db1.* TO mysqltest_dfn@localhost;
CREATE TABLE t1(num_value INT);
CREATE TABLE t2(user_str TEXT);
-CREATE TRIGGER wl2818_trg1 BEFORE INSERT ON t1
- FOR EACH ROW
- INSERT INTO t2 VALUES(CURRENT_USER());
+CREATE TRIGGER wl2818_trg1 BEFORE INSERT ON t1 FOR EACH ROW INSERT INTO t2 VALUES(CURRENT_USER());
#
# Remove definers from TRG file.
@@ -60,9 +58,24 @@ CREATE TRIGGER wl2818_trg1 BEFORE INSERT ON t1
--echo
--echo ---> patching t1.TRG...
-let $MYSQLD_DATADIR= `select @@datadir`;
---exec grep -v 'definers=' $MYSQLD_DATADIR/mysqltest_db1/t1.TRG > $MYSQLTEST_VARDIR/tmp/t1.TRG
---exec mv $MYSQLTEST_VARDIR/tmp/t1.TRG $MYSQLD_DATADIR/mysqltest_db1/t1.TRG
+# Here we remove definers. This is somewhat complex than the original test
+# Previously, the test only used grep -v 'definers=' t1.TRG, but grep is not
+# portable and we have to load the file into a table, exclude the definers line,
+# then load the data to an outfile to accomplish the same effect
+
+--disable_query_log
+--connection default
+CREATE TABLE patch (a blob);
+let $MYSQLD_DATADIR = `select @@datadir`;
+eval LOAD DATA LOCAL INFILE '$MYSQLD_DATADIR/mysqltest_db1/t1.TRG' INTO TABLE patch;
+# remove original t1.TRG file so SELECT INTO OUTFILE won't fail
+--remove_file $MYSQLD_DATADIR/mysqltest_db1/t1.TRG
+eval SELECT SUBSTRING_INDEX(a,'definers=',1) INTO OUTFILE
+ '$MYSQLD_DATADIR/mysqltest_db1/t1.TRG'
+FROM patch;
+DROP TABLE patch;
+--connection wl2818_definer_con
+--enable_query_log
#
# Create a new trigger.
diff --git a/mysql-test/t/type_bit_innodb.test b/mysql-test/t/type_bit_innodb.test
index 85c9127b2f6..e7e66da8927 100644
--- a/mysql-test/t/type_bit_innodb.test
+++ b/mysql-test/t/type_bit_innodb.test
@@ -40,6 +40,8 @@ drop table t1;
create table t1 (a bit) engine=innodb;
insert into t1 values (b'0'), (b'1'), (b'000'), (b'100'), (b'001');
select hex(a) from t1;
+# It is not deterministic which duplicate will be seen first
+--replace_regex /(.*Duplicate entry )'.*'( for key.*)/\1''\2/
--error ER_DUP_ENTRY
alter table t1 add unique (a);
drop table t1;
diff --git a/mysql-test/t/user_limits.test b/mysql-test/t/user_limits.test
index af0f6545ac4..41af032b97e 100644
--- a/mysql-test/t/user_limits.test
+++ b/mysql-test/t/user_limits.test
@@ -3,9 +3,12 @@
#
# Requires privileges to be enabled
--- source include/not_embedded.inc
+--source include/not_embedded.inc
-# Prepare play-ground
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
+
+# Prepare play-ground
--disable_warnings
drop table if exists t1;
--enable_warnings
@@ -28,11 +31,11 @@ connect (mqph, localhost, mysqltest_1,,);
connection mqph;
select * from t1;
select * from t1;
---error 1226
+--error ER_USER_LIMIT_REACHED
select * from t1;
connect (mqph2, localhost, mysqltest_1,,);
connection mqph2;
---error 1226
+--error ER_USER_LIMIT_REACHED
select * from t1;
# cleanup
connection default;
@@ -50,12 +53,12 @@ select * from t1;
select * from t1;
delete from t1;
delete from t1;
---error 1226
+--error ER_USER_LIMIT_REACHED
delete from t1;
select * from t1;
connect (muph2, localhost, mysqltest_1,,);
connection muph2;
---error 1226
+--error ER_USER_LIMIT_REACHED
delete from t1;
select * from t1;
# Cleanup
@@ -74,7 +77,7 @@ connect (mcph2, localhost, mysqltest_1,,);
connection mcph2;
select * from t1;
--replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK
---error 1226
+--error ER_USER_LIMIT_REACHED
connect (mcph3, localhost, mysqltest_1,,);
# Old connection is still ok
select * from t1;
@@ -83,7 +86,7 @@ select * from t1;
disconnect mcph1;
disconnect mcph2;
--replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK
---error 1226
+--error ER_USER_LIMIT_REACHED
connect (mcph3, localhost, mysqltest_1,,);
# Cleanup
connection default;
@@ -101,13 +104,13 @@ connect (muc2, localhost, mysqltest_1,,);
connection muc2;
select * from t1;
--replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK
---error 1226
+--error ER_USER_LIMIT_REACHED
connect (muc3, localhost, mysqltest_1,,);
# Closing of one of connections should help
disconnect muc1;
connect (muc3, localhost, mysqltest_1,,);
select * from t1;
-# Changing of limit should also help (and immediately)
+# Changing of limit should also help (and immediately)
connection default;
grant usage on *.* to mysqltest_1@localhost with max_user_connections 3;
flush user_resources;
@@ -115,7 +118,7 @@ connect (muc4, localhost, mysqltest_1,,);
connection muc4;
select * from t1;
--replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK
---error 1226
+--error ER_USER_LIMIT_REACHED
connect (muc5, localhost, mysqltest_1,,);
# Clean up
connection default;
@@ -129,10 +132,10 @@ drop user mysqltest_1@localhost;
select @@session.max_user_connections, @@global.max_user_connections;
# Local max_user_connections variable can't be set directly
# since this limit is per-account
---error 1229
-set session max_user_connections= 2;
+--error ER_GLOBAL_VARIABLE
+set session max_user_connections= 2;
# But it is ok to set global max_user_connections
-set global max_user_connections= 2;
+set global max_user_connections= 2;
select @@session.max_user_connections, @@global.max_user_connections;
# Let us check that global limit works
grant usage on *.* to mysqltest_1@localhost;
@@ -144,7 +147,7 @@ connect (muca2, localhost, mysqltest_1,,);
connection muca2;
select * from t1;
--replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK
---error 1203
+--error ER_TOO_MANY_USER_CONNECTIONS
connect (muca3, localhost, mysqltest_1,,);
# Now we are testing that per-account limit prevails over gloabl limit
connection default;
@@ -154,16 +157,20 @@ connect (muca3, localhost, mysqltest_1,,);
connection muca3;
select @@session.max_user_connections, @@global.max_user_connections;
--replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK
---error 1226
+--error ER_USER_LIMIT_REACHED
connect (muca4, localhost, mysqltest_1,,);
# Cleanup
connection default;
disconnect muca1;
disconnect muca2;
disconnect muca3;
-set global max_user_connections= 0;
+set global max_user_connections= 0;
drop user mysqltest_1@localhost;
--enable_ps_protocol
# Final cleanup
drop table t1;
+
+# Wait till all disconnects are completed
+--source include/wait_until_count_sessions.inc
+
diff --git a/mysql-test/t/variables.test b/mysql-test/t/variables.test
index a54ac497c4c..6da20409639 100644
--- a/mysql-test/t/variables.test
+++ b/mysql-test/t/variables.test
@@ -36,6 +36,7 @@ set @my_slow_launch_time =@@global.slow_launch_time;
set @my_storage_engine =@@global.storage_engine;
set @my_thread_cache_size =@@global.thread_cache_size;
set @my_max_allowed_packet =@@global.max_allowed_packet;
+set @my_join_buffer_size =@@global.join_buffer_size;
# case insensitivity tests (new in 5.0)
set @`test`=1;
select @test, @`test`, @TEST, @`TEST`, @"teSt";
@@ -173,21 +174,63 @@ select @@timestamp>0;
set @@rand_seed1=10000000,@@rand_seed2=1000000;
select ROUND(RAND(),5);
-show variables like '%alloc%';
-select * from information_schema.session_variables where variable_name like '%alloc%' order by 1;
-set @@range_alloc_block_size=1024*16;
+
+--echo
+--echo ==+ Testing %alloc% system variables +==
+--echo ==+ NOTE: These values *must* be a multiple of 1024 +==
+--echo ==+ Other values will be rounded down to nearest multiple +==
+--echo
+--echo ==+ Show initial values +==
+SHOW VARIABLES WHERE variable_name IN ('range_alloc_block_size',
+'query_alloc_block_size', 'query_prealloc_size',
+'transaction_alloc_block_size', 'transaction_prealloc_size');
+
+--echo ==+ information_schema data +==
+SELECT * FROM information_schema.session_variables
+WHERE variable_name IN ('range_alloc_block_size',
+'query_alloc_block_size', 'query_prealloc_size',
+'transaction_alloc_block_size', 'transaction_prealloc_size') ORDER BY 1;
+--echo Testing values that are multiples of 1024
+set @@range_alloc_block_size=1024*15+1024;
+set @@query_alloc_block_size=1024*15+1024*2;
+set @@query_prealloc_size=1024*18-1024;
+set @@transaction_alloc_block_size=1024*21-1024*1;
+set @@transaction_prealloc_size=1024*21-2048;
+--echo ==+ Check manipulated values ==+
+select @@query_alloc_block_size;
+SHOW VARIABLES WHERE variable_name IN ('range_alloc_block_size',
+'query_alloc_block_size', 'query_prealloc_size',
+'transaction_alloc_block_size', 'transaction_prealloc_size');
+--echo ==+ information_schema data +==
+SELECT * FROM information_schema.session_variables
+WHERE variable_name IN ('range_alloc_block_size',
+'query_alloc_block_size', 'query_prealloc_size',
+'transaction_alloc_block_size', 'transaction_prealloc_size') ORDER BY 1;
+--echo ==+ Manipulate variable values +==
+--echo Testing values that are not 1024 multiples
+set @@range_alloc_block_size=1024*16+1023;
set @@query_alloc_block_size=1024*17+2;
-set @@query_prealloc_size=1024*18;
+set @@query_prealloc_size=1024*18-1023;
set @@transaction_alloc_block_size=1024*20-1;
set @@transaction_prealloc_size=1024*21-1;
select @@query_alloc_block_size;
-show variables like '%alloc%';
-select * from information_schema.session_variables where variable_name like '%alloc%' order by 1;
+--echo ==+ Check manipulated values ==+
+SHOW VARIABLES WHERE variable_name IN ('range_alloc_block_size',
+'query_alloc_block_size', 'query_prealloc_size',
+'transaction_alloc_block_size', 'transaction_prealloc_size');
+--echo ==+ information_schema data +==
+SELECT * FROM information_schema.session_variables
+WHERE variable_name IN ('range_alloc_block_size',
+'query_alloc_block_size', 'query_prealloc_size',
+'transaction_alloc_block_size', 'transaction_prealloc_size') ORDER BY 1;
+--echo ==+ Set values back to the default values +==
set @@range_alloc_block_size=default;
set @@query_alloc_block_size=default, @@query_prealloc_size=default;
set transaction_alloc_block_size=default, @@transaction_prealloc_size=default;
-show variables like '%alloc%';
-select * from information_schema.session_variables where variable_name like '%alloc%' order by 1;
+--echo ==+ Check the values now that they are reset +==
+SHOW VARIABLES WHERE variable_name IN ('range_alloc_block_size',
+'query_alloc_block_size', 'query_prealloc_size',
+'transaction_alloc_block_size', 'transaction_prealloc_size');
#
# Bug #10904 Illegal mix of collations between
@@ -605,12 +648,14 @@ set @@global.error_count=1;
# Bug #10351: Setting ulong variable to > MAX_ULONG fails on 32-bit platform
#
+--disable_warnings
set @@max_heap_table_size= 4294967296;
select @@max_heap_table_size > 0;
set global max_heap_table_size= 4294967296;
select @@max_heap_table_size > 0;
set @@max_heap_table_size= 4294967296;
select @@max_heap_table_size > 0;
+--enable_warnings
#
# Bug #11775 Variable character_set_system does not exist (sometimes)
@@ -736,6 +781,18 @@ show variables like 'hostname';
--echo End of 5.0 tests
+#
+# Bug#36446: Attempt to set @@join_buffer_size to its minimum value
+# produces spurious warning
+#
+
+# set to 1 so mysqld will correct to minimum (+ warn)
+set join_buffer_size=1;
+# save minimum
+set @save_join_buffer_size=@@join_buffer_size;
+# set minimum
+set join_buffer_size=@save_join_buffer_size;
+
# This is at the very after the versioned tests, since it involves doing
# cleanup
#
@@ -772,6 +829,8 @@ set global slow_launch_time =@my_slow_launch_time;
set global storage_engine =@my_storage_engine;
set global thread_cache_size =@my_thread_cache_size;
set global max_allowed_packet =@my_max_allowed_packet;
+set global join_buffer_size =@my_join_buffer_size;
+
#
# Bug#28580 Repeatation of status variables
#
@@ -1079,3 +1138,67 @@ SET @@session.thread_stack= 7;
--error ER_INCORRECT_GLOBAL_LOCAL_VAR
SET @@global.thread_stack= 7;
#
+
+#
+# Bug #40657 - assertion with out of range variables and traditional sql_mode
+#
+
+SELECT @@global.expire_logs_days INTO @old_eld;
+
+SET GLOBAL expire_logs_days = -1;
+--echo needs to've been adjusted (0)
+SELECT @@global.expire_logs_days;
+
+SET GLOBAL expire_logs_days = 11;
+SET @old_mode=@@sql_mode;
+SET SESSION sql_mode = 'TRADITIONAL';
+--error ER_WRONG_VALUE_FOR_VAR
+SET GLOBAL expire_logs_days = 100;
+--echo needs to be unchanged (11)
+SELECT @@global.expire_logs_days;
+SET SESSION sql_mode = @old_mode;
+
+SET GLOBAL expire_logs_days = 100;
+--echo needs to've been adjusted (99)
+SELECT @@global.expire_logs_days;
+
+SET GLOBAL expire_logs_days = 11;
+SET GLOBAL expire_logs_days = 99;
+--echo needs to pass with no warnings (99)
+SELECT @@global.expire_logs_days;
+
+# cleanup
+SET GLOBAL expire_logs_days = @old_eld;
+
+# show that warning uses underscore (sysvar-name), not hyphens (option-name)
+SET GLOBAL auto_increment_offset=-1;
+SET GLOBAL auto_increment_offset=0;
+
+
+
+#
+# Bug#41030 Wrong meta data (incorrect fieldlen)
+#
+
+--enable_metadata
+select @@storage_engine;
+--disable_metadata
+
+#
+# Bug#36540: CREATE EVENT and ALTER EVENT statements fail with large server_id
+#
+
+SET @old_server_id = @@GLOBAL.server_id;
+SET GLOBAL server_id = (1 << 32) - 1;
+SELECT @@GLOBAL.server_id;
+SET GLOBAL server_id = (1 << 32);
+SELECT @@GLOBAL.server_id;
+SET GLOBAL server_id = (1 << 60);
+SELECT @@GLOBAL.server_id;
+SET GLOBAL server_id = 0;
+SELECT @@GLOBAL.server_id;
+SET GLOBAL server_id = -1;
+SELECT @@GLOBAL.server_id;
+SET GLOBAL server_id = @old_server_id;
+
+--echo End of 5.1 tests
diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test
index 9e22006ea67..c9d01266e9e 100644
--- a/mysql-test/t/view.test
+++ b/mysql-test/t/view.test
@@ -10,12 +10,12 @@ use test;
#
# create view on nonexistent table
--- error 1146
+-- error ER_NO_SUCH_TABLE
create view v1 (c,d) as select a,b from t1;
create temporary table t1 (a int, b int);
# view on temporary table
--- error 1352
+-- error ER_VIEW_SELECT_TMPTABLE
create view v1 (c) as select b+1 from t1;
drop table t1;
@@ -42,18 +42,18 @@ select * from t1;
select c from v1;
show create table v1;
show create view v1;
--- error 1347
+-- error ER_WRONG_OBJECT
show create view t1;
drop table t1;
# try to use fields from underlying table
--- error 1054
+-- error ER_BAD_FIELD_ERROR
select a from v1;
--- error 1054
+-- error ER_BAD_FIELD_ERROR
select v1.a from v1;
--- error 1054
+-- error ER_BAD_FIELD_ERROR
select b from v1;
--- error 1054
+-- error ER_BAD_FIELD_ERROR
select v1.b from v1;
# view with different algorithms (explain output differs)
@@ -64,9 +64,9 @@ select c from v2;
explain extended select c from v2;
# try to use underlying table fields in VIEW creation process
--- error 1054
+-- error ER_BAD_FIELD_ERROR
create view v3 (c) as select a+1 from v1;
--- error 1054
+-- error ER_BAD_FIELD_ERROR
create view v3 (c) as select b+1 from v1;
@@ -104,7 +104,7 @@ select * from v1;
select * from v2;
# try to create VIEW with name of existing VIEW
--- error 1050
+-- error ER_TABLE_EXISTS_ERROR
create view v1 (c,d,e,f) as select a,b, a in (select a+2 from t1), a = all (select a from t1) from t1;
# 'or replace' should work in this case
@@ -112,7 +112,7 @@ create or replace view v1 (c,d,e,f) as select a,b, a in (select a+2 from t1), a
# try to ALTER unexisting VIEW
drop view v2;
--- error 1146
+-- error ER_NO_SUCH_TABLE
alter view v2 as select c, d from v1;
# 'or replace' on unexisting view
@@ -126,15 +126,15 @@ select * from v1;
select * from v2;
# try to drop nonexistent VIEW
--- error 1051
+-- error ER_BAD_TABLE_ERROR
drop view v100;
# try to drop table with DROP VIEW
--- error 1347
+-- error ER_WRONG_OBJECT
drop view t1;
# try to drop VIEW with DROP TABLE
--- error 1051
+-- error ER_BAD_TABLE_ERROR
drop table v1;
# try to drop table with DROP VIEW
@@ -175,7 +175,7 @@ drop table t1;
# syntax compatibility
#
create table t1 (a int);
--- error 1368
+-- error ER_VIEW_NONUPD_CHECK
create view v1 as select distinct a from t1 WITH CHECK OPTION;
create view v1 as select a from t1 WITH CHECK OPTION;
create view v2 as select a from t1 WITH CASCADED CHECK OPTION;
@@ -232,10 +232,10 @@ create algorithm=temptable view v2 (a,c) as select a, b+1 from t1;
select is_updatable from information_schema.views where table_name='v2';
select is_updatable from information_schema.views where table_name='v1';
# try to update expression
--- error 1348
+-- error ER_NONUPDATEABLE_COLUMN
update v1 set c=a+c;
# try to update VIEW with forced TEMPORARY TABLE algorithm
--- error 1288
+-- error ER_NON_UPDATABLE_TABLE
update v2 set a=a+c;
# updatable field of updateable view
update v1 set a=a+c;
@@ -254,10 +254,10 @@ insert into t2 values (10), (20);
create view v1 (a,c) as select a, b+1 from t1;
create algorithm=temptable view v2 (a,c) as select a, b+1 from t1;
# try to update expression
--- error 1348
+-- error ER_NONUPDATEABLE_COLUMN
update t2,v1 set v1.c=v1.a+v1.c where t2.x=v1.a;
# try to update VIEW with forced TEMPORARY TABLE algorithm
--- error 1288
+-- error ER_NON_UPDATABLE_TABLE
update t2,v2 set v2.a=v2.v2.a+c where t2.x=v2.a;
# updatable field of updateable view
update t2,v1 set v1.a=v1.a+v1.c where t2.x=v1.a;
@@ -292,7 +292,7 @@ insert into t1 values (1,2), (2,3), (3,4), (4,5), (5,10);
create view v1 (a,c) as select a, b+1 from t1;
create algorithm=temptable view v2 (a,c) as select a, b+1 from t1;
# try to update VIEW with forced TEMPORARY TABLE algorithm
--- error 1288
+-- error ER_NON_UPDATABLE_TABLE
delete from v2 where c < 4;
# updatable field of updateable view
delete from v1 where c < 4;
@@ -311,7 +311,7 @@ insert into t2 values (1), (2), (3), (4);
create view v1 (a,c) as select a, b+1 from t1;
create algorithm=temptable view v2 (a,c) as select a, b+1 from t1;
# try to update VIEW with forced TEMPORARY TABLE algorithm
--- error 1288
+-- error ER_NON_UPDATABLE_TABLE
delete v2 from t2,v2 where t2.x=v2.a;
# updatable field of updateable view
delete v1 from t2,v1 where t2.x=v1.a;
@@ -331,7 +331,7 @@ set updatable_views_with_limit=NO;
update v1 set x=x+1;
update v2 set x=x+1;
update v1 set x=x+1 limit 1;
--- error 1288
+-- error ER_NON_UPDATABLE_TABLE
update v2 set x=x+1 limit 1;
set updatable_views_with_limit=YES;
update v1 set x=x+1 limit 1;
@@ -424,7 +424,7 @@ create table t1 (a int, primary key(a));
insert into t1 values (1), (2), (3), (200);
create ALGORITHM=TEMPTABLE view v1 (x) as select a from t1;
create view v2 (y) as select x from v1;
--- error 1288
+-- error ER_NON_UPDATABLE_TABLE
update v2 set y=10 where y=2;
drop table t1;
drop view v1,v2;
@@ -479,17 +479,17 @@ create table t1 (col1 char(5),col2 char(5));
create view v1 as select * from t1;
drop table t1;
create table t1 (col1 char(5),newcol2 char(5));
--- error 1356
+-- error ER_VIEW_INVALID
insert into v1 values('a','aa');
drop table t1;
--- error 1356
+-- error ER_VIEW_INVALID
select * from v1;
drop view v1;
#
# check of duplication of column names
#
--- error 1060
+-- error ER_DUP_FIELDNAME
create view v1 (a,a) as select 'a','a';
#
@@ -559,7 +559,7 @@ drop table t1;
#
# error on preparation
#
--- error 1096
+-- error ER_NO_TABLES_USED
CREATE VIEW v02 AS SELECT * FROM DUAL;
SHOW TABLES;
@@ -575,7 +575,7 @@ drop view v1;
#
create table t1 (col1 int,col2 char(22));
create view v1 as select * from t1;
--- error 1347
+-- error ER_WRONG_OBJECT
create index i1 on v1 (col1);
drop view v1;
drop table t1;
@@ -735,7 +735,7 @@ create function x1 () returns int return 5;
create table t1 (s1 int);
create view v1 as select x1() from t1;
drop function x1;
--- error 1356
+-- error ER_VIEW_INVALID
select * from v1;
--replace_column 8 # 12 # 13 #
show table status;
@@ -794,10 +794,10 @@ create table t1 (a int);
create view v1 as select a from t1;
create view v3 as select a from t1;
create database mysqltest;
--- error 1450
+-- error ER_FORBID_SCHEMA_CHANGE
rename table v1 to mysqltest.v1;
rename table v1 to v2;
---error 1050
+--error ER_TABLE_EXISTS_ERROR
rename table v3 to v1, v2 to t1;
drop table t1;
drop view v2,v3;
@@ -810,19 +810,19 @@ create view v1 as select 'a',1;
create view v2 as select * from v1 union all select * from v1;
create view v3 as select * from v2 where 1 = (select `1` from v2);
create view v4 as select * from v3;
--- error 1242
+-- error ER_SUBQUERY_NO_1_ROW
select * from v4;
drop view v4, v3, v2, v1;
#
# VIEW over SELECT with prohibited clauses
#
--- error 1350
+-- error ER_VIEW_SELECT_CLAUSE
create view v1 as select 5 into @w;
--- error 1350
+-- error ER_VIEW_SELECT_CLAUSE
create view v1 as select 5 into outfile 'ttt';
create table t1 (a int);
--- error 1350
+-- error ER_VIEW_SELECT_CLAUSE
create view v1 as select a from t1 procedure analyse();
-- error ER_VIEW_SELECT_DERIVED
create view v1 as select 1 from (select 1) as d1;
@@ -848,109 +848,109 @@ create table t3 (col1 datetime not null);
create view v1 as select * from t1;
create view v2 as select * from v1;
create view v3 as select v2.col1 from v2,t2 where v2.col1 = t2.col1;
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
update v2 set col1 = (select max(col1) from v1);
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
update v2 set col1 = (select max(col1) from t1);
--- error 1093
+-- error ER_UPDATE_TABLE_USED
update v2 set col1 = (select max(col1) from v2);
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
update v2,t2 set v2.col1 = (select max(col1) from v1) where v2.col1 = t2.col1;
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
update t1,t2 set t1.col1 = (select max(col1) from v1) where t1.col1 = t2.col1;
--- error 1093
+-- error ER_UPDATE_TABLE_USED
update v1,t2 set v1.col1 = (select max(col1) from v1) where v1.col1 = t2.col1;
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
update t2,v2 set v2.col1 = (select max(col1) from v1) where v2.col1 = t2.col1;
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
update t2,t1 set t1.col1 = (select max(col1) from v1) where t1.col1 = t2.col1;
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
update t2,v1 set v1.col1 = (select max(col1) from v1) where v1.col1 = t2.col1;
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
update v2,t2 set v2.col1 = (select max(col1) from t1) where v2.col1 = t2.col1;
--- error 1093
+-- error ER_UPDATE_TABLE_USED
update t1,t2 set t1.col1 = (select max(col1) from t1) where t1.col1 = t2.col1;
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
update v1,t2 set v1.col1 = (select max(col1) from t1) where v1.col1 = t2.col1;
--- error 1093
+-- error ER_UPDATE_TABLE_USED
update t2,v2 set v2.col1 = (select max(col1) from t1) where v2.col1 = t2.col1;
--- error 1093
+-- error ER_UPDATE_TABLE_USED
update t2,t1 set t1.col1 = (select max(col1) from t1) where t1.col1 = t2.col1;
--- error 1093
+-- error ER_UPDATE_TABLE_USED
update t2,v1 set v1.col1 = (select max(col1) from t1) where v1.col1 = t2.col1;
--- error 1093
+-- error ER_UPDATE_TABLE_USED
update v2,t2 set v2.col1 = (select max(col1) from v2) where v2.col1 = t2.col1;
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
update t1,t2 set t1.col1 = (select max(col1) from v2) where t1.col1 = t2.col1;
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
update v1,t2 set v1.col1 = (select max(col1) from v2) where v1.col1 = t2.col1;
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
update t2,v2 set v2.col1 = (select max(col1) from v2) where v2.col1 = t2.col1;
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
update t2,t1 set t1.col1 = (select max(col1) from v2) where t1.col1 = t2.col1;
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
update t2,v1 set v1.col1 = (select max(col1) from v2) where v1.col1 = t2.col1;
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
update v3 set v3.col1 = (select max(col1) from v1);
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
update v3 set v3.col1 = (select max(col1) from t1);
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
update v3 set v3.col1 = (select max(col1) from v2);
--- error 1093
+-- error ER_UPDATE_TABLE_USED
update v3 set v3.col1 = (select max(col1) from v3);
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
delete from v2 where col1 = (select max(col1) from v1);
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
delete from v2 where col1 = (select max(col1) from t1);
--- error 1093
+-- error ER_UPDATE_TABLE_USED
delete from v2 where col1 = (select max(col1) from v2);
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
delete v2 from v2,t2 where (select max(col1) from v1) > 0 and v2.col1 = t2.col1;
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
delete t1 from t1,t2 where (select max(col1) from v1) > 0 and t1.col1 = t2.col1;
--- error 1093
+-- error ER_UPDATE_TABLE_USED
delete v1 from v1,t2 where (select max(col1) from v1) > 0 and v1.col1 = t2.col1;
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
delete v2 from v2,t2 where (select max(col1) from t1) > 0 and v2.col1 = t2.col1;
--- error 1093
+-- error ER_UPDATE_TABLE_USED
delete t1 from t1,t2 where (select max(col1) from t1) > 0 and t1.col1 = t2.col1;
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
delete v1 from v1,t2 where (select max(col1) from t1) > 0 and v1.col1 = t2.col1;
--- error 1093
+-- error ER_UPDATE_TABLE_USED
delete v2 from v2,t2 where (select max(col1) from v2) > 0 and v2.col1 = t2.col1;
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
delete t1 from t1,t2 where (select max(col1) from v2) > 0 and t1.col1 = t2.col1;
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
delete v1 from v1,t2 where (select max(col1) from v2) > 0 and v1.col1 = t2.col1;
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
insert into v2 values ((select max(col1) from v1));
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
insert into t1 values ((select max(col1) from v1));
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
insert into v2 values ((select max(col1) from v1));
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
insert into v2 values ((select max(col1) from t1));
--- error 1093
+-- error ER_UPDATE_TABLE_USED
insert into t1 values ((select max(col1) from t1));
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
insert into v2 values ((select max(col1) from t1));
--- error 1093
+-- error ER_UPDATE_TABLE_USED
insert into v2 values ((select max(col1) from v2));
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
insert into t1 values ((select max(col1) from v2));
--- error 1093
+-- error ER_UPDATE_TABLE_USED
insert into v2 values ((select max(col1) from v2));
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
insert into v3 (col1) values ((select max(col1) from v1));
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
insert into v3 (col1) values ((select max(col1) from t1));
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
insert into v3 (col1) values ((select max(col1) from v2));
-#check with TZ tables in list
--- error 1443
+# check with TZ tables in list
+-- error ER_VIEW_PREVENT_UPDATE
insert into v3 (col1) values ((select CONVERT_TZ('20050101000000','UTC','MET') from v2));
insert into v3 (col1) values ((select CONVERT_TZ('20050101000000','UTC','MET') from t2));
--- error 1048
+-- error ER_BAD_NULL_ERROR
insert into t3 values ((select CONVERT_TZ('20050101000000','UTC','MET') from t2));
# temporary table algorithm view should be equal to subquery in the from clause
create algorithm=temptable view v4 as select * from t1;
@@ -966,7 +966,7 @@ drop table t1,t2,t3;
#
create table t1 (s1 int);
create view v1 as select * from t1;
--- error 1347
+-- error ER_WRONG_OBJECT
handler v1 open as xx;
drop view v1;
drop table t1;
@@ -1014,7 +1014,7 @@ create table t2 (a int);
create view v1 as select * from t1;
lock tables t1 read, v1 read;
select * from v1;
--- error 1100
+-- error ER_TABLE_NOT_LOCKED
select * from t2;
drop view v1;
drop table t1, t2;
@@ -1026,7 +1026,7 @@ create table t1 (a int);
create view v1 as select * from t1 where a < 2 with check option;
# simple insert
insert into v1 values(1);
--- error 1369
+-- error ER_VIEW_CHECK_FAILED
insert into v1 values(3);
# simple insert with ignore
insert ignore into v1 values (2),(3),(0);
@@ -1035,7 +1035,7 @@ select * from t1;
delete from t1;
# INSERT SELECT test
insert into v1 SELECT 1;
--- error 1369
+-- error ER_VIEW_CHECK_FAILED
insert into v1 SELECT 3;
# prepare data for next check
create table t2 (a int);
@@ -1043,9 +1043,9 @@ insert into t2 values (2),(3),(0);
# INSERT SELECT with ignore test
insert ignore into v1 SELECT a from t2;
select * from t1 order by a desc;
-#simple UPDATE test
+# simple UPDATE test
update v1 set a=-1 where a=0;
--- error 1369
+-- error ER_VIEW_CHECK_FAILED
update v1 set a=2 where a=1;
select * from t1 order by a desc;
# prepare data for next check
@@ -1072,12 +1072,12 @@ create view v2 as select * from v1 where a > 0 with local check option;
create view v3 as select * from v1 where a > 0 with cascaded check option;
insert into v2 values (1);
insert into v3 values (1);
--- error 1369
+-- error ER_VIEW_CHECK_FAILED
insert into v2 values (0);
--- error 1369
+-- error ER_VIEW_CHECK_FAILED
insert into v3 values (0);
insert into v2 values (2);
--- error 1369
+-- error ER_VIEW_CHECK_FAILED
insert into v3 values (2);
select * from t1;
drop view v3,v2,v1;
@@ -1089,7 +1089,7 @@ drop table t1;
create table t1 (a int, primary key (a));
create view v1 as select * from t1 where a < 2 with check option;
insert into v1 values (1) on duplicate key update a=2;
--- error 1369
+-- error ER_VIEW_CHECK_FAILED
insert into v1 values (1) on duplicate key update a=2;
insert ignore into v1 values (1) on duplicate key update a=2;
select * from t1;
@@ -1102,13 +1102,13 @@ drop table t1;
create table t1 (s1 int);
create view v1 as select * from t1;
create view v2 as select * from v1;
--- error 1146
+-- error ER_NO_SUCH_TABLE
alter view v1 as select * from v2;
--- error 1146
+-- error ER_NO_SUCH_TABLE
alter view v1 as select * from v1;
--- error 1146
+-- error ER_NO_SUCH_TABLE
create or replace view v1 as select * from v2;
--- error 1146
+-- error ER_NO_SUCH_TABLE
create or replace view v1 as select * from v1;
drop view v2,v1;
drop table t1;
@@ -1143,7 +1143,7 @@ select * from t2;
# check it with check option
alter view v2 as select * from t2 where s1 in (select s1 from t1) with check option;
insert into v2 values (5);
--- error 1369
+-- error ER_VIEW_CHECK_FAILED
update v2 set s1 = 1;
insert into t1 values (1);
update v2 set s1 = 1;
@@ -1175,7 +1175,7 @@ drop table t1;
create table t1 (s1 tinyint);
create view v1 as select * from t1 where s1 <> 0 with local check option;
create view v2 as select * from v1 with cascaded check option;
--- error 1369
+-- error ER_VIEW_CHECK_FAILED
insert into v2 values (0);
drop view v2, v1;
drop table t1;
@@ -1186,7 +1186,7 @@ drop table t1;
create table t1 (s1 int);
create view v1 as select * from t1 where s1 < 5 with check option;
#single value
--- error 1369
+-- error ER_VIEW_CHECK_FAILED
insert ignore into v1 values (6);
#several values
insert ignore into v1 values (6),(3);
@@ -1200,7 +1200,7 @@ drop table t1;
create table t1 (s1 tinyint);
create trigger t1_bi before insert on t1 for each row set new.s1 = 500;
create view v1 as select * from t1 where s1 <> 127 with check option;
--- error 1369
+-- error ER_VIEW_CHECK_FAILED
insert into v1 values (0);
select * from v1;
select * from t1;
@@ -1214,7 +1214,7 @@ drop table t1;
create table t1 (s1 tinyint);
create view v1 as select * from t1 where s1 <> 0;
create view v2 as select * from v1 where s1 <> 1 with cascaded check option;
--- error 1369
+-- error ER_VIEW_CHECK_FAILED
insert into v2 values (0);
select * from v2;
select * from t1;
@@ -1227,7 +1227,7 @@ drop table t1;
# fixed length fields
create table t1 (a int, b char(10));
create view v1 as select * from t1 where a != 0 with check option;
--- error 1369
+-- error ER_VIEW_CHECK_FAILED
load data infile '../../std_data/loaddata3.dat' into table v1 fields terminated by '' enclosed by '' ignore 1 lines;
select * from t1;
select * from v1;
@@ -1240,7 +1240,7 @@ drop table t1;
# variable length fields
create table t1 (a text, b text);
create view v1 as select * from t1 where a <> 'Field A' with check option;
--- error 1369
+-- error ER_VIEW_CHECK_FAILED
load data infile '../../std_data/loaddata2.dat' into table v1 fields terminated by ',' enclosed by '''';
select concat('|',a,'|'), concat('|',b,'|') from t1;
select concat('|',a,'|'), concat('|',b,'|') from v1;
@@ -1321,7 +1321,7 @@ select * from t2;
# view without primary key
create view v2 (a,b) as select t1.b as a, t2.a as b from t1, t2;
set updatable_views_with_limit=NO;
--- error 1288
+-- error ER_NON_UPDATABLE_TABLE
update v2 set a= 10 where a=200 limit 1;
set updatable_views_with_limit=DEFAULT;
# just view selects
@@ -1349,14 +1349,14 @@ create table t2 (a int, primary key (a), b int);
insert into t2 values (1000, 2000);
create view v3 (a,b) as select t1.a as a, t2.a as b from t1, t2;
# inserting into join view without field list
--- error 1394
+-- error ER_VIEW_NO_INSERT_FIELD_LIST
insert into v3 values (1,2);
--- error 1394
+-- error ER_VIEW_NO_INSERT_FIELD_LIST
insert into v3 select * from t2;
# inserting in several tables of join view
--- error 1393
+-- error ER_VIEW_MULTIUPDATE
insert into v3(a,b) values (1,2);
--- error 1393
+-- error ER_VIEW_MULTIUPDATE
insert into v3(a,b) select * from t2;
# correct inserts into join view
insert into v3(a) values (1);
@@ -1367,11 +1367,11 @@ insert into v3(a) values (1) on duplicate key update a=a+10000+VALUES(a);
select * from t1;
select * from t2;
# try delete from join view
--- error 1395
+-- error ER_VIEW_DELETE_MERGE_VIEW
delete from v3;
--- error 1395
+-- error ER_VIEW_DELETE_MERGE_VIEW
delete v3,t1 from v3,t1;
--- error 1395
+-- error ER_VIEW_DELETE_MERGE_VIEW
delete t1,v3 from t1,v3;
# delete from t1 just to reduce result set size
delete from t1;
@@ -1394,7 +1394,7 @@ drop view v3;
drop tables t1,t2;
#
-# View field names should be case insensitive
+# View field names should be case insensitive
#
create table t1(f1 int);
create view v1 as select f1 from t1;
@@ -1403,7 +1403,7 @@ drop view v1;
drop table t1;
#
-# Resolving view fields in subqueries in VIEW (Bug #6394)
+# Resolving view fields in subqueries in VIEW (Bug#6394)
#
create table t1(c1 int);
create table t2(c2 int);
@@ -1420,7 +1420,7 @@ drop view v2, v1;
drop table t1, t2;
#
-# view over other view setup (BUG#7433)
+# view over other view setup (Bug#7433)
#
CREATE TABLE t1 (C1 INT, C2 INT);
CREATE TABLE t2 (C2 INT);
@@ -1431,10 +1431,10 @@ drop view v2, v1;
drop table t1, t2;
#
-# view and group_concat() (BUG#7116)
+# view and group_concat() (Bug#7116)
#
-create table t1 (col1 char(5),col2 int,col3 int);
-insert into t1 values ('one',10,25), ('two',10,50), ('two',10,50), ('one',20,25), ('one',30,25);
+create table t1 (col1 char(5),col2 int,col3 int);
+insert into t1 values ('one',10,25), ('two',10,50), ('two',10,50), ('one',20,25), ('one',30,25);
create view v1 as select * from t1;
select col1,group_concat(col2,col3) from t1 group by col1;
select col1,group_concat(col2,col3) from v1 group by col1;
@@ -1442,18 +1442,18 @@ drop view v1;
drop table t1;
#
-# Item_ref resolved as view field (BUG#6894)
+# Item_ref resolved as view field (Bug#6894)
#
create table t1 (s1 int, s2 char);
create view v1 as select s1, s2 from t1;
--- error 1054
+-- error ER_BAD_FIELD_ERROR
select s2 from v1 vq1 where 2 = (select count(*) from v1 vq2 having vq1.s2 = vq2.s2);
select s2 from v1 vq1 where 2 = (select count(*) aa from v1 vq2 having vq1.s2 = aa);
drop view v1;
drop table t1;
#
-# Test case for bug #9398 CREATE TABLE with SELECT from a multi-table view
+# Test case for Bug#9398 CREATE TABLE with SELECT from a multi-table view
#
CREATE TABLE t1 (a1 int);
CREATE TABLE t2 (a2 int);
@@ -1469,7 +1469,7 @@ DROP VIEW v1;
DROP TABLE t1,t2,t3;
#
-# Test for BUG#8703 "insert into table select from view crashes"
+# Test for Bug#8703 insert into table select from view crashes
#
create table t1 (a int);
create table t2 like t1;
@@ -1481,84 +1481,84 @@ drop view v1;
drop table t1,t2,t3;
#
-# Test for BUG #6106: query over a view using subquery for the underlying table
-#
-
-CREATE TABLE t1 (col1 int PRIMARY KEY, col2 varchar(10));
-INSERT INTO t1 VALUES(1,'trudy');
-INSERT INTO t1 VALUES(2,'peter');
-INSERT INTO t1 VALUES(3,'sanja');
-INSERT INTO t1 VALUES(4,'monty');
-INSERT INTO t1 VALUES(5,'david');
-INSERT INTO t1 VALUES(6,'kent');
-INSERT INTO t1 VALUES(7,'carsten');
-INSERT INTO t1 VALUES(8,'ranger');
-INSERT INTO t1 VALUES(10,'matt');
-CREATE TABLE t2 (col1 int, col2 int, col3 char(1));
-INSERT INTO t2 VALUES (1,1,'y');
-INSERT INTO t2 VALUES (1,2,'y');
-INSERT INTO t2 VALUES (2,1,'n');
-INSERT INTO t2 VALUES (3,1,'n');
-INSERT INTO t2 VALUES (4,1,'y');
-INSERT INTO t2 VALUES (4,2,'n');
-INSERT INTO t2 VALUES (4,3,'n');
-INSERT INTO t2 VALUES (6,1,'n');
+# Test for Bug#6106 query over a view using subquery for the underlying table
+#
+
+CREATE TABLE t1 (col1 int PRIMARY KEY, col2 varchar(10));
+INSERT INTO t1 VALUES(1,'trudy');
+INSERT INTO t1 VALUES(2,'peter');
+INSERT INTO t1 VALUES(3,'sanja');
+INSERT INTO t1 VALUES(4,'monty');
+INSERT INTO t1 VALUES(5,'david');
+INSERT INTO t1 VALUES(6,'kent');
+INSERT INTO t1 VALUES(7,'carsten');
+INSERT INTO t1 VALUES(8,'ranger');
+INSERT INTO t1 VALUES(10,'matt');
+CREATE TABLE t2 (col1 int, col2 int, col3 char(1));
+INSERT INTO t2 VALUES (1,1,'y');
+INSERT INTO t2 VALUES (1,2,'y');
+INSERT INTO t2 VALUES (2,1,'n');
+INSERT INTO t2 VALUES (3,1,'n');
+INSERT INTO t2 VALUES (4,1,'y');
+INSERT INTO t2 VALUES (4,2,'n');
+INSERT INTO t2 VALUES (4,3,'n');
+INSERT INTO t2 VALUES (6,1,'n');
INSERT INTO t2 VALUES (8,1,'y');
-
-CREATE VIEW v1 AS SELECT * FROM t1;
-SELECT a.col1,a.col2,b.col2,b.col3
+CREATE VIEW v1 AS SELECT * FROM t1;
+
+SELECT a.col1,a.col2,b.col2,b.col3
FROM t1 a LEFT JOIN t2 b ON a.col1=b.col1
- WHERE b.col2 IS NULL OR
+ WHERE b.col2 IS NULL OR
b.col2=(SELECT MAX(col2) FROM t2 b WHERE b.col1=a.col1);
-SELECT a.col1,a.col2,b.col2,b.col3
+SELECT a.col1,a.col2,b.col2,b.col3
FROM v1 a LEFT JOIN t2 b ON a.col1=b.col1
- WHERE b.col2 IS NULL OR
+ WHERE b.col2 IS NULL OR
b.col2=(SELECT MAX(col2) FROM t2 b WHERE b.col1=a.col1);
-CREATE VIEW v2 AS SELECT * FROM t2;
+CREATE VIEW v2 AS SELECT * FROM t2;
SELECT a.col1,a.col2,b.col2,b.col3
FROM v2 b RIGHT JOIN v1 a ON a.col1=b.col1
WHERE b.col2 IS NULL OR
- b.col2=(SELECT MAX(col2) FROM v2 b WHERE b.col1=a.col1);
+ b.col2=(SELECT MAX(col2) FROM v2 b WHERE b.col1=a.col1);
-# Tests from the report for bug #6107
+# Tests from the report for Bug#6107
SELECT a.col1,a.col2,b.col2,b.col3
FROM v2 b RIGHT JOIN v1 a ON a.col1=b.col1
WHERE a.col1 IN (1,5,9) AND
(b.col2 IS NULL OR
- b.col2=(SELECT MAX(col2) FROM v2 b WHERE b.col1=a.col1));
+ b.col2=(SELECT MAX(col2) FROM v2 b WHERE b.col1=a.col1));
CREATE VIEW v3 AS SELECT * FROM t1 WHERE col1 IN (1,5,9);
SELECT a.col1,a.col2,b.col2,b.col3
FROM v2 b RIGHT JOIN v3 a ON a.col1=b.col1
WHERE b.col2 IS NULL OR
- b.col2=(SELECT MAX(col2) FROM v2 b WHERE b.col1=a.col1);
-
+ b.col2=(SELECT MAX(col2) FROM v2 b WHERE b.col1=a.col1);
+
DROP VIEW v1,v2,v3;
DROP TABLE t1,t2;
#
-# BUG#8490 Select from views containing subqueries causes server to hang
-# forever.
+# Bug#8490 Select from views containing subqueries causes server to hang
+# forever.
#
create table t1 as select 1 A union select 2 union select 3;
create table t2 as select * from t1;
create view v1 as select * from t1 where a in (select * from t2);
select * from v1 A, v1 B where A.a = B.a;
create table t3 as select a a,a b from t2;
-create view v2 as select * from t3 where
+create view v2 as select * from t3 where
a in (select * from t1) or b in (select * from t2);
select * from v2 A, v2 B where A.a = B.b;
drop view v1, v2;
drop table t1, t2, t3;
#
-# Test case for bug #8528: select from view over multi-table view
+# Test case for Bug#8528 select from view over multi-table view
#
CREATE TABLE t1 (a int);
CREATE TABLE t2 (b int);
@@ -1574,7 +1574,7 @@ DROP VIEW v2,v1;
DROP TABLE t1, t2;
#
-# Correct restoring view name in SP table locking BUG#9758
+# Correct restoring view name in SP table locking Bug#9758
#
create table t1 (a int);
create view v1 as select sum(a) from t1 group by a;
@@ -1603,7 +1603,7 @@ SELECT d, c FROM v1 ORDER BY d,c;
DROP VIEW v1;
DROP TABLE t1, t2;
#
-# using sum(distinct ) & avg(distinct ) in views (BUG#7015)
+# using sum(distinct ) & avg(distinct ) in views (Bug#7015)
#
create table t1 (s1 int);
create view v1 as select sum(distinct s1) from t1;
@@ -1615,14 +1615,14 @@ drop view v1;
drop table t1;
#
-# using cast(... as decimal) in views (BUG#11387);
+# using cast(... as decimal) in views (Bug#11387);
#
create view v1 as select cast(1 as decimal);
select * from v1;
drop view v1;
#
-# Bug#11298 insert into select from VIEW produces incorrect result when
+# Bug#11298 insert into select from VIEW produces incorrect result when
# using ORDER BY
create table t1(f1 int);
create table t2(f2 int);
@@ -1636,7 +1636,7 @@ drop view v1;
drop table t1,t2,t3;
#
-# Generation unique names for columns, and correct names check (BUG#7448)
+# Generation unique names for columns, and correct names check (Bug#7448)
#
# names with ' and \
create view v1 as select '\\','\\shazam';
@@ -1679,24 +1679,24 @@ create view v1 as select 's1', 's1', s1 from t1;
select * from v1;
drop view v1;
# underlying field name conflict with set name
--- error 1060
+-- error ER_DUP_FIELDNAME
create view v1 as select 1 as s1, 's1', s1 from t1;
--- error 1060
+-- error ER_DUP_FIELDNAME
create view v1 as select 's1', s1, 1 as s1 from t1;
drop table t1;
# set names differ by case only
--- error 1060
+-- error ER_DUP_FIELDNAME
create view v1(k, K) as select 1,2;
#
-# using time_format in view (BUG#7521)
+# using time_format in view (Bug#7521)
#
create view v1 as SELECT TIME_FORMAT(SEC_TO_TIME(3600),'%H:%i') as t;
select * from v1;
drop view v1;
#
-# evaluation constant functions in WHERE (BUG#4663)
+# evaluation constant functions in WHERE (Bug#4663)
#
create table t1 (a timestamp default now());
create table t2 (b timestamp default now());
@@ -1717,7 +1717,7 @@ DROP VIEW v1;
DROP TABLE t1;
#
-# checking views after some view with error (BUG#11337)
+# checking views after some view with error (Bug#11337)
#
CREATE TABLE t1 (col1 time);
CREATE TABLE t2 (col1 time);
@@ -1758,7 +1758,7 @@ drop view v1, v2, v3, v4, v5, v6;
drop table t2,t3;
#
-# bug #11325 Wrong date comparison in views
+# Bug#11325 Wrong date comparison in views
#
create table t1 (f1 date);
insert into t1 values ('2005-01-01'),('2005-02-02');
@@ -1769,7 +1769,7 @@ drop view v1;
drop table t1;
#
-# using encrypt & substring_index in view (BUG#7024)
+# using encrypt & substring_index in view (Bug#7024)
#
CREATE VIEW v1 AS SELECT ENCRYPT("dhgdhgd");
disable_result_log;
@@ -1781,21 +1781,21 @@ SELECT * FROM v1;
drop view v1;
#
-# hide underlying tables names in case of imposibility to update (BUG#10773)
+# hide underlying tables names in case of imposibility to update (Bug#10773)
#
create table t1 (f59 int, f60 int, f61 int);
insert into t1 values (19,41,32);
-create view v1 as select f59, f60 from t1 where f59 in
+create view v1 as select f59, f60 from t1 where f59 in
(select f59 from t1);
--- error 1288
+-- error ER_NON_UPDATABLE_TABLE
update v1 set f60=2345;
--- error 1443
+-- error ER_VIEW_PREVENT_UPDATE
update t1 set f60=(select max(f60) from v1);
drop view v1;
drop table t1;
#
-# Using var_samp with view (BUG#10651)
+# Using var_samp with view (Bug#10651)
#
create table t1 (s1 int);
create view v1 as select var_samp(s1) from t1;
@@ -1803,24 +1803,26 @@ show create view v1;
drop view v1;
drop table t1;
+
#
# Correct inserting data check (absence of default value) for view
-# underlying tables (BUG#6443)
+# underlying tables (Bug#6443)
#
set sql_mode='strict_all_tables';
CREATE TABLE t1 (col1 INT NOT NULL, col2 INT NOT NULL);
CREATE VIEW v1 (vcol1) AS SELECT col1 FROM t1;
CREATE VIEW v2 (vcol1) AS SELECT col1 FROM t1 WHERE col2 > 2;
--- error 1364
+-- error ER_NO_DEFAULT_FOR_FIELD
INSERT INTO t1 (col1) VALUES(12);
--- error 1423
+-- error ER_NO_DEFAULT_FOR_VIEW_FIELD
INSERT INTO v1 (vcol1) VALUES(12);
--- error 1423
+-- error ER_NO_DEFAULT_FOR_VIEW_FIELD
INSERT INTO v2 (vcol1) VALUES(12);
set sql_mode=default;
drop view v2,v1;
drop table t1;
+
#
# Bug#11399 Use an alias in a select statement on a view
#
@@ -1831,8 +1833,9 @@ select f1 as alias from v1;
drop view v1;
drop table t1;
+
#
-# Test for bug #6120: SP cache to be invalidated when altering a view
+# Test for Bug#6120 SP cache to be invalidated when altering a view
#
CREATE TABLE t1 (s1 int, s2 int);
@@ -1851,8 +1854,9 @@ DROP PROCEDURE p1;
DROP VIEW v1;
DROP TABLE t1;
+
#
-# Test for bug #11709 View was ordered by wrong column
+# Test for Bug#11709 View was ordered by wrong column
#
create table t1 (f1 int, f2 int);
create view v1 as select f1 as f3, f2 as f1 from t1;
@@ -1861,8 +1865,9 @@ select * from v1 order by f1;
drop view v1;
drop table t1;
+
#
-# Test for bug #11771: wrong query_id in SELECT * FROM <view>
+# Test for Bug#11771 wrong query_id in SELECT * FROM <view>
#
CREATE TABLE t1 (f1 char);
INSERT INTO t1 VALUES ('A');
@@ -1875,8 +1880,9 @@ SELECT * FROM t1;
DROP VIEW v1;
DROP TABLE t1;
+
#
-# opening table in correct locking mode (BUG#9597)
+# opening table in correct locking mode (Bug#9597)
#
CREATE TABLE t1 ( bug_table_seq INTEGER NOT NULL);
CREATE OR REPLACE VIEW v1 AS SELECT * from t1;
@@ -1893,8 +1899,9 @@ DROP PROCEDURE p1;
DROP VIEW v1;
DROP TABLE t1;
+
#
-# Bug #11760 Typo in Item_func_add_time::print() results in NULLs returned
+# Bug#11760 Typo in Item_func_add_time::print() results in NULLs returned
# subtime() in view
create table t1(f1 datetime);
insert into t1 values('2005.01.01 12:0:0');
@@ -1903,8 +1910,9 @@ select * from v1;
drop view v1;
drop table t1;
+
#
-# Test for bug #11412: query over a multitable view with GROUP_CONCAT
+# Test for Bug#11412 query over a multitable view with GROUP_CONCAT
#
CREATE TABLE t1 (
aid int PRIMARY KEY,
@@ -1920,15 +1928,16 @@ INSERT INTO t2 values (1,1), (2,1), (2,2);
CREATE VIEW v1 AS SELECT t1.*,t2.pid FROM t1,t2 WHERE t1.aid = t2.aid;
-SELECT pid,GROUP_CONCAT(CONCAT(fn,' ',ln) ORDER BY 1) FROM t1,t2
+SELECT pid,GROUP_CONCAT(CONCAT(fn,' ',ln) ORDER BY 1) FROM t1,t2
WHERE t1.aid = t2.aid GROUP BY pid;
SELECT pid,GROUP_CONCAT(CONCAT(fn,' ',ln) ORDER BY 1) FROM v1 GROUP BY pid;
DROP VIEW v1;
DROP TABLE t1,t2;
+
#
-# Test for bug #12382: SELECT * FROM view after INSERT command
+# Test for Bug#12382 SELECT * FROM view after INSERT command
#
CREATE TABLE t1 (id int PRIMARY KEY, f varchar(255));
@@ -1942,9 +1951,10 @@ SELECT * FROM v1;
DROP VIEW v1;
DROP TABLE t1;
+
#
-# Test for bug #12470: crash for a simple select from a view defined
-# as a join over 5 tables
+# Test for Bug#12470 crash for a simple select from a view defined
+# as a join over 5 tables
CREATE TABLE t1 (pk int PRIMARY KEY, b int);
CREATE TABLE t2 (pk int PRIMARY KEY, fk int, INDEX idx(fk));
@@ -1961,27 +1971,29 @@ SELECT a FROM v1;
DROP VIEW v1;
DROP TABLE t1,t2,t3,t4,t5;
+
#
-# Bug #12298 Typo in function name results in erroneous view being created.
+# Bug#12298 Typo in function name results in erroneous view being created.
#
create view v1 as select timestampdiff(day,'1997-01-01 00:00:00','1997-01-02 00:00:00') as f1;
select * from v1;
drop view v1;
#
-# repeatable CREATE VIEW statement BUG#12468
+# repeatable CREATE VIEW statement Bug#12468
#
create table t1(a int);
create procedure p1() create view v1 as select * from t1;
drop table t1;
--- error 1146
+-- error ER_NO_SUCH_TABLE
call p1();
--- error 1146
+-- error ER_NO_SUCH_TABLE
call p1();
drop procedure p1;
+
#
-# Bug #10624 Views with multiple UNION and UNION ALL produce incorrect results
+# Bug#10624 Views with multiple UNION and UNION ALL produce incorrect results
#
create table t1 (f1 int);
create table t2 (f1 int);
@@ -1991,20 +2003,23 @@ create view v1 as select * from t1 union select * from t2 union all select * fro
select * from v1;
drop view v1;
drop table t1,t2;
+
+
+#
+# Test for Bug#10970 view referring a temporary table indirectly
#
-# Test for bug #10970: view referring a temporary table indirectly
-#
CREATE TEMPORARY TABLE t1 (a int);
CREATE FUNCTION f1 () RETURNS int RETURN (SELECT COUNT(*) FROM t1);
--- error 1352
+-- error ER_VIEW_SELECT_TMPTABLE
CREATE VIEW v1 AS SELECT f1();
DROP FUNCTION f1;
DROP TABLE t1;
+
#
-# BUG #12533 (crash on DESCRIBE <view> after renaming base table column)
+# Bug#12533 (crash on DESCRIBE <view> after renaming base table column)
#
--disable_warnings
DROP TABLE IF EXISTS t1;
@@ -2016,13 +2031,14 @@ CREATE VIEW v1 AS SELECT * FROM t1;
DESCRIBE v1;
ALTER TABLE t1 CHANGE COLUMN f4 f4x CHAR(5);
---error 1356
+--error ER_VIEW_INVALID
DESCRIBE v1;
DROP TABLE t1;
DROP VIEW v1;
-#
-# Bug #12489 wrongly printed strcmp() function results in creation of broken
+
+#
+# Bug#12489 wrongly printed strcmp() function results in creation of broken
# view
create table t1 (f1 char);
create view v1 as select strcmp(f1,'a') from t1;
@@ -2030,8 +2046,9 @@ select * from v1;
drop view v1;
drop table t1;
+
#
-# Bug #12922 if(sum(),...) with group from view returns wrong results
+# Bug#12922 if(sum(),...) with group from view returns wrong results
#
create table t1 (f1 int, f2 int,f3 int);
insert into t1 values (1,10,20),(2,0,0);
@@ -2039,7 +2056,9 @@ create view v1 as select * from t1;
select if(sum(f1)>1,f2,f3) from v1 group by f1;
drop view v1;
drop table t1;
-# BUG#12941
+
+
+# Bug#12941
#
--disable_warnings
create table t1 (
@@ -2049,7 +2068,7 @@ create table t1 (
create table t2 (
r_object_id char(16) NOT NULL,
- i_position int(11) NOT NULL,
+ i_position int(11) NOT NULL,
users_names varchar(32) default NULL
) Engine = InnoDB;
--enable_warnings
@@ -2067,23 +2086,25 @@ insert into t2 values('120001a080000542',-1, 'guser01');
insert into t2 values('120001a080000542',-2, 'guser02');
select v1.r_object_id, v2.users_names from v1, v2
-where (v1.group_name='tstgroup1') and v2.r_object_id=v1.r_object_id
+where (v1.group_name='tstgroup1') and v2.r_object_id=v1.r_object_id
order by users_names;
drop view v1, v2;
drop table t1, t2;
+
#
-# Bug #6808 - Views: CREATE VIEW v ... FROM t AS v fails
+# Bug#6808 Views: CREATE VIEW v ... FROM t AS v fails
#
-create table t1 (s1 int);
+create table t1 (s1 int);
create view abc as select * from t1 as abc;
drop table t1;
drop view abc;
+
#
-# Bug #12993 View column rename broken in subselect
+# Bug#12993 View column rename broken in subselect
#
create table t1(f1 char(1));
create view v1 as select * from t1;
@@ -2091,15 +2112,17 @@ select * from (select f1 as f2 from v1) v where v.f2='a';
drop view v1;
drop table t1;
+
#
-# Bug #11416 Server crash if using a view that uses function convert_tz
+# Bug#11416 Server crash if using a view that uses function convert_tz
#
create view v1 as SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET');
select * from v1;
drop view v1;
+
#
-# Bugs #12963, #13000: wrong creation of VIEW with DAYNAME, DAYOFWEEK, and WEEKDAY
+# Bugs#12963, #13000 wrong creation of VIEW with DAYNAME, DAYOFWEEK, and WEEKDAY
#
CREATE TABLE t1 (date DATE NOT NULL);
@@ -2129,8 +2152,9 @@ SELECT * FROM v3;
DROP TABLE t1;
DROP VIEW v1, v2, v3;
+
#
-# Bug #13411: crash when using non-qualified view column in HAVING clause
+# Bug#13411 crash when using non-qualified view column in HAVING clause
#
CREATE TABLE t1 ( a int, b int );
@@ -2142,8 +2166,9 @@ SELECT v1.a FROM v1 GROUP BY v1.a HAVING a > 1;
DROP VIEW v1;
DROP TABLE t1;
+
#
-# Bug #13410: failed name resolution for qualified view column in HAVING
+# Bug#13410 failed name resolution for qualified view column in HAVING
#
CREATE TABLE t1 ( a int, b int );
@@ -2157,8 +2182,9 @@ SELECT v_1.a FROM v1 AS v_1 GROUP BY v_1.a HAVING v_1.a IN (1,2,3);
DROP VIEW v1;
DROP TABLE t1;
+
#
-# Bug #13327 view wasn't using index for const condition
+# Bug#13327 view wasn't using index for const condition
#
CREATE TABLE t1 (a INT, b INT, INDEX(a,b));
@@ -2175,8 +2201,9 @@ EXPLAIN SELECT * FROM v2 WHERE a=1;
DROP VIEW v1,v2;
DROP TABLE t1,t2,t3;
+
#
-# Bug #13622 Wrong view .frm created if some field's alias contain \n
+# Bug#13622 Wrong view .frm created if some field's alias contain \n
#
create table t1 (f1 int);
create view v1 as select t1.f1 as '123
@@ -2185,7 +2212,8 @@ select * from v1;
drop view v1;
drop table t1;
-# Bug #14466 lost sort order in GROUP_CONCAT() in a view
+
+# Bug#14466 lost sort order in GROUP_CONCAT() in a view
#
create table t1 (f1 int, f2 int);
insert into t1 values(1,1),(1,2),(1,3);
@@ -2196,8 +2224,9 @@ select * from v2;
drop view v1,v2;
drop table t1;
+
#
-# BUG#14026 Crash on second PS execution when using views
+# Bug#14026 Crash on second PS execution when using views
#
create table t1 (x int, y int);
create table t2 (x int, y int, z int);
@@ -2207,8 +2236,8 @@ create table t4 (x int, y int, z int);
create view v1 as
select t1.x
from (
- (t1 join t2 on ((t1.y = t2.y)))
- join
+ (t1 join t2 on ((t1.y = t2.y)))
+ join
(t3 left join t4 on (t3.y = t4.y) and (t3.z = t4.z))
);
@@ -2220,8 +2249,9 @@ execute stmt1 using @parm1;
drop view v1;
drop table t1,t2,t3,t4;
+
#
-# Bug #14540: OPTIMIZE, ANALYZE, REPAIR applied to not a view
+# Bug#14540 OPTIMIZE, ANALYZE, REPAIR applied to not a view
#
CREATE TABLE t1(id INT);
@@ -2240,7 +2270,7 @@ DROP VIEW v1;
#
-# BUG#14719: Views DEFINER grammar is incorrect
+# Bug#14719 Views DEFINER grammar is incorrect
#
create definer = current_user() sql security invoker view v1 as select 1;
@@ -2251,8 +2281,9 @@ create definer = current_user sql security invoker view v1 as select 1;
show create view v1;
drop view v1;
+
#
-# Bug #14816 test_if_order_by_key() expected only Item_fields.
+# Bug#14816 test_if_order_by_key() expected only Item_fields.
#
create table t1 (id INT, primary key(id));
insert into t1 values (1),(2);
@@ -2261,8 +2292,9 @@ explain select id from v1 order by id;
drop view v1;
drop table t1;
+
#
-# Bug #14850 Item_ref's values wasn't updated
+# Bug#14850 Item_ref's values wasn't updated
#
create table t1(f1 int, f2 int);
insert into t1 values (null, 10), (null,2);
@@ -2272,8 +2304,9 @@ select f1, sum(f2) from v1 group by f1;
drop view v1;
drop table t1;
+
#
-# BUG#14885: incorrect SOURCE in view created in a procedure
+# Bug#14885 incorrect SOURCE in view created in a procedure
# TODO: here SOURCE string must be shown when it will be possible
#
--disable_warnings
@@ -2291,8 +2324,9 @@ show create view v1;
drop view v1;
drop procedure p1;
+
#
-# BUG#15096: using function with view for view creation
+# Bug#15096 using function with view for view creation
#
CREATE VIEW v1 AS SELECT 42 AS Meaning;
--disable_warnings
@@ -2312,8 +2346,9 @@ select * from v2;
drop view v2,v1;
drop function f1;
+
#
-# Bug#14861: aliased column names are not preserved.
+# Bug#14861 aliased column names are not preserved.
#
create table t1 (id numeric, warehouse_id numeric);
create view v1 as select id from t1;
@@ -2331,8 +2366,9 @@ order by v2.receipt_id;
drop view v2, v1;
drop table t1;
+
#
-# Bug#16016: MIN/MAX optimization for views
+# Bug#16016 MIN/MAX optimization for views
#
CREATE TABLE t1 (a int PRIMARY KEY, b int);
@@ -2355,9 +2391,10 @@ EXPLAIN SELECT MIN(a) FROM v1;
DROP VIEW v1;
DROP TABLE t1;
+
#
-# Bug#16382: grouping name is resolved against a view column name
-# which coincides with a select column name
+# Bug#16382 grouping name is resolved against a view column name
+# which coincides with a select column name
CREATE TABLE t1 (x varchar(10));
INSERT INTO t1 VALUES (null), ('foo'), ('bar'), (null);
@@ -2372,21 +2409,23 @@ SELECT IF(x IS NULL, 'blank', 'not blank') AS x FROM v1 GROUP BY x;
DROP VIEW v1;
DROP TABLE t1;
+
#
-# BUG#15943: mysql_next_result hangs on invalid SHOW CREATE VIEW
+# Bug#15943 mysql_next_result hangs on invalid SHOW CREATE VIEW
#
delimiter //;
-drop table if exists t1;
-drop view if exists v1;
-create table t1 (id int);
-create view v1 as select * from t1;
-drop table t1;
-show create view v1;
+drop table if exists t1;
+drop view if exists v1;
+create table t1 (id int);
+create view v1 as select * from t1;
+drop table t1;
+show create view v1;
drop view v1;
//
delimiter ;//
+
#
# Bug#17726 Not checked empty list caused endless loop
#
@@ -2401,9 +2440,10 @@ select * from v2;
drop view v2, v1;
drop table t1;
+
#
-# Bug #18386: select from view over a table with ORDER BY view_col clause
-# given view_col is not an image of any column from the base table
+# Bug#18386 select from view over a table with ORDER BY view_col clause
+# given view_col is not an image of any column from the base table
CREATE TABLE t1 (a int);
INSERT INTO t1 VALUES (1), (2);
@@ -2415,9 +2455,10 @@ SELECT my_sqrt FROM v1 ORDER BY my_sqrt;
DROP VIEW v1;
DROP TABLE t1;
+
+#
+# Bug#18237 invalid count optimization applied to an outer join with a view
#
-# Bug #18237: invalid count optimization applied to an outer join with a view
-#
CREATE TABLE t1 (id int PRIMARY KEY);
CREATE TABLE t2 (id int PRIMARY KEY);
@@ -2436,14 +2477,16 @@ DROP VIEW v2;
DROP TABLE t1, t2;
+
#
-# Bug #16069: VIEW does return the same results as underlying SELECT
-# with WHERE condition containing BETWEEN over dates
+# Bug#16069 VIEW does return the same results as underlying SELECT
+# with WHERE condition containing BETWEEN over dates
# Dates as strings should be casted to date type
+
CREATE TABLE t1 (id int NOT NULL PRIMARY KEY,
td date DEFAULT NULL, KEY idx(td));
-INSERT INTO t1 VALUES
+INSERT INTO t1 VALUES
(1, '2005-01-01'), (2, '2005-01-02'), (3, '2005-01-02'),
(4, '2005-01-03'), (5, '2005-01-04'), (6, '2005-01-05'),
(7, '2005-01-05'), (8, '2005-01-05'), (9, '2005-01-06');
@@ -2456,8 +2499,9 @@ SELECT * FROM v1 WHERE td BETWEEN CAST('2005.01.02' AS DATE) AND CAST('2005.01.0
DROP VIEW v1;
DROP TABLE t1;
+
#
-# BUG#14308: Recursive view definitions
+# Bug#14308 Recursive view definitions
#
# using view only
create table t1 (a int);
@@ -2487,8 +2531,9 @@ select * from v1;
drop function f1;
drop view t1, v1;
+
#
-# Bug #15153: CONVERT_TZ() is not allowed in all places in VIEWs
+# Bug#15153 CONVERT_TZ() is not allowed in all places in VIEWs
#
# Error was reported when one tried to use CONVERT_TZ() function
# select list of view which was processed using MERGE algorithm.
@@ -2499,7 +2544,7 @@ insert into t1 values (20040101000000), (20050101000000), (20060101000000);
create view v1 as select convert_tz(dt, 'UTC', 'Europe/Moscow') as ldt from t1;
select * from v1;
drop view v1;
-# And in its where part
+# And in its where part
create view v1 as select * from t1 where convert_tz(dt, 'UTC', 'Europe/Moscow') >= 20050101000000;
select * from v1;
# Other interesting case - a view which uses convert_tz() function
@@ -2514,9 +2559,10 @@ select * from v2;
drop view v1, v2;
drop table t1;
+
#
-# Bug #19490: usage of view specified by a query with GROUP BY
-# an expression containing non-constant interval
+# Bug#19490 usage of view specified by a query with GROUP BY
+# an expression containing non-constant interval
CREATE TABLE t1 (id int NOT NULL PRIMARY KEY, d datetime);
@@ -2530,8 +2576,9 @@ SELECT * FROM v1;
DROP VIEW v1;
DROP TABLE t1;
+
#
-# Bug#19077: A nested materialized view is used before being populated.
+# Bug#19077 A nested materialized view is used before being populated.
#
CREATE TABLE t1 (i INT, j BIGINT);
INSERT INTO t1 VALUES (1, 2), (2, 2), (3, 2);
@@ -2541,9 +2588,10 @@ SELECT * FROM v2;
DROP VIEW v2, v1;
DROP TABLE t1;
+
+#
+# Bug#19573 VIEW with HAVING that refers an alias name
#
-# Bug #19573: VIEW with HAVING that refers an alias name
-#
CREATE TABLE t1(
fName varchar(25) NOT NULL,
@@ -2551,7 +2599,7 @@ CREATE TABLE t1(
DOB date NOT NULL,
test_date date NOT NULL,
uID int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY);
-
+
INSERT INTO t1(fName, lName, DOB, test_date) VALUES
('Hank', 'Hill', '1964-09-29', '2007-01-01'),
('Tom', 'Adams', '1908-02-14', '2007-01-01'),
@@ -2559,8 +2607,8 @@ INSERT INTO t1(fName, lName, DOB, test_date) VALUES
CREATE VIEW v1 AS
SELECT (year(test_date)-year(DOB)) AS Age
- FROM t1 HAVING Age < 75;
-SHOW CREATE VIEW v1;
+ FROM t1 HAVING Age < 75;
+SHOW CREATE VIEW v1;
SELECT (year(test_date)-year(DOB)) AS Age FROM t1 HAVING Age < 75;
SELECT * FROM v1;
@@ -2568,8 +2616,9 @@ SELECT * FROM v1;
DROP VIEW v1;
DROP TABLE t1;
+
#
-# Bug #19089: wrong inherited dafault values in temp table views
+# Bug#19089 wrong inherited dafault values in temp table views
#
CREATE TABLE t1 (id int NOT NULL PRIMARY KEY, a char(6) DEFAULT 'xxx');
@@ -2599,8 +2648,9 @@ SELECT * FROM t2;
DROP VIEW v1;
DROP TABLE t1,t2;
+
#
-# Bug#16110: insert permitted into view col w/o default value
+# Bug#16110 insert permitted into view col w/o default value
#
CREATE TABLE t1 (a INT NOT NULL, b INT NULL DEFAULT NULL);
CREATE VIEW v1 AS SELECT a, b FROM t1;
@@ -2608,7 +2658,7 @@ CREATE VIEW v1 AS SELECT a, b FROM t1;
INSERT INTO v1 (b) VALUES (2);
SET SQL_MODE = STRICT_ALL_TABLES;
---error 1423
+--error ER_NO_DEFAULT_FOR_VIEW_FIELD
INSERT INTO v1 (b) VALUES (4);
SET SQL_MODE = '';
@@ -2617,8 +2667,9 @@ SELECT * FROM t1;
DROP VIEW v1;
DROP TABLE t1;
+
#
-# Bug #18243: expression over a view column that with the REVERSE function
+# Bug#18243 expression over a view column that with the REVERSE function
#
CREATE TABLE t1 (firstname text, surname text);
@@ -2633,21 +2684,23 @@ SELECT CONCAT(LEFT(name,LENGTH(name)-INSTR(REVERSE(name)," ")),
DROP VIEW v1;
DROP TABLE t1;
+
#
-# Bug #19714: wrong type of a view column specified by an expressions over ints
+# Bug#19714 wrong type of a view column specified by an expressions over ints
#
CREATE TABLE t1 (i int, j int);
CREATE VIEW v1 AS SELECT COALESCE(i,j) FROM t1;
DESCRIBE v1;
-CREATE TABLE t2 SELECT COALESCE(i,j) FROM t1;
+CREATE TABLE t2 SELECT COALESCE(i,j) FROM t1;
DESCRIBE t2;
DROP VIEW v1;
DROP TABLE t1,t2;
+
#
-# Bug #17526: views with TRIM functions
+# Bug#17526 views with TRIM functions
#
CREATE TABLE t1 (s varchar(10));
@@ -2658,20 +2711,21 @@ CREATE VIEW v1 AS SELECT TRIM(BOTH 'y' FROM s) FROM t1;
SELECT * FROM v1;
DROP VIEW v1;
-SELECT TRIM(LEADING 'y' FROM s) FROM t1;
+SELECT TRIM(LEADING 'y' FROM s) FROM t1;
CREATE VIEW v1 AS SELECT TRIM(LEADING 'y' FROM s) FROM t1;
SELECT * FROM v1;
DROP VIEW v1;
-SELECT TRIM(TRAILING 'y' FROM s) FROM t1;
+SELECT TRIM(TRAILING 'y' FROM s) FROM t1;
CREATE VIEW v1 AS SELECT TRIM(TRAILING 'y' FROM s) FROM t1;
SELECT * FROM v1;
DROP VIEW v1;
DROP TABLE t1;
+
#
-#Bug #21080: ALTER VIEW makes user restate SQL SECURITY mode, and ALGORITHM
+# Bug#21080 ALTER VIEW makes user restate SQL SECURITY mode, and ALGORITHM
#
CREATE TABLE t1 (x INT, y INT);
CREATE ALGORITHM=TEMPTABLE SQL SECURITY INVOKER VIEW v1 AS SELECT x FROM t1;
@@ -2682,8 +2736,10 @@ SHOW CREATE VIEW v1;
DROP VIEW v1;
DROP TABLE t1;
-# Bug #21086: server crashes when VIEW defined with a SELECT with COLLATE
-# clause is called
+
+
+# Bug#21086 server crashes when VIEW defined with a SELECT with COLLATE
+# clause is called
#
CREATE TABLE t1 (s1 char);
INSERT INTO t1 VALUES ('Z');
@@ -2700,19 +2756,20 @@ SELECT s1 FROM t1;
DROP VIEW v1, v2;
DROP TABLE t1;
+
#
-# Bug #11551: Asymmetric + undocumented behaviour of DROP VIEW and DROP TABLE
+# Bug#11551 Asymmetric + undocumented behaviour of DROP VIEW and DROP TABLE
#
CREATE TABLE t1 (id INT);
CREATE VIEW v1 AS SELECT id FROM t1;
SHOW TABLES;
---error 1051
+--error ER_BAD_TABLE_ERROR
DROP VIEW v2,v1;
SHOW TABLES;
CREATE VIEW v1 AS SELECT id FROM t1;
---error 1347
+--error ER_WRONG_OBJECT
DROP VIEW t1,v1;
SHOW TABLES;
@@ -2721,13 +2778,14 @@ DROP TABLE t1;
DROP VIEW IF EXISTS v1;
--enable_warnings
+
#
-# Bug #21261: Wrong access rights was required for an insert to a view
+# Bug#21261 Wrong access rights was required for an insert to a view
#
CREATE DATABASE bug21261DB;
USE bug21261DB;
-CONNECT (root,localhost,root,,bug21261DB);
-CONNECTION root;
+connect (root,localhost,root,,bug21261DB);
+connection root;
CREATE TABLE t1 (x INT);
CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT x FROM t1;
@@ -2736,34 +2794,41 @@ GRANT INSERT, UPDATE ON t1 TO 'user21261'@'localhost';
CREATE TABLE t2 (y INT);
GRANT SELECT ON t2 TO 'user21261'@'localhost';
-CONNECT (user21261, localhost, user21261,, bug21261DB);
-CONNECTION user21261;
+connect (user21261, localhost, user21261,, bug21261DB);
+connection user21261;
INSERT INTO v1 (x) VALUES (5);
UPDATE v1 SET x=1;
-CONNECTION root;
+connection root;
GRANT SELECT ON v1 TO 'user21261'@'localhost';
GRANT SELECT ON t1 TO 'user21261'@'localhost';
-CONNECTION user21261;
+connection user21261;
UPDATE v1,t2 SET x=1 WHERE x=y;
-CONNECTION root;
+connection root;
SELECT * FROM t1;
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user21261'@'localhost';
DROP USER 'user21261'@'localhost';
DROP VIEW v1;
DROP TABLE t1;
DROP DATABASE bug21261DB;
+
+connection default;
USE test;
+disconnect root;
+disconnect user21261;
+
#
-# Bug #15950: NOW() optimized away in VIEWs
+# Bug#15950 NOW() optimized away in VIEWs
#
create table t1 (f1 datetime);
create view v1 as select * from t1 where f1 between now() and now() + interval 1 minute;
show create view v1;
drop view v1;
drop table t1;
+
+
#
-# Test for BUG#16899: Possible buffer overflow in handling of DEFINER-clause.
+# Test for Bug#16899 Possible buffer overflow in handling of DEFINER-clause.
#
# Prepare.
@@ -2790,8 +2855,7 @@ DROP TABLE t1;
#
-# BUG#17591: Updatable view not possible with trigger or stored
-# function
+# Bug#17591 Updatable view not possible with trigger or stored function
#
# During prelocking phase we didn't update lock type of view tables,
# hence READ lock was always requested.
@@ -2835,11 +2899,12 @@ DROP FUNCTION f2;
DROP VIEW v1, v2;
DROP TABLE t1;
+
#
-# Bug #5500: wrong select_type in EXPLAIN output for queries over views
+# Bug#5500 wrong select_type in EXPLAIN output for queries over views
#
-CREATE TABLE t1 (s1 int);
+CREATE TABLE t1 (s1 int);
CREATE VIEW v1 AS SELECT * FROM t1;
EXPLAIN SELECT * FROM t1;
@@ -2847,34 +2912,36 @@ EXPLAIN SELECT * FROM v1;
INSERT INTO t1 VALUES (1), (3), (2);
-EXPLAIN SELECT * FROM t1 t WHERE t.s1+1 < (SELECT MAX(t1.s1) FROM t1);
-EXPLAIN SELECT * FROM v1 t WHERE t.s1+1 < (SELECT MAX(t1.s1) FROM t1);
+EXPLAIN SELECT * FROM t1 t WHERE t.s1+1 < (SELECT MAX(t1.s1) FROM t1);
+EXPLAIN SELECT * FROM v1 t WHERE t.s1+1 < (SELECT MAX(t1.s1) FROM t1);
DROP VIEW v1;
DROP TABLE t1;
+
#
-# Bug #5505: Wrong error message on INSERT into a view
+# Bug#5505 Wrong error message on INSERT into a view
#
create table t1 (s1 int);
create view v1 as select s1 as a, s1 as b from t1;
--error ER_NON_INSERTABLE_TABLE
-insert into v1 values (1,1);
+insert into v1 values (1,1);
update v1 set a = 5;
drop view v1;
drop table t1;
+
#
-# Bug #21646: view qith a subquery in ON expression
+# Bug#21646 view qith a subquery in ON expression
#
-CREATE TABLE t1(pk int PRIMARY KEY);
+CREATE TABLE t1(pk int PRIMARY KEY);
CREATE TABLE t2(pk int PRIMARY KEY, fk int, ver int, org int);
-CREATE ALGORITHM=MERGE VIEW v1 AS
+CREATE ALGORITHM=MERGE VIEW v1 AS
SELECT t1.*
- FROM t1 JOIN t2
- ON t2.fk = t1.pk AND
+ FROM t1 JOIN t2
+ ON t2.fk = t1.pk AND
t2.ver = (SELECT MAX(t.ver) FROM t2 t WHERE t.org = t2.org);
SHOW WARNINGS;
SHOW CREATE VIEW v1;
@@ -2882,9 +2949,9 @@ SHOW CREATE VIEW v1;
DROP VIEW v1;
DROP TABLE t1, t2;
+
#
-# Bug#19111: TRIGGERs selecting from a VIEW on the firing base table
-# fail
+# Bug#19111 TRIGGERs selecting from a VIEW on the firing base table fail
#
# Allow to select from a view on a table being modified in a trigger
# and stored function, since plain select is allowed there.
@@ -2915,22 +2982,24 @@ DROP FUNCTION f1;
DROP VIEW v1;
DROP TABLE t1;
+
#
-# Bug #16813 (WITH CHECK OPTION doesn't work with UPDATE)
+# Bug#16813 (WITH CHECK OPTION doesn't work with UPDATE)
#
CREATE TABLE t1(id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, val INT UNSIGNED NOT NULL);
CREATE VIEW v1 AS SELECT id, val FROM t1 WHERE val >= 1 AND val <= 5 WITH CHECK OPTION;
INSERT INTO v1 (val) VALUES (2);
INSERT INTO v1 (val) VALUES (4);
--- error 1369
+-- error ER_VIEW_CHECK_FAILED
INSERT INTO v1 (val) VALUES (6);
--- error 1369
+-- error ER_VIEW_CHECK_FAILED
UPDATE v1 SET val=6 WHERE id=2;
DROP VIEW v1;
DROP TABLE t1;
+
#
-# BUG#22584: last_insert_id not updated after inserting a record
+# Bug#22584 last_insert_id not updated after inserting a record
# through a updatable view
#
# We still do not update LAST_INSERT_ID if AUTO_INCREMENT column is
@@ -2966,8 +3035,9 @@ SELECT * FROM t1;
DROP VIEW v1, v2;
DROP TABLE t1;
+
#
-# Bug #25580: !0 as an operand in a select expression of a view
+# Bug#25580 !0 as an operand in a select expression of a view
#
CREATE VIEW v AS SELECT !0 * 5 AS x FROM DUAL;
@@ -2978,8 +3048,9 @@ SELECT * FROM v;
DROP VIEW v;
+
#
-# BUG#24293: '\Z' token is not handled correctly in views
+# Bug#24293 '\Z' token is not handled correctly in views
#
--disable_warnings
@@ -2993,8 +3064,9 @@ SHOW CREATE VIEW v1;
DROP VIEW v1;
+
#
-# Bug #26124: BETWEEN over a view column of the DATETIME type
+# Bug#26124 BETWEEN over a view column of the DATETIME type
#
CREATE TABLE t1 (mydate DATETIME);
@@ -3009,8 +3081,9 @@ SELECT * FROM v1 WHERE mydate BETWEEN '2007-01-01' AND '2007-01-31';
DROP VIEW v1;
DROP TABLE t1;
+
#
-# Bug #25931: update of a multi-table view with check option
+# Bug#25931 update of a multi-table view with check option
#
CREATE TABLE t1 (a int);
@@ -3022,7 +3095,7 @@ CREATE VIEW v1 AS
SELECT t2.b FROM t1,t2 WHERE t1.a = t2.b WITH CHECK OPTION;
SELECT * FROM v1;
---error 1369
+--error ER_VIEW_CHECK_FAILED
UPDATE v1 SET b=3;
SELECT * FROM v1;
SELECT * FROM t1;
@@ -3031,8 +3104,9 @@ SELECT * FROM t2;
DROP VIEW v1;
DROP TABLE t1,t2;
+
#
-# Bug#12122: Views with ORDER BY can't be resolved using MERGE algorithm.
+# Bug#12122 Views with ORDER BY can't be resolved using MERGE algorithm.
#
create table t1(f1 int, f2 int);
insert into t1 values(1,2),(1,3),(1,1),(2,3),(2,1),(2,2);
@@ -3046,7 +3120,7 @@ drop view v1;
drop table t1;
#
-# Bug#26209: queries with GROUP BY and ORDER BY using views
+# Bug#26209 queries with GROUP BY and ORDER BY using views
#
CREATE TABLE t1 (
@@ -3065,9 +3139,9 @@ SELECT code, COUNT(DISTINCT country) FROM v1 GROUP BY code ORDER BY MAX(id);
DROP VIEW v1;
DROP TABLE t1;
+
#
-# BUG#25897: Some queries are no longer possible after a CREATE VIEW
-# fails
+# Bug#25897 Some queries are no longer possible after a CREATE VIEW fails
#
--disable_warnings
DROP VIEW IF EXISTS v1;
@@ -3081,9 +3155,9 @@ eval CREATE VIEW v1 AS $query;
--echo # Previously the following would fail.
eval $query;
+
#
-# Bug#24532: The return data type of IS TRUE is different from similar
-# operations
+# Bug#24532 The return data type of IS TRUE is different from similar operations
#
--disable_warnings
@@ -3168,8 +3242,9 @@ drop view view_24532_a;
drop view view_24532_b;
drop table table_24532;
+
#
-# Bug#26560: view using subquery with a reference to an outer alias
+# Bug#26560 view using subquery with a reference to an outer alias
#
CREATE TABLE t1 (
@@ -3180,7 +3255,7 @@ INSERT INTO t1 (lid, name) VALUES
(1, 'YES'), (2, 'NO');
CREATE TABLE t2 (
- id int NOT NULL PRIMARY KEY,
+ id int NOT NULL PRIMARY KEY,
gid int NOT NULL,
lid int NOT NULL,
dt date
@@ -3208,8 +3283,9 @@ SELECT * FROM v1;
DROP VIEW v1;
DROP table t1,t2;
+
#
-# Bug#27786: Inconsistent Operation Performing UNION On View With ORDER BY
+# Bug#27786 Inconsistent Operation Performing UNION On View With ORDER BY
#
CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (1),(2),(3);
CREATE VIEW v1 AS SELECT a FROM t1 ORDER BY a;
@@ -3224,8 +3300,9 @@ EXPLAIN SELECT * FROM t1 UNION SELECT * FROM v1 ORDER BY a;
DROP VIEW v1;
DROP TABLE t1;
+
#
-# Bug #27921 View ignores precision for CAST()
+# Bug#27921 View ignores precision for CAST()
#
CREATE VIEW v1 AS SELECT CAST( 1.23456789 AS DECIMAL( 7,5 ) ) AS col;
SELECT * FROM v1;
@@ -3236,9 +3313,10 @@ CREATE VIEW v1 AS SELECT CAST(1.23456789 AS DECIMAL(8,0)) AS col;
SHOW CREATE VIEW v1;
DROP VIEW v1;
+
#
-# Bug #28716: CHECK OPTION expression is evaluated over expired record buffers
-# when VIEW is updated via temporary tables
+# Bug#28716 CHECK OPTION expression is evaluated over expired record buffers
+# when VIEW is updated via temporary tables
#
CREATE TABLE t1 (a INT);
CREATE TABLE t2 (b INT, c INT DEFAULT 0);
@@ -3252,9 +3330,10 @@ SELECT * FROM v1;
DROP VIEW v1;
DROP TABLE t1,t2;
+
#
-# Bug #28561: update on multi-table view with CHECK OPTION and
-# a subquery in WHERE condition
+# Bug#28561 update on multi-table view with CHECK OPTION and a subquery
+# in WHERE condition
#
CREATE TABLE t1 (id int);
@@ -3262,8 +3341,8 @@ CREATE TABLE t2 (id int, c int DEFAULT 0);
INSERT INTO t1 (id) VALUES (1);
INSERT INTO t2 (id) VALUES (1);
-CREATE VIEW v1 AS
- SELECT t2.c FROM t1, t2
+CREATE VIEW v1 AS
+ SELECT t2.c FROM t1, t2
WHERE t1.id=t2.id AND 1 IN (SELECT id FROM t1) WITH CHECK OPTION;
UPDATE v1 SET c=1;
@@ -3271,9 +3350,10 @@ UPDATE v1 SET c=1;
DROP VIEW v1;
DROP TABLE t1,t2;
+
#
-# Bug #27827: CHECK OPTION ignores ON conditions when updating
-# a multi-table view with CHECK OPTION.
+# Bug#27827 CHECK OPTION ignores ON conditions when updating
+# a multi-table view with CHECK OPTION.
#
CREATE TABLE t1 (a1 INT, c INT DEFAULT 0);
@@ -3289,14 +3369,14 @@ CREATE VIEW v1 AS
SELECT t1.a1, t1.c FROM t1 JOIN t2 ON t1.a1=t2.a2 AND t1.c < 3
WITH CHECK OPTION;
SELECT * FROM v1;
---error 1369
+--error ER_VIEW_CHECK_FAILED
UPDATE v1 SET c=3;
PREPARE t FROM 'UPDATE v1 SET c=3';
---error 1369
+--error ER_VIEW_CHECK_FAILED
EXECUTE t;
---error 1369
+--error ER_VIEW_CHECK_FAILED
EXECUTE t;
---error 1369
+--error ER_VIEW_CHECK_FAILED
INSERT INTO v1(a1, c) VALUES (3, 3);
UPDATE v1 SET c=1 WHERE a1=1;
SELECT * FROM v1;
@@ -3307,14 +3387,14 @@ CREATE VIEW v2 AS SELECT t1.a1, t1.c
JOIN (t3 JOIN t4 ON t3.a3=t4.a4)
ON t2.a2=t3.a3 WITH CHECK OPTION;
SELECT * FROM v2;
---error 1369
+--error ER_VIEW_CHECK_FAILED
UPDATE v2 SET c=3;
PREPARE t FROM 'UPDATE v2 SET c=3';
---error 1369
+--error ER_VIEW_CHECK_FAILED
EXECUTE t;
---error 1369
+--error ER_VIEW_CHECK_FAILED
EXECUTE t;
---error 1369
+--error ER_VIEW_CHECK_FAILED
INSERT INTO v2(a1, c) VALUES (3, 3);
UPDATE v2 SET c=2 WHERE a1=1;
SELECT * FROM v2;
@@ -3323,10 +3403,11 @@ SELECT * FROM t1;
DROP VIEW v1,v2;
DROP TABLE t1,t2,t3,t4;
+
#
-# Bug #29104: assertion abort for a query with a view column reference
-# in the GROUP BY list and a condition requiring the value
-# of another view column to be equal to a constant
+# Bug#29104 assertion abort for a query with a view column reference
+# in the GROUP BY list and a condition requiring the value
+# of another view column to be equal to a constant
#
CREATE TABLE t1 (a int, b int);
@@ -3347,9 +3428,10 @@ EXPLAIN SELECT a, SUM(b) FROM v1 WHERE a=1 GROUP BY a;
DROP VIEW v1;
DROP TABLE t1;
+
#
-# Bug #29392: SELECT over a multi-table view with ORDER BY
-# selecting the same view column with two different aliases
+# Bug#29392 SELECT over a multi-table view with ORDER BY
+# selecting the same view column with two different aliases
#
CREATE TABLE t1 (
@@ -3373,7 +3455,7 @@ CREATE TABLE t3 (
INDEX idx_app_name(app_name)
);
-CREATE VIEW v1 AS
+CREATE VIEW v1 AS
SELECT profile.person_id AS person_id
FROM t1 profile, t2 userrole, t3 role
WHERE userrole.person_id = profile.person_id AND
@@ -3387,35 +3469,37 @@ INSERT INTO t1 VALUES
INSERT INTO t2 VALUES
(1,3,6),(2,4,7),(3,5,8),(4,6,9),(5,1,6),(6,1,7),(7,1,8),(8,1,9),(9,1,10);
-INSERT INTO t3 VALUES
+INSERT INTO t3 VALUES
(1,'NUCANS_APP_USER','NUCANSAPP'),(2,'NUCANS_TRGAPP_USER','NUCANSAPP'),
(3,'IA_INTAKE_COORDINATOR','IACANS'),(4,'IA_SCREENER','IACANS'),
(5,'IA_SUPERVISOR','IACANS'),(6,'IA_READONLY','IACANS'),
(7,'SOC_USER','SOCCANS'),(8,'CAYIT_USER','CAYITCANS'),
(9,'RTOS_DCFSPOS_SUPERVISOR','RTOS');
-
+
EXPLAIN SELECT t.person_id AS a, t.person_id AS b FROM v1 t WHERE t.person_id=6;
SELECT t.person_id AS a, t.person_id AS b FROM v1 t WHERE t.person_id=6;
DROP VIEW v1;
DROP TABLE t1,t2,t3;
+
#
-# Bug#30020: Insufficient check led to a wrong info provided by the
-# information schema table.
+# Bug#30020 Insufficient check led to a wrong info provided by the
+# information schema table.
#
create table t1 (i int);
insert into t1 values (1), (2), (1), (3), (2), (4);
create view v1 as select distinct i from t1;
select * from v1;
-select table_name, is_updatable from information_schema.views
+select table_name, is_updatable from information_schema.views
where table_name = 'v1';
drop view v1;
drop table t1;
+
#
-# Bug #28701: SELECTs from VIEWs completely ignore USE/FORCE KEY, allowing
-# invalid statements
+# Bug#28701 SELECTs from VIEWs completely ignore USE/FORCE KEY, allowing
+# invalid statements
#
CREATE TABLE t1 (a INT);
@@ -3431,8 +3515,9 @@ SELECT * FROM v1 IGNORE KEY(non_existant);
DROP VIEW v1;
DROP TABLE t1;
+
#
-# Bug #28702: VIEWs defined with USE/FORCE KEY ignore that request
+# Bug#28702 VIEWs defined with USE/FORCE KEY ignore that request
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT, b INT NOT NULL DEFAULT 0,
PRIMARY KEY(a), KEY (b));
@@ -3452,9 +3537,10 @@ DROP VIEW v2;
DROP VIEW v3;
DROP TABLE t1;
+
--echo #
---echo # Bug#29477: Not all fields of the target table were checked to have
---echo # a default value when inserting into a view.
+--echo # Bug#29477 Not all fields of the target table were checked to have
+--echo # a default value when inserting into a view.
--echo #
create table t1(f1 int, f2 int not null);
create view v1 as select f1 from t1;
@@ -3467,29 +3553,31 @@ set @@sql_mode=@old_mode;
drop view v1;
drop table t1;
+
#
-# Bug #33389: Selecting from a view into a table from within SP or trigger
-# crashes server
+# Bug#33389 Selecting from a view into a table from within SP or trigger
+# crashes server
#
create table t1 (a int, key(a));
create table t2 (c int);
-
+
create view v1 as select a b from t1;
-create view v2 as select 1 a from t2, v1 where c in
+create view v2 as select 1 a from t2, v1 where c in
(select 1 from t1 where b = a);
-
+
insert into t1 values (1), (1);
insert into t2 values (1), (1);
-
+
prepare stmt from "select * from v2 where a = 1";
-execute stmt;
+execute stmt;
drop view v1, v2;
drop table t1, t2;
+
#
-# Bug #33049: Assert while running test-as3ap test(mysql-bench suite)
+# Bug#33049 Assert while running test-as3ap test(mysql-bench suite)
#
CREATE TABLE t1 (a INT);
@@ -3504,7 +3592,7 @@ DROP TABLE t1;
###########################################################################
--echo # -----------------------------------------------------------------
---echo # -- Bug#34337: Server crash when Altering a view using a table name.
+--echo # -- Bug#34337 Server crash when Altering a view using a table name.
--echo # -----------------------------------------------------------------
--echo
@@ -3534,8 +3622,8 @@ DROP TABLE t1;
###########################################################################
--echo # -----------------------------------------------------------------
---echo # -- Bug#35193: VIEW query is rewritten without "FROM DUAL",
---echo # -- causing syntax error
+--echo # -- Bug#35193 VIEW query is rewritten without "FROM DUAL",
+--echo # -- causing syntax error
--echo # -----------------------------------------------------------------
--echo
@@ -3557,15 +3645,16 @@ DROP VIEW v1;
###########################################################################
#
-# Bug#39040: valgrind errors/crash when creating views with binlog logging
-# enabled
+# Bug#39040 valgrind errors/crash when creating views with binlog logging
+# enabled
#
# Bug is visible only when running in valgrind with binary logging.
CREATE VIEW v1 AS SELECT 1;
DROP VIEW v1;
+
#
-# Bug #33461: SELECT ... FROM <view> USE INDEX (...) throws an error
+# Bug#33461 SELECT ... FROM <view> USE INDEX (...) throws an error
#
CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT, INDEX (c2));
@@ -3616,7 +3705,7 @@ USE test;
--echo
--echo #
---echo # Bug#26676: VIEW using old table schema in a session.
+--echo # Bug#26676 VIEW using old table schema in a session.
--echo #
--echo
@@ -3668,7 +3757,7 @@ DROP TABLE t1;
###########################################################################
--echo # -----------------------------------------------------------------
---echo # -- Bug#32538: View definition picks up character set, but not collation
+--echo # -- Bug#32538 View definition picks up character set, but not collation
--echo # -----------------------------------------------------------------
--echo
diff --git a/mysql-test/t/view_grant.test b/mysql-test/t/view_grant.test
index 4e8d97e4444..824c67d867e 100644
--- a/mysql-test/t/view_grant.test
+++ b/mysql-test/t/view_grant.test
@@ -1,6 +1,9 @@
# Can't test with embedded server
-- source include/not_embedded.inc
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
+
--disable_warnings
drop database if exists mysqltest;
drop view if exists v1,v2,v3;
@@ -32,19 +35,19 @@ grant create view,select on test.* to mysqltest_1@localhost;
connect (user1,localhost,mysqltest_1,,test);
connection user1;
--- error ER_SPECIFIC_ACCESS_DENIED_ERROR
+--error ER_SPECIFIC_ACCESS_DENIED_ERROR
create definer=root@localhost view v1 as select * from mysqltest.t1;
create view v1 as select * from mysqltest.t1;
# try to modify view without DROP privilege on it
--- error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
alter view v1 as select * from mysqltest.t1;
--- error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
create or replace view v1 as select * from mysqltest.t1;
# no CRETE VIEW privilege
--- error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
create view mysqltest.v2 as select * from mysqltest.t1;
# no SELECT privilege
--- error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
create view v2 as select * from mysqltest.t2;
connection root;
@@ -54,7 +57,7 @@ show create view v1;
grant create view,drop,select on test.* to mysqltest_1@localhost;
connection user1;
-# following 'use' command is workaround of bug #9582 and should be removed
+# following 'use' command is workaround of Bug#9582 and should be removed
# when that bug will be fixed
use test;
alter view v1 as select * from mysqltest.t1;
@@ -82,7 +85,7 @@ grant select (c) on mysqltest.v1 to mysqltest_1@localhost;
connection user1;
select c from mysqltest.v1;
# there are no privileges on column 'd'
--- error 1143
+--error ER_COLUMNACCESS_DENIED_ERROR
select d from mysqltest.v1;
connection root;
@@ -102,7 +105,7 @@ grant select (c) on mysqltest.v1 to mysqltest_1@localhost;
connection user1;
select c from mysqltest.v1;
# there are no privileges on column 'd'
--- error 1143
+--error ER_COLUMNACCESS_DENIED_ERROR
select d from mysqltest.v1;
connection root;
@@ -117,7 +120,7 @@ connection root;
--disable_warnings
create database mysqltest;
--enable_warnings
-#prepare views and tables
+# prepare views and tables
create table mysqltest.t1 (a int, b int);
create table mysqltest.t2 (a int, b int);
create view mysqltest.v1 (c,d) as select a+1,b+1 from mysqltest.t1;
@@ -139,21 +142,21 @@ select c from mysqltest.v4;
show columns from mysqltest.v1;
show columns from mysqltest.v2;
# but explain/show do not
--- error 1345
+--error ER_VIEW_NO_EXPLAIN
explain select c from mysqltest.v1;
--- error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
show create view mysqltest.v1;
--- error 1345
+--error ER_VIEW_NO_EXPLAIN
explain select c from mysqltest.v2;
--- error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
show create view mysqltest.v2;
--- error 1345
+--error ER_VIEW_NO_EXPLAIN
explain select c from mysqltest.v3;
--- error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
show create view mysqltest.v3;
--- error 1345
+--error ER_VIEW_NO_EXPLAIN
explain select c from mysqltest.v4;
--- error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
show create view mysqltest.v4;
# allow to see one of underlying table
@@ -162,19 +165,19 @@ grant select on mysqltest.t1 to mysqltest_1@localhost;
connection user1;
# EXPLAIN of view on above table works
explain select c from mysqltest.v1;
--- error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
show create view mysqltest.v1;
explain select c from mysqltest.v2;
--- error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
show create view mysqltest.v2;
# but other EXPLAINs do not
--- error 1345
+--error ER_VIEW_NO_EXPLAIN
explain select c from mysqltest.v3;
--- error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
show create view mysqltest.v3;
--- error 1345
+--error ER_VIEW_NO_EXPLAIN
explain select c from mysqltest.v4;
--- error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
show create view mysqltest.v4;
# allow to see any view in mysqltest database
@@ -228,14 +231,14 @@ select * from t1;
update v2 set a=a+c;
select * from t1;
# no rights on column
--- error 1143
+--error ER_COLUMNACCESS_DENIED_ERROR
update t2,v2 set v2.c=v2.a+v2.c where t2.x=v2.c;
--- error 1143
+--error ER_COLUMNACCESS_DENIED_ERROR
update v2 set c=a+c;
# no rights for view
--- error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
update t2,v3 set v3.a=v3.a+v3.c where t2.x=v3.c;
--- error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
update v3 set a=a+c;
use test;
@@ -269,9 +272,9 @@ select * from t1;
delete v1 from t2,v1 where t2.x=v1.c;
select * from t1;
# no rights for view
--- error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
delete v2 from t2,v2 where t2.x=v2.c;
--- error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
delete from v2 where c < 4;
use test;
@@ -305,9 +308,9 @@ select * from t1;
insert into v1 select x,y from t2;
select * from t1;
# no rights for view
--- error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
insert into v2 values (5,6);
--- error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
insert into v2 select x,y from t2;
use test;
@@ -335,10 +338,10 @@ connection user1;
create view v1 as select * from mysqltest.t1;
create view v2 as select b from mysqltest.t2;
# There are not rights on mysqltest.v1
--- error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
create view mysqltest.v1 as select * from mysqltest.t1;
# There are not any rights on mysqltest.t2.a
--- error 1143
+--error ER_COLUMNACCESS_DENIED_ERROR
create view v3 as select a from mysqltest.t2;
# give CREATE VIEW privileges (without any privileges for result column)
@@ -358,13 +361,13 @@ create view mysqltest.v3 as select b from mysqltest.t2;
# Expression need select privileges
--- error 1143
+--error ER_COLUMNACCESS_DENIED_ERROR
create view v4 as select b+1 from mysqltest.t2;
connection root;
grant create view,update,select on test.* to mysqltest_1@localhost;
connection user1;
--- error 1143
+--error ER_COLUMNACCESS_DENIED_ERROR
create view v4 as select b+1 from mysqltest.t2;
connection root;
@@ -417,7 +420,7 @@ connection root;
# check view definer information
show create view v1;
revoke select on mysqltest.t1 from mysqltest_1@localhost;
--- error ER_VIEW_INVALID
+--error ER_VIEW_INVALID
select * from v1;
grant select on mysqltest.t1 to mysqltest_1@localhost;
select * from v1;
@@ -426,7 +429,7 @@ drop view v1;
drop database mysqltest;
#
-# rights on execution of view underlying functiond (BUG#9505)
+# rights on execution of view underlying functiond (Bug#9505)
#
connection root;
--disable_warnings
@@ -459,11 +462,11 @@ connection user1;
use mysqltest;
select * from v1;
select * from v2;
--- error ER_VIEW_INVALID
+--error ER_VIEW_INVALID
select * from v3;
--- error ER_VIEW_INVALID
+--error ER_VIEW_INVALID
select * from v4;
--- error ER_VIEW_INVALID
+--error ER_VIEW_INVALID
select * from v5;
use test;
@@ -511,13 +514,13 @@ use test;
connection root;
create view v5 as select * from v1;
revoke execute on function f2 from mysqltest_1@localhost;
--- error ER_VIEW_INVALID
+--error ER_VIEW_INVALID
select * from v1;
--- error ER_VIEW_INVALID
+--error ER_VIEW_INVALID
select * from v2;
select * from v3;
select * from v4;
--- error ER_VIEW_INVALID
+--error ER_VIEW_INVALID
select * from v5;
drop view v1, v2, v3, v4, v5;
@@ -555,13 +558,13 @@ use test;
connection root;
revoke select on t1 from mysqltest_1@localhost;
--- error ER_VIEW_INVALID
+--error ER_VIEW_INVALID
select * from v1;
--- error ER_VIEW_INVALID
+--error ER_VIEW_INVALID
select * from v2;
select * from v3;
select * from v4;
--- error ER_VIEW_INVALID
+--error ER_VIEW_INVALID
select * from v5;
#drop view v1, v2, v3, v4, v5;
@@ -594,11 +597,11 @@ connection user1;
use mysqltest;
select * from v1;
select * from v2;
--- error ER_VIEW_INVALID
+--error ER_VIEW_INVALID
select * from v3;
--- error ER_VIEW_INVALID
+--error ER_VIEW_INVALID
select * from v4;
--- error ER_VIEW_INVALID
+--error ER_VIEW_INVALID
select * from v5;
use test;
@@ -610,7 +613,7 @@ REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_1@localhost;
drop database mysqltest;
#
-# BUG#14256: definer in view definition is not fully qualified
+# Bug#14256 definer in view definition is not fully qualified
#
--disable_warnings
drop view if exists v1;
@@ -647,6 +650,7 @@ drop view v1;
select @v1def1, @v1def2, @v1def1=@v1def2;
connection root;
+disconnect test14256;
drop user test14256;
# Restore the anonymous users.
@@ -656,8 +660,8 @@ flush privileges;
drop table t1;
#
-# BUG#14726: freeing stack variable in case of an error of opening
-# a view when we have locked tables with LOCK TABLES statement.
+# Bug#14726 freeing stack variable in case of an error of opening a view when
+# we have locked tables with LOCK TABLES statement.
#
connection root;
--disable_warnings
@@ -674,7 +678,7 @@ connection user1;
use mysqltest;
LOCK TABLES v1 READ;
--- error ER_TABLEACCESS_DENIED_ERROR
+--error ER_TABLEACCESS_DENIED_ERROR
SHOW CREATE TABLE v1;
UNLOCK TABLES;
use test;
@@ -685,7 +689,7 @@ drop user mysqltest_1@localhost;
drop database mysqltest;
#
-# switch to default connaction
+# switch to default connection
#
disconnect user1;
disconnect root;
@@ -702,7 +706,7 @@ drop view v1;
drop view v2;
#
-# Bug#18681: View privileges are broken
+# Bug#18681 View privileges are broken
#
CREATE DATABASE mysqltest1;
CREATE USER readonly@localhost;
@@ -723,54 +727,55 @@ GRANT UPDATE,SELECT ON mysqltest1.v_tus TO readonly@localhost;
GRANT DELETE ON mysqltest1.v_td TO readonly@localhost;
GRANT DELETE,SELECT ON mysqltest1.v_tds TO readonly@localhost;
-CONNECT (n1,localhost,readonly,,);
-CONNECTION n1;
+connect (n1,localhost,readonly,,);
+connection n1;
---error 1356
+--error ER_VIEW_INVALID
SELECT * FROM mysqltest1.v_t1;
---error 1356
+--error ER_VIEW_INVALID
INSERT INTO mysqltest1.v_t1 VALUES(4);
---error 1356
+--error ER_VIEW_INVALID
DELETE FROM mysqltest1.v_t1 WHERE x = 1;
---error 1356
+--error ER_VIEW_INVALID
UPDATE mysqltest1.v_t1 SET x = 3 WHERE x = 2;
---error 1356
+--error ER_VIEW_INVALID
UPDATE mysqltest1.v_t1 SET x = 3;
---error 1356
+--error ER_VIEW_INVALID
DELETE FROM mysqltest1.v_t1;
---error 1356
+--error ER_VIEW_INVALID
SELECT 1 FROM mysqltest1.v_t1;
---error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
SELECT * FROM mysqltest1.t1;
SELECT * FROM mysqltest1.v_ts;
---error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
SELECT * FROM mysqltest1.v_ts, mysqltest1.t1 WHERE mysqltest1.t1.x = mysqltest1.v_ts.x;
---error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
SELECT * FROM mysqltest1.v_ti;
---error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
INSERT INTO mysqltest1.v_ts VALUES (100);
INSERT INTO mysqltest1.v_ti VALUES (100);
---error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
UPDATE mysqltest1.v_ts SET x= 200 WHERE x = 100;
---error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
UPDATE mysqltest1.v_ts SET x= 200;
UPDATE mysqltest1.v_tu SET x= 200 WHERE x = 100;
UPDATE mysqltest1.v_tus SET x= 200 WHERE x = 100;
UPDATE mysqltest1.v_tu SET x= 200;
---error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
DELETE FROM mysqltest1.v_ts WHERE x= 200;
---error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
DELETE FROM mysqltest1.v_ts;
---error 1143
+--error ER_COLUMNACCESS_DENIED_ERROR
DELETE FROM mysqltest1.v_td WHERE x= 200;
DELETE FROM mysqltest1.v_tds WHERE x= 200;
DELETE FROM mysqltest1.v_td;
-CONNECTION default;
+connection default;
+disconnect n1;
DROP VIEW mysqltest1.v_tds;
DROP VIEW mysqltest1.v_td;
DROP VIEW mysqltest1.v_tus;
@@ -783,21 +788,21 @@ DROP USER readonly@localhost;
DROP DATABASE mysqltest1;
#
-# BUG#14875: Bad view DEFINER makes SHOW CREATE VIEW fail
+# Bug#14875 Bad view DEFINER makes SHOW CREATE VIEW fail
#
CREATE TABLE t1 (a INT PRIMARY KEY);
INSERT INTO t1 VALUES (1), (2), (3);
CREATE DEFINER = 'no-such-user'@localhost VIEW v AS SELECT a from t1;
-#--warning 1448
+#--warning ER_VIEW_OTHER_USER
SHOW CREATE VIEW v;
---error 1449
+--error ER_NO_SUCH_USER
SELECT * FROM v;
DROP VIEW v;
DROP TABLE t1;
USE test;
#
-# Bug#20363: Create view on just created view is now denied
+# Bug#20363 Create view on just created view is now denied
#
eval CREATE USER mysqltest_db1@localhost identified by 'PWD';
eval GRANT ALL ON mysqltest_db1.* TO mysqltest_db1@localhost WITH GRANT OPTION;
@@ -828,6 +833,7 @@ SELECT * FROM view2;
SELECT * from view3;
connection default;
+disconnect session1;
DROP VIEW mysqltest_db1.view3;
DROP VIEW mysqltest_db1.view2;
DROP VIEW mysqltest_db1.view1;
@@ -835,8 +841,8 @@ DROP TABLE mysqltest_db1.t1;
DROP SCHEMA mysqltest_db1;
DROP USER mysqltest_db1@localhost;
#
-# BUG#20482: failure on Create join view with sources views/tables
-# in different schemas
+# Bug#20482 failure on Create join view with sources views/tables
+# in different schemas
#
--disable_warnings
CREATE DATABASE test1;
@@ -846,7 +852,7 @@ CREATE DATABASE test2;
CREATE TABLE test1.t0 (a VARCHAR(20));
CREATE TABLE test2.t1 (a VARCHAR(20));
CREATE VIEW test2.t3 AS SELECT * FROM test1.t0;
-CREATE OR REPLACE VIEW test.v1 AS
+CREATE OR REPLACE VIEW test.v1 AS
SELECT ta.a AS col1, tb.a AS col2 FROM test2.t3 ta, test2.t1 tb;
DROP VIEW test.v1;
@@ -857,8 +863,8 @@ DROP DATABASE test1;
#
-# BUG#20570: CURRENT_USER() in a VIEW with SQL SECURITY DEFINER
-# returns invoker name
+# Bug#20570 CURRENT_USER() in a VIEW with SQL SECURITY DEFINER returns
+# invoker name
#
--disable_warnings
DROP VIEW IF EXISTS v1;
@@ -917,7 +923,7 @@ DROP USER mysqltest_u1@localhost;
#
-# Bug#17254: Error for DEFINER security on VIEW provides too much info
+# Bug#17254 Error for DEFINER security on VIEW provides too much info
#
connect (root,localhost,root,,);
connection root;
@@ -941,12 +947,12 @@ DROP USER def_17254@localhost;
connect (inv,localhost,inv_17254,,db17254);
connection inv;
--echo for a user
---error 1142
+--error ER_TABLEACCESS_DENIED_ERROR
SELECT * FROM v1;
connection root;
--echo for a superuser
---error 1449
+--error ER_NO_SUCH_USER
SELECT * FROM v1;
DROP USER inv_17254@localhost;
DROP DATABASE db17254;
@@ -955,7 +961,7 @@ disconnect inv;
#
-# BUG#24404: strange bug with view+permission+prepared statement
+# Bug#24404 strange bug with view+permission+prepared statement
#
--disable_warnings
DROP DATABASE IF EXISTS mysqltest_db1;
@@ -1023,8 +1029,8 @@ DROP USER mysqltest_u1@localhost;
DROP USER mysqltest_u2@localhost;
#
-# Bug#26813: The SUPER privilege is wrongly required to alter a view created
-# by another user.
+# Bug#26813 The SUPER privilege is wrongly required to alter a view created
+# by another user.
#
connection root;
CREATE DATABASE db26813;
@@ -1056,7 +1062,7 @@ DROP DATABASE db26813;
disconnect u1;
--echo #
---echo # Bug#29908: A user can gain additional access through the ALTER VIEW.
+--echo # Bug#29908 A user can gain additional access through the ALTER VIEW.
--echo #
connection root;
CREATE DATABASE mysqltest_29908;
@@ -1101,7 +1107,7 @@ disconnect u2;
--echo #######################################################################
#
-# BUG#24040: Create View don't succed with "all privileges" on a database.
+# Bug#24040 Create View don't succed with "all privileges" on a database.
#
# Prepare.
@@ -1185,12 +1191,52 @@ SELECT * FROM mysqltest1.t4;
# Cleanup.
--- disconnect bug24040_con
+disconnect bug24040_con;
DROP DATABASE mysqltest1;
DROP DATABASE mysqltest2;
DROP USER mysqltest_u1@localhost;
+
+#
+# Bug#41354 Access control is bypassed when all columns of a view are
+# selected by * wildcard
+
+CREATE DATABASE db1;
+USE db1;
+CREATE TABLE t1(f1 INT, f2 INT);
+CREATE VIEW v1 AS SELECT f1, f2 FROM t1;
+
+GRANT SELECT (f1) ON t1 TO foo;
+GRANT SELECT (f1) ON v1 TO foo;
+
+connect (addconfoo, localhost, foo,,);
+connection addconfoo;
+USE db1;
+
+SELECT f1 FROM t1;
+--error ER_COLUMNACCESS_DENIED_ERROR
+SELECT f2 FROM t1;
+--error ER_TABLEACCESS_DENIED_ERROR
+SELECT * FROM t1;
+
+SELECT f1 FROM v1;
+--error ER_COLUMNACCESS_DENIED_ERROR
+SELECT f2 FROM v1;
+--error ER_TABLEACCESS_DENIED_ERROR
+SELECT * FROM v1;
+
+connection default;
+disconnect root;
+disconnect addconfoo;
+USE test;
+REVOKE SELECT (f1) ON db1.t1 FROM foo;
+REVOKE SELECT (f1) ON db1.v1 FROM foo;
+DROP USER foo;
+DROP VIEW db1.v1;
+DROP TABLE db1.t1;
+DROP DATABASE db1;
+
--echo End of 5.0 tests.
@@ -1218,6 +1264,44 @@ SHOW CREATE VIEW v1;
DROP VIEW v1;
DROP TABLE t1;
+#
+# Bug#37191: Failed assertion in CREATE VIEW
+#
+CREATE USER mysqluser1@localhost;
+CREATE DATABASE mysqltest1;
+
+USE mysqltest1;
+
+CREATE TABLE t1 ( a INT );
+CREATE TABLE t2 ( b INT );
+
+INSERT INTO t1 VALUES (1), (2);
+INSERT INTO t2 VALUES (1), (2);
+
+GRANT CREATE VIEW ON mysqltest1.* TO mysqluser1@localhost;
+
+GRANT SELECT ON t1 TO mysqluser1@localhost;
+GRANT INSERT ON t2 TO mysqluser1@localhost;
+
+--connect (connection1, localhost, mysqluser1, , mysqltest1)
+
+--echo This would lead to failed assertion.
+CREATE VIEW v1 AS SELECT a, b FROM t1, t2;
+
+--error ER_TABLEACCESS_DENIED_ERROR
+SELECT * FROM v1;
+--error ER_TABLEACCESS_DENIED_ERROR
+SELECT b FROM v1;
+
+--disconnect connection1
+--connection default
+
+DROP TABLE t1, t2;
+DROP VIEW v1;
+DROP DATABASE mysqltest1;
+DROP USER mysqluser1@localhost;
+USE test;
+
--echo End of 5.1 tests.
#
@@ -1254,8 +1338,8 @@ DROP DATABASE mysqltest1;
DROP USER mysqluser1@localhost;
#
-# Bug#35600: Security breach via view, I_S table and prepared
-# statement/stored procedure
+# Bug#35600 Security breach via view, I_S table and prepared
+# statement/stored procedure
#
CREATE USER mysqluser1@localhost;
CREATE DATABASE mysqltest1;
@@ -1296,3 +1380,8 @@ DROP VIEW v1, v2;
DROP DATABASE mysqltest1;
DROP VIEW test.v3;
DROP USER mysqluser1@localhost;
+USE test;
+
+# Wait till we reached the initial number of concurrent sessions
+--source include/wait_until_count_sessions.inc
+
diff --git a/mysql-test/t/wait_timeout.test b/mysql-test/t/wait_timeout.test
index 63809252a01..6947e346675 100644
--- a/mysql-test/t/wait_timeout.test
+++ b/mysql-test/t/wait_timeout.test
@@ -10,8 +10,11 @@
-- source include/not_embedded.inc
-- source include/one_thread_per_connection.inc
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
+
#
-# Bug#8731: wait_timeout does not work on Mac OS X
+# Bug#8731 wait_timeout does not work on Mac OS X
#
let $start_value= `SELECT @@global.wait_timeout`;
@@ -113,6 +116,7 @@ while (!`select @aborted_clients`)
# the disconnect has reached client
let $wait_condition= SELECT COUNT(*)=1 FROM information_schema.processlist;
--source include/wait_condition.inc
+disconnect wait_con;
--echo connection con1;
connection con1;
@@ -126,8 +130,13 @@ SELECT 2;
SELECT 3;
--replace_result $start_value <start_value>
eval SET @@global.wait_timeout= $start_value;
-# ML: The start value might be changed in future ...
--echo disconnection con1;
disconnect con1;
+# The last connect is to keep tools checking the current test happy.
+connect (default,localhost,root,,test,,);
+
+# Wait till all disconnects are completed
+--source include/wait_until_count_sessions.inc
+
diff --git a/mysql-test/t/xa.test b/mysql-test/t/xa.test
index 591d7ac2c4d..04ecf518577 100644
--- a/mysql-test/t/xa.test
+++ b/mysql-test/t/xa.test
@@ -2,6 +2,10 @@
# WL#1756
#
-- source include/have_innodb.inc
+
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
+
--disable_warnings
drop table if exists t1, t2;
--enable_warnings
@@ -14,10 +18,10 @@ xa rollback 'test1';
select * from t1;
xa start 'test2';
---error 1399
+--error ER_XAER_RMFAIL
xa start 'test-bad';
insert t1 values (20);
---error 1399
+--error ER_XAER_RMFAIL
xa prepare 'test2';
xa end 'test2';
xa prepare 'test2';
@@ -27,22 +31,22 @@ select * from t1;
xa start 'testa','testb';
insert t1 values (30);
---error 1399
+--error ER_XAER_RMFAIL
commit;
xa end 'testa','testb';
---error 1399
+--error ER_XAER_RMFAIL
begin;
---error 1399
+--error ER_XAER_RMFAIL
create table t2 (a int);
connect (con1,localhost,root,,);
connection con1;
---error 1440
+--error ER_XAER_DUPID
xa start 'testa','testb';
---error 1440
+--error ER_XAER_DUPID
xa start 'testa','testb', 123;
# gtrid [ , bqual [ , formatID ] ]
@@ -51,7 +55,7 @@ insert t1 values (40);
xa end 'testb',' 0@P`',11;
xa prepare 'testb',0x2030405060,11;
---error 1399
+--error ER_XAER_RMFAIL
start transaction;
xa recover;
@@ -64,11 +68,11 @@ xa prepare 'testa','testb';
xa recover;
---error 1397
+--error ER_XAER_NOTA
xa commit 'testb',0x2030405060,11;
xa rollback 'testa','testb';
---error 1064
+--error ER_PARSE_ERROR
xa start 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz';
select * from t1;
@@ -119,3 +123,7 @@ xa start 'a','c';
drop table t1;
--echo End of 5.0 tests
+
+# Wait till all disconnects are completed
+--source include/wait_until_count_sessions.inc
+
diff --git a/mysys/default.c b/mysys/default.c
index 6b2b31d43ec..a6995dbbd24 100644
--- a/mysys/default.c
+++ b/mysys/default.c
@@ -144,6 +144,7 @@ static char *remove_end_comment(char *ptr);
RETURN
0 ok
1 given cinf_file doesn't exist
+ 2 out of memory
The global variable 'my_defaults_group_suffix' is updated with value for
--defaults_group_suffix
@@ -151,7 +152,7 @@ static char *remove_end_comment(char *ptr);
int my_search_option_files(const char *conf_file, int *argc, char ***argv,
uint *args_used, Process_option_func func,
- void *func_ctx)
+ void *func_ctx, const char **default_directories)
{
const char **dirs, *forced_default_file, *forced_extra_defaults;
int error= 0;
@@ -190,7 +191,7 @@ int my_search_option_files(const char *conf_file, int *argc, char ***argv,
if (!(extra_groups=
(const char**)alloc_root(ctx->alloc,
(2*group->count+1)*sizeof(char*))))
- goto err;
+ DBUG_RETURN(2);
for (i= 0; i < group->count; i++)
{
@@ -199,7 +200,7 @@ int my_search_option_files(const char *conf_file, int *argc, char ***argv,
len= strlen(extra_groups[i]);
if (!(ptr= alloc_root(ctx->alloc, len+instance_len+1)))
- goto err;
+ DBUG_RETURN(2);
extra_groups[i+group->count]= ptr;
@@ -254,12 +255,11 @@ int my_search_option_files(const char *conf_file, int *argc, char ***argv,
}
}
- DBUG_RETURN(error);
+ DBUG_RETURN(0);
err:
fprintf(stderr,"Fatal error in defaults handling. Program aborted\n");
- exit(1);
- return 0; /* Keep compiler happy */
+ DBUG_RETURN(1);
}
@@ -359,18 +359,46 @@ int get_defaults_options(int argc, char **argv,
return org_argc - argc;
}
+/*
+ Wrapper around my_load_defaults() for interface compatibility.
+
+ SYNOPSIS
+ load_defaults()
+ conf_file Basename for configuration file to search for.
+ If this is a path, then only this file is read.
+ groups Which [group] entrys to read.
+ Points to an null terminated array of pointers
+ argc Pointer to argc of original program
+ argv Pointer to argv of original program
+
+ NOTES
+
+ This function is NOT thread-safe as it uses a global pointer internally.
+ See also notes for my_load_defaults().
+
+ RETURN
+ 0 ok
+ 1 The given conf_file didn't exists
+*/
+int load_defaults(const char *conf_file, const char **groups,
+ int *argc, char ***argv)
+{
+ return my_load_defaults(conf_file, groups, argc, argv, &default_directories);
+}
/*
Read options from configurations files
SYNOPSIS
- load_defaults()
+ my_load_defaults()
conf_file Basename for configuration file to search for.
If this is a path, then only this file is read.
groups Which [group] entrys to read.
Points to an null terminated array of pointers
argc Pointer to argc of original program
argv Pointer to argv of original program
+ default_directories Pointer to a location where a pointer to the list
+ of default directories will be stored
IMPLEMENTATION
@@ -386,13 +414,18 @@ int get_defaults_options(int argc, char **argv,
that was put in *argv
RETURN
- 0 ok
- 1 The given conf_file didn't exists
+ - If successful, 0 is returned. If 'default_directories' is not NULL,
+ a pointer to the array of default directory paths is stored to a location
+ it points to. That stored value must be passed to my_search_option_files()
+ later.
+
+ - 1 is returned if the given conf_file didn't exist. In this case, the
+ value pointed to by default_directories is undefined.
*/
-int load_defaults(const char *conf_file, const char **groups,
- int *argc, char ***argv)
+int my_load_defaults(const char *conf_file, const char **groups,
+ int *argc, char ***argv, const char ***default_directories)
{
DYNAMIC_ARRAY args;
TYPELIB group;
@@ -402,10 +435,11 @@ int load_defaults(const char *conf_file, const char **groups,
MEM_ROOT alloc;
char *ptr,**res;
struct handle_option_ctx ctx;
+ const char **dirs;
DBUG_ENTER("load_defaults");
init_alloc_root(&alloc,512,0);
- if ((default_directories= init_default_directories(&alloc)) == NULL)
+ if ((dirs= init_default_directories(&alloc)) == NULL)
goto err;
/*
Check if the user doesn't want any default option processing
@@ -426,6 +460,8 @@ int load_defaults(const char *conf_file, const char **groups,
(*argc)--;
*argv=res;
*(MEM_ROOT*) ptr= alloc; /* Save alloc root for free */
+ if (default_directories)
+ *default_directories= dirs;
DBUG_RETURN(0);
}
@@ -444,7 +480,8 @@ int load_defaults(const char *conf_file, const char **groups,
ctx.group= &group;
error= my_search_option_files(conf_file, argc, argv, &args_used,
- handle_default_option, (void *) &ctx);
+ handle_default_option, (void *) &ctx,
+ dirs);
/*
Here error contains <> 0 only if we have a fully specified conf_file
or a forced default file
@@ -490,6 +527,10 @@ int load_defaults(const char *conf_file, const char **groups,
puts("");
exit(0);
}
+
+ if (error == 0 && default_directories)
+ *default_directories= dirs;
+
DBUG_RETURN(error);
err:
@@ -895,15 +936,11 @@ void my_print_default_files(const char *conf_file)
fputs(conf_file,stdout);
else
{
- /*
- If default_directories is already initialized, use it. Otherwise,
- use a private MEM_ROOT.
- */
- const char **dirs = default_directories;
+ const char **dirs;
MEM_ROOT alloc;
init_alloc_root(&alloc,512,0);
- if (!dirs && (dirs= init_default_directories(&alloc)) == NULL)
+ if ((dirs= init_default_directories(&alloc)) == NULL)
{
fputs("Internal error initializing default directories list", stdout);
}
diff --git a/mysys/errors.c b/mysys/errors.c
index 537a75c6ef3..8d3303cac9f 100644
--- a/mysys/errors.c
+++ b/mysys/errors.c
@@ -39,7 +39,7 @@ const char * NEAR globerrs[GLOBERRS]=
"Can't change dir to '%s' (Errcode: %d)",
"Warning: '%s' had %d links",
"Warning: %d files and %d streams is left open\n",
- "Disk is full writing '%s' (Errcode: %d). Waiting for someone to free space... Retry in %d secs",
+ "Disk is full writing '%s' (Errcode: %d). Waiting for someone to free space... (Expect up to %d secs delay for server to continue after freeing disk space)",
"Can't create directory '%s' (Errcode: %d)",
"Character set '%s' is not a compiled character set and is not specified in the '%s' file",
"Out of resources when opening file '%s' (Errcode: %d)",
@@ -92,3 +92,17 @@ void init_glob_errs()
EE(EE_FILE_NOT_CLOSED) = "File '%s' (fileno: %d) was not closed";
}
#endif
+
+void wait_for_free_space(const char *filename, int errors)
+{
+ if (errors == 0)
+ my_error(EE_DISK_FULL,MYF(ME_BELL | ME_NOREFRESH),
+ filename,my_errno,MY_WAIT_FOR_USER_TO_FIX_PANIC);
+ if (!(errors % MY_WAIT_GIVE_USER_A_MESSAGE))
+ my_printf_error(EE_DISK_FULL,
+ "Retry in %d secs. Message reprinted in %d secs",
+ MYF(ME_BELL | ME_NOREFRESH),
+ MY_WAIT_FOR_USER_TO_FIX_PANIC,
+ MY_WAIT_GIVE_USER_A_MESSAGE * MY_WAIT_FOR_USER_TO_FIX_PANIC );
+ VOID(sleep(MY_WAIT_FOR_USER_TO_FIX_PANIC));
+}
diff --git a/mysys/md5.c b/mysys/md5.c
index 0945f9ce5f4..2388cebedc4 100644
--- a/mysys/md5.c
+++ b/mysys/md5.c
@@ -13,356 +13,313 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
+/*
+ * This code implements the MD5 message-digest algorithm.
+ * The algorithm is due to Ron Rivest. This code was
+ * written by Colin Plumb in 1993, no copyright is claimed.
+ * This code is in the public domain; do with it what you wish.
+ *
+ * Equivalent code is available from RSA Data Security, Inc.
+ * This code has been tested against that, and is equivalent,
+ * except that you don't need to include two pages of legalese
+ * with every copy.
+ *
+ * To compute the message digest of a chunk of bytes, declare an
+ * MD5Context structure, pass it to MD5Init, call MD5Update as
+ * needed on buffers full of bytes, and then call MD5Final, which
+ * will fill a supplied 16-byte array with the digest.
*/
-/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
-rights reserved.
-
-License to copy and use this software is granted provided that it
-is identified as the "RSA Data Security, Inc. MD5 Message-Digest
-Algorithm" in all material mentioning or referencing this software
-or this function.
-
-License is also granted to make and use derivative works provided
-that such works are identified as "derived from the RSA Data
-Security, Inc. MD5 Message-Digest Algorithm" in all material
-mentioning or referencing the derived work.
-
-RSA Data Security, Inc. makes no representations concerning either
-the merchantability of this software or the suitability of this
-software for any particular purpose. It is provided "as is"
-without express or implied warranty of any kind.
-
-These notices must be retained in any copies of any part of this
-documentation and/or software.
-*/
-
-/*
- Changes by Monty:
- Replace of MD5_memset and MD5_memcpy with memset & memcpy
-*/
+/* This code was modified in 1997 by Jim Kingdon of Cyclic Software to
+ not require an integer type which is exactly 32 bits. This work
+ draws on the changes for the same purpose by Tatu Ylonen
+ <ylo@cs.hut.fi> as part of SSH, but since I didn't actually use
+ that code, there is no copyright issue. I hereby disclaim
+ copyright in any changes I have made; this code remains in the
+ public domain. */
#include <my_global.h>
#include <m_string.h>
#include "my_md5.h"
-/* Constants for MD5Transform routine. */
-
-#define S11 7
-#define S12 12
-#define S13 17
-#define S14 22
-#define S21 5
-#define S22 9
-#define S23 14
-#define S24 20
-#define S31 4
-#define S32 11
-#define S33 16
-#define S34 23
-#define S41 6
-#define S42 10
-#define S43 15
-#define S44 21
-
-
-static void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64]));
-static void Encode PROTO_LIST
- ((unsigned char *, UINT4 *, unsigned int));
-static void Decode PROTO_LIST
- ((UINT4 *, unsigned char *, unsigned int));
-#ifdef OLD_CODE
-static void MD5_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int));
-static void MD5_memset PROTO_LIST ((POINTER, int, unsigned int));
-#else
-#define MD5_memcpy(A,B,C) memcpy((char*) (A),(char*) (B), (C))
-#define MD5_memset(A,B,C) memset((char*) (A),(B), (C))
-#endif
+#include <string.h> /* for memcpy() and memset() */
-static unsigned char PADDING[64] = {
- 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-/* F, G, H and I are basic MD5 functions.
- */
-#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
-#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
-#define H(x, y, z) ((x) ^ (y) ^ (z))
-#define I(x, y, z) ((y) ^ ((x) | (~z)))
+static void
+my_MD5Transform (cvs_uint32 buf[4], const unsigned char in[64]);
-/* ROTATE_LEFT rotates x left n bits.
- */
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
+/* Little-endian byte-swapping routines. Note that these do not
+ depend on the size of datatypes such as uint32, nor do they require
+ us to detect the endianness of the machine we are running on. It
+ is possible they should be macros for speed, but I would be
+ surprised if they were a performance bottleneck for MD5. */
-/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
-Rotation is separate from addition to prevent recomputation.
- */
-#define FF(a, b, c, d, x, s, ac) { \
- (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-#define GG(a, b, c, d, x, s, ac) { \
- (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-#define HH(a, b, c, d, x, s, ac) { \
- (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-#define II(a, b, c, d, x, s, ac) { \
- (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-
-/* MD5 initialization. Begins an MD5 operation, writing a new context.
- */
-void my_MD5Init (my_MD5_CTX *context) /* context */
+static uint32 getu32 (const unsigned char *addr)
{
- context->count[0] = context->count[1] = 0;
- /* Load magic initialization constants.
-*/
- context->state[0] = 0x67452301;
- context->state[1] = 0xefcdab89;
- context->state[2] = 0x98badcfe;
- context->state[3] = 0x10325476;
+ return (((((unsigned long)addr[3] << 8) | addr[2]) << 8)
+ | addr[1]) << 8 | addr[0];
}
-/* MD5 block update operation. Continues an MD5 message-digest
- operation, processing another message block, and updating the
- context.
- */
-
-void my_MD5Update (
-my_MD5_CTX *context, /* context */
-unsigned char *input, /* input block */
-unsigned int inputLen) /* length of input block */
+static void
+putu32 (uint32 data, unsigned char *addr)
{
- unsigned int i, idx, partLen;
-
- /* Compute number of bytes mod 64 */
- idx = (unsigned int)((context->count[0] >> 3) & 0x3F);
-
+ addr[0] = (unsigned char)data;
+ addr[1] = (unsigned char)(data >> 8);
+ addr[2] = (unsigned char)(data >> 16);
+ addr[3] = (unsigned char)(data >> 24);
+}
- /* Update number of bits */
- if ((context->count[0] += ((UINT4)inputLen << 3))
- < ((UINT4)inputLen << 3))
- context->count[1]++;
- context->count[1] += ((UINT4)inputLen >> 29);
+/*
+ Start MD5 accumulation. Set bit count to 0 and buffer to mysterious
+ initialization constants.
+*/
+void
+my_MD5Init (my_MD5Context *ctx)
+{
+ ctx->buf[0] = 0x67452301;
+ ctx->buf[1] = 0xefcdab89;
+ ctx->buf[2] = 0x98badcfe;
+ ctx->buf[3] = 0x10325476;
- partLen = 64 - idx;
+ ctx->bits[0] = 0;
+ ctx->bits[1] = 0;
+}
- /* Transform as many times as possible.
+/*
+ Update context to reflect the concatenation of another buffer full
+ of bytes.
*/
- if (inputLen >= partLen) {
- MD5_memcpy((POINTER)&context->buffer[idx], (POINTER)input, partLen);
- MD5Transform(context->state, context->buffer);
+void
+my_MD5Update (my_MD5Context *ctx, unsigned char const *buf, unsigned len)
+{
+ uint32 t;
- for (i = partLen; i + 63 < inputLen; i += 64)
- MD5Transform (context->state, &input[i]);
+ /* Update bitcount */
- idx = 0;
- }
- else
- i = 0;
+ t = ctx->bits[0];
+ if ((ctx->bits[0] = (t + ((uint32)len << 3)) & 0xffffffff) < t)
+ ctx->bits[1]++; /* Carry from low to high */
+ ctx->bits[1] += len >> 29;
- /* Buffer remaining input */
- MD5_memcpy((POINTER)&context->buffer[idx], (POINTER)&input[i],
- inputLen-i);
-}
+ t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */
-/* MD5 finalization. Ends an MD5 message-digest operation, writing the
- the message digest and zeroizing the context.
- */
+ /* Handle any leading odd-sized chunks */
-void my_MD5Final (
-unsigned char digest[16], /* message digest */
-my_MD5_CTX *context) /* context */
-{
- unsigned char bits[8];
- unsigned int idx, padLen;
+ if ( t ) {
+ unsigned char *p = ctx->in + t;
- /* Save number of bits */
- Encode (bits, context->count, 8);
+ t = 64-t;
+ if (len < t) {
+ memcpy(p, buf, len);
+ return;
+ }
+ memcpy(p, buf, t);
+ my_MD5Transform (ctx->buf, ctx->in);
+ buf += t;
+ len -= t;
+ }
- /* Pad out to 56 mod 64.
-*/
- idx = (unsigned int)((context->count[0] >> 3) & 0x3f);
- padLen = (idx < 56) ? (56 - idx) : (120 - idx);
- my_MD5Update (context, PADDING, padLen);
+ /* Process data in 64-byte chunks */
- /* Append length (before padding) */
- my_MD5Update (context, bits, 8);
+ while (len >= 64) {
+ memcpy(ctx->in, buf, 64);
+ my_MD5Transform (ctx->buf, ctx->in);
+ buf += 64;
+ len -= 64;
+ }
- /* Store state in digest */
- Encode (digest, context->state, 16);
+ /* Handle any remaining bytes of data. */
- /* Zeroize sensitive information.
-*/
- MD5_memset ((POINTER)context, 0, sizeof (*context));
+ memcpy(ctx->in, buf, len);
}
-/* MD5 basic transformation. Transforms state based on block.
- */
-static void MD5Transform (
-UINT4 state[4],
-unsigned char block[64])
-{
- UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
-
- Decode (x, block, 64);
-
- /* Round 1 */
- FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
- FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
- FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
- FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
- FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
- FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
- FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
- FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
- FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
- FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
- FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
- FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
- FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
- FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
- FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
- FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
-
- /* Round 2 */
- GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
- GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
- GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
- GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
- GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
- GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */
- GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
- GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
- GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
- GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
- GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
- GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
- GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
- GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
- GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
- GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
-
- /* Round 3 */
- HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
- HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
- HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
- HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
- HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
- HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
- HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
- HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
- HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
- HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
- HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
- HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
- HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
- HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
- HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
- HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
-
- /* Round 4 */
- II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
- II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
- II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
- II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
- II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
- II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
- II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
- II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
- II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
- II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
- II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
- II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
- II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
- II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
- II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
- II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
-
-
- state[0] += a;
- state[1] += b;
- state[2] += c;
- state[3] += d;
-
- /* Zeroize sensitive information.
+/*
+ Final wrapup - pad to 64-byte boundary with the bit pattern
+ 1 0* (64-bit count of bits processed, MSB-first)
*/
- MD5_memset ((POINTER)x, 0, sizeof (x));
-}
-
-/* Encodes input (UINT4) into output (unsigned char). Assumes len is
- a multiple of 4.
- */
-static void Encode (
-unsigned char *output,
-UINT4 *input,
-unsigned int len)
+void
+my_MD5Final (unsigned char digest[16], my_MD5Context *ctx)
{
- unsigned int i, j;
+ unsigned count;
+ unsigned char *p;
- for (i = 0, j = 0; j < len; i++, j += 4) {
- output[j] = (unsigned char)(input[i] & 0xff);
- output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
- output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
- output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
+ /* Compute number of bytes mod 64 */
+ count = (ctx->bits[0] >> 3) & 0x3F;
+
+ /* Set the first char of padding to 0x80. This is safe since there is
+ always at least one byte free */
+ p = ctx->in + count;
+ *p++ = 0x80;
+
+ /* Bytes of padding needed to make 64 bytes */
+ count = 64 - 1 - count;
+
+ /* Pad out to 56 mod 64 */
+ if (count < 8) {
+ /* Two lots of padding: Pad the first block to 64 bytes */
+ memset(p, 0, count);
+ my_MD5Transform (ctx->buf, ctx->in);
+
+ /* Now fill the next block with 56 bytes */
+ memset(ctx->in, 0, 56);
+ } else {
+ /* Pad block to 56 bytes */
+ memset(p, 0, count-8);
}
+
+ /* Append length in bits and transform */
+ putu32(ctx->bits[0], ctx->in + 56);
+ putu32(ctx->bits[1], ctx->in + 60);
+
+ my_MD5Transform (ctx->buf, ctx->in);
+ putu32(ctx->buf[0], digest);
+ putu32(ctx->buf[1], digest + 4);
+ putu32(ctx->buf[2], digest + 8);
+ putu32(ctx->buf[3], digest + 12);
+ memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */
}
+#ifndef ASM_MD5
-/* Decodes input (unsigned char) into output (UINT4). Assumes len is
- a multiple of 4.
- */
-static void Decode (
-UINT4 *output,
-unsigned char *input,
-unsigned int len)
-{
- unsigned int i, j;
+/* The four core functions - F1 is optimized somewhat */
- for (i = 0, j = 0; j < len; i++, j += 4)
- output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) |
- (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
-}
+/* #define F1(x, y, z) (x & y | ~x & z) */
+#define F1(x, y, z) (z ^ (x & (y ^ z)))
+#define F2(x, y, z) F1(z, x, y)
+#define F3(x, y, z) (x ^ y ^ z)
+#define F4(x, y, z) (y ^ (x | ~z))
-/* Note: Replace "for loop" with standard memcpy if possible.
- */
+/* This is the central step in the MD5 algorithm. */
+#define MD5STEP(f, w, x, y, z, data, s) \
+ ( w += f(x, y, z) + data, w &= 0xffffffff, w = w<<s | w>>(32-s), w += x )
-#ifndef MD5_memcpy
-static void MD5_memcpy (output, input, len)
-POINTER output;
-POINTER input;
-unsigned int len;
+/*
+ * The core of the MD5 algorithm, this alters an existing MD5 hash to
+ * reflect the addition of 16 longwords of new data. MD5Update blocks
+ * the data and converts bytes into longwords for this routine.
+ */
+static void
+my_MD5Transform (uint32 buf[4], const unsigned char inraw[64])
{
- unsigned int i;
-
- for (i = 0; i < len; i++)
- output[i] = input[i];
+ register uint32 a, b, c, d;
+ uint32 in[16];
+ int i;
+
+ for (i = 0; i < 16; ++i)
+ in[i] = getu32 (inraw + 4 * i);
+
+ a = buf[0];
+ b = buf[1];
+ c = buf[2];
+ d = buf[3];
+
+ MD5STEP(F1, a, b, c, d, in[ 0]+0xd76aa478, 7);
+ MD5STEP(F1, d, a, b, c, in[ 1]+0xe8c7b756, 12);
+ MD5STEP(F1, c, d, a, b, in[ 2]+0x242070db, 17);
+ MD5STEP(F1, b, c, d, a, in[ 3]+0xc1bdceee, 22);
+ MD5STEP(F1, a, b, c, d, in[ 4]+0xf57c0faf, 7);
+ MD5STEP(F1, d, a, b, c, in[ 5]+0x4787c62a, 12);
+ MD5STEP(F1, c, d, a, b, in[ 6]+0xa8304613, 17);
+ MD5STEP(F1, b, c, d, a, in[ 7]+0xfd469501, 22);
+ MD5STEP(F1, a, b, c, d, in[ 8]+0x698098d8, 7);
+ MD5STEP(F1, d, a, b, c, in[ 9]+0x8b44f7af, 12);
+ MD5STEP(F1, c, d, a, b, in[10]+0xffff5bb1, 17);
+ MD5STEP(F1, b, c, d, a, in[11]+0x895cd7be, 22);
+ MD5STEP(F1, a, b, c, d, in[12]+0x6b901122, 7);
+ MD5STEP(F1, d, a, b, c, in[13]+0xfd987193, 12);
+ MD5STEP(F1, c, d, a, b, in[14]+0xa679438e, 17);
+ MD5STEP(F1, b, c, d, a, in[15]+0x49b40821, 22);
+
+ MD5STEP(F2, a, b, c, d, in[ 1]+0xf61e2562, 5);
+ MD5STEP(F2, d, a, b, c, in[ 6]+0xc040b340, 9);
+ MD5STEP(F2, c, d, a, b, in[11]+0x265e5a51, 14);
+ MD5STEP(F2, b, c, d, a, in[ 0]+0xe9b6c7aa, 20);
+ MD5STEP(F2, a, b, c, d, in[ 5]+0xd62f105d, 5);
+ MD5STEP(F2, d, a, b, c, in[10]+0x02441453, 9);
+ MD5STEP(F2, c, d, a, b, in[15]+0xd8a1e681, 14);
+ MD5STEP(F2, b, c, d, a, in[ 4]+0xe7d3fbc8, 20);
+ MD5STEP(F2, a, b, c, d, in[ 9]+0x21e1cde6, 5);
+ MD5STEP(F2, d, a, b, c, in[14]+0xc33707d6, 9);
+ MD5STEP(F2, c, d, a, b, in[ 3]+0xf4d50d87, 14);
+ MD5STEP(F2, b, c, d, a, in[ 8]+0x455a14ed, 20);
+ MD5STEP(F2, a, b, c, d, in[13]+0xa9e3e905, 5);
+ MD5STEP(F2, d, a, b, c, in[ 2]+0xfcefa3f8, 9);
+ MD5STEP(F2, c, d, a, b, in[ 7]+0x676f02d9, 14);
+ MD5STEP(F2, b, c, d, a, in[12]+0x8d2a4c8a, 20);
+
+ MD5STEP(F3, a, b, c, d, in[ 5]+0xfffa3942, 4);
+ MD5STEP(F3, d, a, b, c, in[ 8]+0x8771f681, 11);
+ MD5STEP(F3, c, d, a, b, in[11]+0x6d9d6122, 16);
+ MD5STEP(F3, b, c, d, a, in[14]+0xfde5380c, 23);
+ MD5STEP(F3, a, b, c, d, in[ 1]+0xa4beea44, 4);
+ MD5STEP(F3, d, a, b, c, in[ 4]+0x4bdecfa9, 11);
+ MD5STEP(F3, c, d, a, b, in[ 7]+0xf6bb4b60, 16);
+ MD5STEP(F3, b, c, d, a, in[10]+0xbebfbc70, 23);
+ MD5STEP(F3, a, b, c, d, in[13]+0x289b7ec6, 4);
+ MD5STEP(F3, d, a, b, c, in[ 0]+0xeaa127fa, 11);
+ MD5STEP(F3, c, d, a, b, in[ 3]+0xd4ef3085, 16);
+ MD5STEP(F3, b, c, d, a, in[ 6]+0x04881d05, 23);
+ MD5STEP(F3, a, b, c, d, in[ 9]+0xd9d4d039, 4);
+ MD5STEP(F3, d, a, b, c, in[12]+0xe6db99e5, 11);
+ MD5STEP(F3, c, d, a, b, in[15]+0x1fa27cf8, 16);
+ MD5STEP(F3, b, c, d, a, in[ 2]+0xc4ac5665, 23);
+
+ MD5STEP(F4, a, b, c, d, in[ 0]+0xf4292244, 6);
+ MD5STEP(F4, d, a, b, c, in[ 7]+0x432aff97, 10);
+ MD5STEP(F4, c, d, a, b, in[14]+0xab9423a7, 15);
+ MD5STEP(F4, b, c, d, a, in[ 5]+0xfc93a039, 21);
+ MD5STEP(F4, a, b, c, d, in[12]+0x655b59c3, 6);
+ MD5STEP(F4, d, a, b, c, in[ 3]+0x8f0ccc92, 10);
+ MD5STEP(F4, c, d, a, b, in[10]+0xffeff47d, 15);
+ MD5STEP(F4, b, c, d, a, in[ 1]+0x85845dd1, 21);
+ MD5STEP(F4, a, b, c, d, in[ 8]+0x6fa87e4f, 6);
+ MD5STEP(F4, d, a, b, c, in[15]+0xfe2ce6e0, 10);
+ MD5STEP(F4, c, d, a, b, in[ 6]+0xa3014314, 15);
+ MD5STEP(F4, b, c, d, a, in[13]+0x4e0811a1, 21);
+ MD5STEP(F4, a, b, c, d, in[ 4]+0xf7537e82, 6);
+ MD5STEP(F4, d, a, b, c, in[11]+0xbd3af235, 10);
+ MD5STEP(F4, c, d, a, b, in[ 2]+0x2ad7d2bb, 15);
+ MD5STEP(F4, b, c, d, a, in[ 9]+0xeb86d391, 21);
+
+ buf[0] += a;
+ buf[1] += b;
+ buf[2] += c;
+ buf[3] += d;
}
#endif
-/* Note: Replace "for loop" with standard memset if possible.
- */
+#ifdef TEST
+/*
+ Simple test program. Can use it to manually run the tests from
+ RFC1321 for example.
+*/
+#include <stdio.h>
-#ifndef MD5_memset
-static void MD5_memset (output, value, len)
-POINTER output;
-int value;
-unsigned int len;
+int
+main (int argc, char **argv)
{
- unsigned int i;
-
- for (i = 0; i < len; i++)
- ((char *)output)[i] = (char)value;
+ my_MD5Context context;
+ unsigned char checksum[16];
+ int i;
+ int j;
+
+ if (argc < 2)
+ {
+ fprintf (stderr, "usage: %s string-to-hash\n", argv[0]);
+ exit (1);
+ }
+ for (j = 1; j < argc; ++j)
+ {
+ printf ("MD5 (\"%s\") = ", argv[j]);
+ my_MD5Init (&context);
+ my_MD5Update (&context, argv[j], strlen (argv[j]));
+ my_MD5Final (checksum, &context);
+ for (i = 0; i < 16; i++)
+ {
+ printf ("%02x", (unsigned int) checksum[i]);
+ }
+ printf ("\n");
+ }
+ return 0;
}
-#endif
+#endif /* TEST */
diff --git a/mysys/my_error.c b/mysys/my_error.c
index 07656dda979..2cf704d0089 100644
--- a/mysys/my_error.c
+++ b/mysys/my_error.c
@@ -252,11 +252,16 @@ const char **my_error_unregister(int first, int last)
void my_error_unregister_all(void)
{
- struct my_err_head *list, *next;
- for (list= my_errmsgs_globerrs.meh_next; list; list= next)
+ struct my_err_head *cursor, *saved_next;
+
+ for (cursor= my_errmsgs_globerrs.meh_next; cursor != NULL; cursor= saved_next)
{
- next= list->meh_next;
- my_free((uchar*) list, MYF(0));
+ /* We need this ptr, but we're about to free its container, so save it. */
+ saved_next= cursor->meh_next;
+
+ my_free((uchar*) cursor, MYF(0));
}
+ my_errmsgs_globerrs.meh_next= NULL; /* Freed in first iteration above. */
+
my_errmsgs_list= &my_errmsgs_globerrs;
}
diff --git a/mysys/my_fstream.c b/mysys/my_fstream.c
index f5fe862937c..f3b5418b906 100644
--- a/mysys/my_fstream.c
+++ b/mysys/my_fstream.c
@@ -131,10 +131,8 @@ size_t my_fwrite(FILE *stream, const uchar *Buffer, size_t Count, myf MyFlags)
if ((errno == ENOSPC || errno == EDQUOT) &&
(MyFlags & MY_WAIT_IF_FULL))
{
- if (!(errors++ % MY_WAIT_GIVE_USER_A_MESSAGE))
- my_error(EE_DISK_FULL,MYF(ME_BELL | ME_NOREFRESH),
- "[stream]",my_errno,MY_WAIT_FOR_USER_TO_FIX_PANIC);
- VOID(sleep(MY_WAIT_FOR_USER_TO_FIX_PANIC));
+ wait_for_free_space("[stream]", errors);
+ errors++;
VOID(my_fseek(stream,seekptr,MY_SEEK_SET,MYF(0)));
continue;
}
diff --git a/mysys/my_getopt.c b/mysys/my_getopt.c
index f97550d4429..4b74cdbf266 100644
--- a/mysys/my_getopt.c
+++ b/mysys/my_getopt.c
@@ -100,10 +100,10 @@ static void default_reporter(enum loglevel level,
one. Call function 'get_one_option()' once for each option.
*/
-static uchar** (*getopt_get_addr)(const char *, uint, const struct my_option *);
+static uchar** (*getopt_get_addr)(const char *, uint, const struct my_option *, int *);
void my_getopt_register_get_addr(uchar** (*func_addr)(const char *, uint,
- const struct my_option *))
+ const struct my_option *, int *))
{
getopt_get_addr= func_addr;
}
@@ -362,8 +362,12 @@ int handle_options(int *argc, char ***argv,
my_progname, optp->name);
return EXIT_NO_ARGUMENT_ALLOWED;
}
+ error= 0;
value= optp->var_type & GET_ASK_ADDR ?
- (*getopt_get_addr)(key_name, (uint) strlen(key_name), optp) : optp->value;
+ (*getopt_get_addr)(key_name, (uint) strlen(key_name), optp, &error) :
+ optp->value;
+ if (error)
+ return error;
if (optp->arg_type == NO_ARG)
{
@@ -842,7 +846,8 @@ longlong getopt_ll_limit_value(longlong num, const struct my_option *optp,
if (num < optp->min_value)
{
num= optp->min_value;
- adjusted= TRUE;
+ if (old < optp->min_value)
+ adjusted= TRUE;
}
if (fix)
@@ -913,7 +918,8 @@ ulonglong getopt_ull_limit_value(ulonglong num, const struct my_option *optp,
if (num < (ulonglong) optp->min_value)
{
num= (ulonglong) optp->min_value;
- adjusted= TRUE;
+ if (old < (ulonglong) optp->min_value)
+ adjusted= TRUE;
}
if (fix)
@@ -1092,7 +1098,7 @@ static void init_variables(const struct my_option *options,
if (options->value)
init_one_value(options, options->value, options->def_value);
if (options->var_type & GET_ASK_ADDR &&
- (variable= (*getopt_get_addr)("", 0, options)))
+ (variable= (*getopt_get_addr)("", 0, options, 0)))
init_one_value(options, variable, options->def_value);
}
DBUG_VOID_RETURN;
@@ -1196,7 +1202,7 @@ void my_print_variables(const struct my_option *options)
for (optp= options; optp->id; optp++)
{
uchar* *value= (optp->var_type & GET_ASK_ADDR ?
- (*getopt_get_addr)("", 0, optp) : optp->value);
+ (*getopt_get_addr)("", 0, optp, 0) : optp->value);
if (value)
{
printf("%s ", optp->name);
diff --git a/mysys/my_pread.c b/mysys/my_pread.c
index de7a2b611ed..156862ec414 100644
--- a/mysys/my_pread.c
+++ b/mysys/my_pread.c
@@ -161,10 +161,8 @@ size_t my_pwrite(int Filedes, const uchar *Buffer, size_t Count,
if ((my_errno == ENOSPC || my_errno == EDQUOT) &&
(MyFlags & MY_WAIT_IF_FULL))
{
- if (!(errors++ % MY_WAIT_GIVE_USER_A_MESSAGE))
- my_error(EE_DISK_FULL,MYF(ME_BELL | ME_NOREFRESH),
- my_filename(Filedes),my_errno,MY_WAIT_FOR_USER_TO_FIX_PANIC);
- VOID(sleep(MY_WAIT_FOR_USER_TO_FIX_PANIC));
+ wait_for_free_space(my_filename(Filedes), errors);
+ errors++;
continue;
}
if ((writenbytes && writenbytes != (size_t) -1) || my_errno == EINTR)
diff --git a/mysys/my_write.c b/mysys/my_write.c
index c67b1d8f3f2..d7eb390bdd2 100644
--- a/mysys/my_write.c
+++ b/mysys/my_write.c
@@ -54,10 +54,8 @@ size_t my_write(int Filedes, const uchar *Buffer, size_t Count, myf MyFlags)
if ((my_errno == ENOSPC || my_errno == EDQUOT) &&
(MyFlags & MY_WAIT_IF_FULL))
{
- if (!(errors++ % MY_WAIT_GIVE_USER_A_MESSAGE))
- my_error(EE_DISK_FULL,MYF(ME_BELL | ME_NOREFRESH),
- my_filename(Filedes),my_errno,MY_WAIT_FOR_USER_TO_FIX_PANIC);
- VOID(sleep(MY_WAIT_FOR_USER_TO_FIX_PANIC));
+ wait_for_free_space(my_filename(Filedes), errors);
+ errors++;
continue;
}
diff --git a/plugin/Makefile.am b/plugin/Makefile.am
index 22f6bfd88b2..68f1f939836 100644
--- a/plugin/Makefile.am
+++ b/plugin/Makefile.am
@@ -22,7 +22,7 @@ AUTOMAKE_OPTIONS = foreign
EXTRA_DIST = fulltext/configure.in
SUBDIRS = @mysql_pg_dirs@
-DIST_SUBDIRS = daemon_example fulltext
+DIST_SUBDIRS = @mysql_pg_distdirs@
# Don't update the files from bitkeeper
%::SCCS/s.%
diff --git a/scripts/mysql_system_tables.sql b/scripts/mysql_system_tables.sql
index fdab9601129..67e18517915 100644
--- a/scripts/mysql_system_tables.sql
+++ b/scripts/mysql_system_tables.sql
@@ -66,7 +66,7 @@ CREATE TABLE IF NOT EXISTS procs_priv ( Host char(60) binary DEFAULT '' NOT NULL
-- Create general_log if CSV is enabled.
-SET @str = IF (@@have_csv = 'YES', 'CREATE TABLE IF NOT EXISTS general_log (event_time TIMESTAMP NOT NULL, user_host MEDIUMTEXT NOT NULL, thread_id INTEGER NOT NULL, server_id INTEGER NOT NULL, command_type VARCHAR(64) NOT NULL, argument MEDIUMTEXT NOT NULL) engine=CSV CHARACTER SET utf8 comment="General log"', 'SET @dummy = 0');
+SET @str = IF (@@have_csv = 'YES', 'CREATE TABLE IF NOT EXISTS general_log (event_time TIMESTAMP NOT NULL, user_host MEDIUMTEXT NOT NULL, thread_id INTEGER NOT NULL, server_id INTEGER UNSIGNED NOT NULL, command_type VARCHAR(64) NOT NULL, argument MEDIUMTEXT NOT NULL) engine=CSV CHARACTER SET utf8 comment="General log"', 'SET @dummy = 0');
PREPARE stmt FROM @str;
EXECUTE stmt;
@@ -74,13 +74,13 @@ DROP PREPARE stmt;
-- Create slow_log if CSV is enabled.
-SET @str = IF (@@have_csv = 'YES', 'CREATE TABLE IF NOT EXISTS slow_log (start_time TIMESTAMP NOT NULL, user_host MEDIUMTEXT NOT NULL, query_time TIME NOT NULL, lock_time TIME NOT NULL, rows_sent INTEGER NOT NULL, rows_examined INTEGER NOT NULL, db VARCHAR(512) NOT NULL, last_insert_id INTEGER NOT NULL, insert_id INTEGER NOT NULL, server_id INTEGER NOT NULL, sql_text MEDIUMTEXT NOT NULL) engine=CSV CHARACTER SET utf8 comment="Slow log"', 'SET @dummy = 0');
+SET @str = IF (@@have_csv = 'YES', 'CREATE TABLE IF NOT EXISTS slow_log (start_time TIMESTAMP NOT NULL, user_host MEDIUMTEXT NOT NULL, query_time TIME NOT NULL, lock_time TIME NOT NULL, rows_sent INTEGER NOT NULL, rows_examined INTEGER NOT NULL, db VARCHAR(512) NOT NULL, last_insert_id INTEGER NOT NULL, insert_id INTEGER NOT NULL, server_id INTEGER UNSIGNED NOT NULL, sql_text MEDIUMTEXT NOT NULL) engine=CSV CHARACTER SET utf8 comment="Slow log"', 'SET @dummy = 0');
PREPARE stmt FROM @str;
EXECUTE stmt;
DROP PREPARE stmt;
-CREATE TABLE IF NOT EXISTS event ( db char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '', name char(64) CHARACTER SET utf8 NOT NULL default '', body longblob NOT NULL, definer char(77) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '', execute_at DATETIME default NULL, interval_value int(11) default NULL, interval_field ENUM('YEAR','QUARTER','MONTH','DAY','HOUR','MINUTE','WEEK','SECOND','MICROSECOND','YEAR_MONTH','DAY_HOUR','DAY_MINUTE','DAY_SECOND','HOUR_MINUTE','HOUR_SECOND','MINUTE_SECOND','DAY_MICROSECOND','HOUR_MICROSECOND','MINUTE_MICROSECOND','SECOND_MICROSECOND') default NULL, created TIMESTAMP NOT NULL, modified TIMESTAMP NOT NULL, last_executed DATETIME default NULL, starts DATETIME default NULL, ends DATETIME default NULL, status ENUM('ENABLED','DISABLED','SLAVESIDE_DISABLED') NOT NULL default 'ENABLED', on_completion ENUM('DROP','PRESERVE') NOT NULL default 'DROP', sql_mode set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') DEFAULT '' NOT NULL, comment char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '', originator int(10) NOT NULL, time_zone char(64) CHARACTER SET latin1 NOT NULL DEFAULT 'SYSTEM', character_set_client char(32) collate utf8_bin, collation_connection char(32) collate utf8_bin, db_collation char(32) collate utf8_bin, body_utf8 longblob, PRIMARY KEY (db, name) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT 'Events';
+CREATE TABLE IF NOT EXISTS event ( db char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '', name char(64) CHARACTER SET utf8 NOT NULL default '', body longblob NOT NULL, definer char(77) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '', execute_at DATETIME default NULL, interval_value int(11) default NULL, interval_field ENUM('YEAR','QUARTER','MONTH','DAY','HOUR','MINUTE','WEEK','SECOND','MICROSECOND','YEAR_MONTH','DAY_HOUR','DAY_MINUTE','DAY_SECOND','HOUR_MINUTE','HOUR_SECOND','MINUTE_SECOND','DAY_MICROSECOND','HOUR_MICROSECOND','MINUTE_MICROSECOND','SECOND_MICROSECOND') default NULL, created TIMESTAMP NOT NULL, modified TIMESTAMP NOT NULL, last_executed DATETIME default NULL, starts DATETIME default NULL, ends DATETIME default NULL, status ENUM('ENABLED','DISABLED','SLAVESIDE_DISABLED') NOT NULL default 'ENABLED', on_completion ENUM('DROP','PRESERVE') NOT NULL default 'DROP', sql_mode set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') DEFAULT '' NOT NULL, comment char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '', originator INTEGER UNSIGNED NOT NULL, time_zone char(64) CHARACTER SET latin1 NOT NULL DEFAULT 'SYSTEM', character_set_client char(32) collate utf8_bin, collation_connection char(32) collate utf8_bin, db_collation char(32) collate utf8_bin, body_utf8 longblob, PRIMARY KEY (db, name) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT 'Events';
CREATE TABLE IF NOT EXISTS ndb_binlog_index (Position BIGINT UNSIGNED NOT NULL, File VARCHAR(255) NOT NULL, epoch BIGINT UNSIGNED NOT NULL, inserts BIGINT UNSIGNED NOT NULL, updates BIGINT UNSIGNED NOT NULL, deletes BIGINT UNSIGNED NOT NULL, schemaops BIGINT UNSIGNED NOT NULL, PRIMARY KEY(epoch)) ENGINE=MYISAM;
diff --git a/scripts/mysql_system_tables_fix.sql b/scripts/mysql_system_tables_fix.sql
index a33c4fcb9fa..a6497f57f0a 100644
--- a/scripts/mysql_system_tables_fix.sql
+++ b/scripts/mysql_system_tables_fix.sql
@@ -216,6 +216,20 @@ ALTER TABLE func
MODIFY type enum ('function','aggregate') COLLATE utf8_general_ci NOT NULL;
#
+# Modify log tables.
+#
+
+SET @old_log_state = @@global.general_log;
+SET GLOBAL general_log = 'OFF';
+ALTER TABLE general_log MODIFY COLUMN server_id INTEGER UNSIGNED NOT NULL;
+SET GLOBAL general_log = @old_log_state;
+
+SET @old_log_state = @@global.slow_query_log;
+SET GLOBAL slow_query_log = 'OFF';
+ALTER TABLE slow_log MODIFY COLUMN server_id INTEGER UNSIGNED NOT NULL;
+SET GLOBAL slow_query_log = @old_log_state;
+
+#
# Detect whether we had Create_view_priv
#
SET @hadCreateViewPriv:=0;
@@ -471,7 +485,10 @@ ALTER TABLE event MODIFY sql_mode
'PAD_CHAR_TO_FULL_LENGTH'
) DEFAULT '' NOT NULL AFTER on_completion;
ALTER TABLE event MODIFY name char(64) CHARACTER SET utf8 NOT NULL default '';
-ALTER TABLE event ADD COLUMN originator INT(10) NOT NULL AFTER comment;
+
+ALTER TABLE event MODIFY COLUMN originator INT UNSIGNED NOT NULL;
+ALTER TABLE event ADD COLUMN originator INT UNSIGNED NOT NULL AFTER comment;
+
ALTER TABLE event MODIFY COLUMN status ENUM('ENABLED','DISABLED','SLAVESIDE_DISABLED') NOT NULL default 'ENABLED';
ALTER TABLE event ADD COLUMN time_zone char(64) CHARACTER SET latin1
diff --git a/scripts/mysqld_safe.sh b/scripts/mysqld_safe.sh
index 5e7a177a546..960c3e39bab 100644
--- a/scripts/mysqld_safe.sh
+++ b/scripts/mysqld_safe.sh
@@ -18,7 +18,7 @@ niceness=0
logging=init
want_syslog=0
syslog_tag=
-user=@MYSQLD_USER@
+user='@MYSQLD_USER@'
pid_file=
err_log=
@@ -64,9 +64,10 @@ my_which ()
{
save_ifs="${IFS-UNSET}"
IFS=:
+ ret=0
for file
do
- for dir in $PATH
+ for dir in "$PATH"
do
if [ -f "$dir/$file" ]
then
@@ -74,15 +75,18 @@ my_which ()
continue 2
fi
done
- return 1 # Failure, didn't find file in path
+
+ ret=1 #signal an error
+ break
done
+
if [ "$save_ifs" = UNSET ]
then
unset IFS
else
IFS="$save_ifs"
fi
- return 0 # Success
+ return $ret # Success
}
log_generic () {
@@ -212,19 +216,30 @@ fi
MY_PWD=`pwd`
# Check for the directories we would expect from a binary release install
-if test -f "$relpkgdata"/english/errmsg.sys -a -x ./bin/mysqld
+if test -n "$MY_BASEDIR_VERSION" -a -d "$MY_BASEDIR_VERSION"
+then
+ # BASEDIR is already overridden on command line. Do not re-set.
+
+ # Use BASEDIR to discover le.
+ if test -x "$MY_BASEDIR_VERSION/libexec/mysqld"
+ then
+ ledir="$MY_BASEDIR_VERSION/libexec"
+ else
+ ledir="$MY_BASEDIR_VERSION/bin"
+ fi
+elif test -f "$relpkgdata"/english/errmsg.sys -a -x "$MY_PWD/bin/mysqld"
then
- MY_BASEDIR_VERSION=$MY_PWD # Where bin, share and data are
- ledir=$MY_BASEDIR_VERSION/bin # Where mysqld is
+ MY_BASEDIR_VERSION="$MY_PWD" # Where bin, share and data are
+ ledir="$MY_PWD/bin" # Where mysqld is
# Check for the directories we would expect from a source install
-elif test -f "$relpkgdata"/english/errmsg.sys -a -x ./libexec/mysqld
+elif test -f "$relpkgdata"/english/errmsg.sys -a -x "$MY_PWD/libexec/mysqld"
then
- MY_BASEDIR_VERSION=$MY_PWD # Where libexec, share and var are
- ledir=$MY_BASEDIR_VERSION/libexec # Where mysqld is
+ MY_BASEDIR_VERSION="$MY_PWD" # Where libexec, share and var are
+ ledir="$MY_PWD/libexec" # Where mysqld is
# Since we didn't find anything, used the compiled-in defaults
else
- MY_BASEDIR_VERSION=@prefix@
- ledir=@libexecdir@
+ MY_BASEDIR_VERSION='@prefix@'
+ ledir='@libexecdir@'
fi
@@ -274,7 +289,10 @@ export MYSQL_HOME
# Get first arguments from the my.cnf file, groups [mysqld] and [mysqld_safe]
# and then merge with the command line arguments
-if test -x ./bin/my_print_defaults
+if test -x "$MY_BASEDIR_VERSION/bin/my_print_defaults"
+then
+ print_defaults="$MY_BASEDIR_VERSION/bin/my_print_defaults"
+elif test -x ./bin/my_print_defaults
then
print_defaults="./bin/my_print_defaults"
elif test -x @bindir@/my_print_defaults
@@ -399,7 +417,7 @@ then
MYSQLD=mysqld
fi
-if test ! -x $ledir/$MYSQLD
+if test ! -x "$ledir/$MYSQLD"
then
log_error "The file $ledir/$MYSQLD
does not exist or is not executable. Please cd to the mysql installation
@@ -411,7 +429,7 @@ fi
if test -z "$pid_file"
then
- pid_file=$DATADIR/`@HOSTNAME@`.pid
+ pid_file="$DATADIR/`@HOSTNAME@`.pid"
else
case "$pid_file" in
/* ) ;;
diff --git a/scripts/mysqldumpslow.sh b/scripts/mysqldumpslow.sh
index 60d972e1c8b..ce2670b2abd 100644
--- a/scripts/mysqldumpslow.sh
+++ b/scripts/mysqldumpslow.sh
@@ -17,9 +17,9 @@ my %opt = (
);
GetOptions(\%opt,
- 'verbose|v+',# verbose
+ 'v|verbose+',# verbose
'help+', # write usage info
- 'debug|d+', # debug
+ 'd|debug+', # debug
's=s', # what to sort by (t, at, l, al, r, ar etc)
'r!', # reverse the sort order (largest last instead of first)
't=i', # just show the top n queries
diff --git a/server-tools/instance-manager/instance_map.cc b/server-tools/instance-manager/instance_map.cc
index d7328d51cfe..b137370b50a 100644
--- a/server-tools/instance-manager/instance_map.cc
+++ b/server-tools/instance-manager/instance_map.cc
@@ -536,7 +536,8 @@ int Instance_map::load()
*/
if (my_search_option_files(Options::Main::config_file, &argc,
(char ***) &argv, &args_used,
- process_option, (void*) this))
+ process_option, (void*) this,
+ Options::default_directories))
log_info("Falling back to compiled-in defaults.");
return complete_initialization();
diff --git a/server-tools/instance-manager/options.cc b/server-tools/instance-manager/options.cc
index 7eba3187dd9..6f084e7c63e 100644
--- a/server-tools/instance-manager/options.cc
+++ b/server-tools/instance-manager/options.cc
@@ -86,6 +86,7 @@ const char *Options::Main::bind_address= NULL; /* No default value */
uint Options::Main::monitoring_interval= DEFAULT_MONITORING_INTERVAL;
uint Options::Main::port_number= DEFAULT_PORT;
my_bool Options::Main::mysqld_safe_compatible= FALSE;
+const char **Options::default_directories= NULL;
/* Options::User_management */
@@ -439,7 +440,8 @@ int Options::load(int argc, char **argv)
log_info("Loading config file '%s'...",
(const char *) Main::config_file);
- load_defaults(Main::config_file, default_groups, &argc, &saved_argv);
+ my_load_defaults(Main::config_file, default_groups, &argc,
+ &saved_argv, &default_directories);
if ((handle_options(&argc, &saved_argv, my_long_options, get_one_option)))
return ERR_INVALID_USAGE;
diff --git a/server-tools/instance-manager/options.h b/server-tools/instance-manager/options.h
index 0202ca271c9..5d4df51faae 100644
--- a/server-tools/instance-manager/options.h
+++ b/server-tools/instance-manager/options.h
@@ -91,6 +91,9 @@ struct Options
#endif
public:
+ /* Array of paths to be passed to my_search_option_files() later */
+ static const char **default_directories;
+
static int load(int argc, char **argv);
static void cleanup();
diff --git a/sql-bench/TODO b/sql-bench/TODO
deleted file mode 100644
index 8a103e89199..00000000000
--- a/sql-bench/TODO
+++ /dev/null
@@ -1,21 +0,0 @@
-When comparing with ms-sql:
-
-Check how to get MySQL faster mysql ms-sql
-
-count_distinct (2000) | 89.00| 39.00|
-count_distinct_big (120) | 324.00| 121.00|
-count_distinct_group (1000) | 158.00| 107.00|
-count_distinct_group_on_key (1000) | 49.00| 17.00|
-count_distinct_group_on_key_parts (1| 157.00| 108.00|
-order_by_big (10) | 197.00| 89.00|
-order_by_big_key (10) | 170.00| 82.00|
-order_by_big_key2 (10) | 163.00| 73.00|
-order_by_big_key_desc (10) | 172.00| 84.00|
-order_by_big_key_diff (10) | 193.00| 89.00|
-order_by_big_key_prefix (10) | 165.00| 72.00|
-
-
-Why is the following slow on NT:
- NT Linux
-update_of_primary_key_many_keys (256| 560.00| 65.00|
-
diff --git a/sql-common/client.c b/sql-common/client.c
index 63c746a3f5a..91a47b6a6f8 100644
--- a/sql-common/client.c
+++ b/sql-common/client.c
@@ -1021,7 +1021,7 @@ void mysql_read_default_options(struct st_mysql_options *options,
argc=1; argv=argv_buff; argv_buff[0]= (char*) "client";
groups[0]= (char*) "client"; groups[1]= (char*) group; groups[2]=0;
- load_defaults(filename, groups, &argc, &argv);
+ my_load_defaults(filename, groups, &argc, &argv, NULL);
if (argc != 1) /* If some default option */
{
char **option=argv;
diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc
index 0e36a868b3e..67bc3156260 100644
--- a/sql/ha_partition.cc
+++ b/sql/ha_partition.cc
@@ -4928,10 +4928,11 @@ int ha_partition::info(uint flag)
This flag is used to get index number of the unique index that
reported duplicate key
We will report the errkey on the last handler used and ignore the rest
+ Note: all engines does not support HA_STATUS_ERRKEY, so set errkey.
*/
+ file->errkey= errkey;
file->info(HA_STATUS_ERRKEY);
- if (file->errkey != (uint) -1)
- errkey= file->errkey;
+ errkey= file->errkey;
}
if (flag & HA_STATUS_TIME)
{
diff --git a/sql/handler.cc b/sql/handler.cc
index 853ab29d38a..18c8e6c1f5a 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -2932,7 +2932,7 @@ uint handler::get_dup_key(int error)
if (error == HA_ERR_FOUND_DUPP_KEY || error == HA_ERR_FOREIGN_DUPLICATE_KEY ||
error == HA_ERR_FOUND_DUPP_UNIQUE || error == HA_ERR_NULL_IN_SPATIAL ||
error == HA_ERR_DROP_INDEX_FK)
- info(HA_STATUS_ERRKEY | HA_STATUS_NO_LOCK);
+ table->file->info(HA_STATUS_ERRKEY | HA_STATUS_NO_LOCK);
DBUG_RETURN(table->file->errkey);
}
diff --git a/sql/item.cc b/sql/item.cc
index 33ec4a1a255..28ace4b114d 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -1758,7 +1758,6 @@ bool agg_item_set_converter(DTCollation &coll, const char *fname,
bool agg_item_charsets(DTCollation &coll, const char *fname,
Item **args, uint nargs, uint flags, int item_sep)
{
- Item **arg, *safe_args[2];
if (agg_item_collations(coll, fname, args, nargs, flags, item_sep))
return TRUE;
diff --git a/sql/item_func.cc b/sql/item_func.cc
index ec95254baaa..4322fa058a7 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -4837,7 +4837,9 @@ bool Item_func_get_system_var::is_written_to_binlog()
void Item_func_get_system_var::fix_length_and_dec()
{
+ char *cptr;
maybe_null=0;
+ max_length= 0;
if (var->check_type(var_type))
{
@@ -4867,8 +4869,14 @@ void Item_func_get_system_var::fix_length_and_dec()
break;
case SHOW_CHAR:
case SHOW_CHAR_PTR:
+ pthread_mutex_lock(&LOCK_global_system_variables);
+ cptr= var->show_type() == SHOW_CHAR_PTR ?
+ *(char**) var->value_ptr(current_thd, var_type, &component) :
+ (char*) var->value_ptr(current_thd, var_type, &component);
+ if (cptr)
+ max_length= strlen(cptr) * system_charset_info->mbmaxlen;
+ pthread_mutex_unlock(&LOCK_global_system_variables);
collation.set(system_charset_info, DERIVATION_SYSCONST);
- max_length= MAX_BLOB_WIDTH;
decimals=NOT_FIXED_DEC;
break;
case SHOW_BOOL:
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index fc9375e68a5..05b9563c121 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -105,13 +105,10 @@ String *Item_func_md5::val_str(String *str)
str->set_charset(&my_charset_bin);
if (sptr)
{
- my_MD5_CTX context;
uchar digest[16];
null_value=0;
- my_MD5Init (&context);
- my_MD5Update (&context,(uchar *) sptr->ptr(), sptr->length());
- my_MD5Final (digest, &context);
+ MY_MD5_HASH(digest,(uchar *) sptr->ptr(), sptr->length());
if (str->alloc(32)) // Ensure that memory is free
{
null_value=1;
diff --git a/sql/item_sum.cc b/sql/item_sum.cc
index 1821136cc9d..a6d8bb8a52d 100644
--- a/sql/item_sum.cc
+++ b/sql/item_sum.cc
@@ -439,7 +439,8 @@ void Item_sum::make_field(Send_field *tmp_field)
void Item_sum::print(String *str, enum_query_type query_type)
{
- Item **pargs= orig_args;
+ /* orig_args is not filled with valid values until fix_fields() */
+ Item **pargs= fixed ? orig_args : args;
str->append(func_name());
for (uint i=0 ; i < arg_count ; i++)
{
diff --git a/sql/log.cc b/sql/log.cc
index 74dc75702ae..44296daa939 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -4650,10 +4650,14 @@ bool flush_error_log()
uchar buf[IO_SIZE];
freopen(err_temp,"a+",stderr);
+ setbuf(stderr, NULL);
(void) my_delete(err_renamed, MYF(0));
my_rename(log_error_file,err_renamed,MYF(0));
if (freopen(log_error_file,"a+",stdout))
+ {
freopen(log_error_file,"a+",stderr);
+ setbuf(stderr, NULL);
+ }
if ((fd = my_open(err_temp, O_RDONLY, MYF(0))) >= 0)
{
@@ -4669,7 +4673,10 @@ bool flush_error_log()
#else
my_rename(log_error_file,err_renamed,MYF(0));
if (freopen(log_error_file,"a+",stdout))
+ {
freopen(log_error_file,"a+",stderr);
+ setbuf(stderr, NULL);
+ }
else
result= 1;
#endif
diff --git a/sql/log_event.cc b/sql/log_event.cc
index 5d959412d36..e6f18a08a0d 100644
--- a/sql/log_event.cc
+++ b/sql/log_event.cc
@@ -354,7 +354,7 @@ static char *slave_load_file_stem(char *buf, uint file_id,
int event_server_id, const char *ext)
{
char *res;
- fn_format(buf,"SQL_LOAD-",slave_load_tmpdir, "", MY_UNPACK_FILENAME);
+ fn_format(buf,PREFIX_SQL_LOAD,slave_load_tmpdir, "", MY_UNPACK_FILENAME);
to_unix_path(buf);
buf = strend(buf);
@@ -393,7 +393,7 @@ static void cleanup_load_tmpdir()
we cannot meet Start_log event in the middle of events from one
LOAD DATA.
*/
- p= strmake(prefbuf, STRING_WITH_LEN("SQL_LOAD-"));
+ p= strmake(prefbuf, STRING_WITH_LEN(PREFIX_SQL_LOAD));
p= int10_to_str(::server_id, p, 10);
*(p++)= '-';
*p= 0;
@@ -1258,7 +1258,7 @@ void Log_event::print_header(IO_CACHE* file,
my_b_printf(file, "#");
print_timestamp(file);
- my_b_printf(file, " server id %d end_log_pos %s ", server_id,
+ my_b_printf(file, " server id %lu end_log_pos %s ", (ulong) server_id,
llstr(log_pos,llbuff));
/* mysqlbinlog --hexdump */
diff --git a/sql/log_event.h b/sql/log_event.h
index 1d11d7e2d5f..82fc8d771e1 100644
--- a/sql/log_event.h
+++ b/sql/log_event.h
@@ -47,6 +47,8 @@
#include "rpl_reporting.h"
#endif
+#define PREFIX_SQL_LOAD "SQL_LOAD-"
+
/**
Either assert or return an error.
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index 3fba9248940..2c938fc96a2 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -2047,6 +2047,9 @@ extern SHOW_COMP_OPTION have_geometry, have_rtree_keys;
extern SHOW_COMP_OPTION have_crypt;
extern SHOW_COMP_OPTION have_compress;
+extern int orig_argc;
+extern char **orig_argv;
+extern const char *load_default_groups[];
#ifndef __WIN__
extern pthread_t signal_thread;
@@ -2411,7 +2414,8 @@ extern "C" void unireg_abort(int exit_code) __attribute__((noreturn));
void kill_delayed_threads(void);
bool check_stack_overrun(THD *thd, long margin, uchar *dummy);
#else
-#define unireg_abort(exit_code) DBUG_RETURN(exit_code)
+extern "C" void unireg_clear(int exit_code);
+#define unireg_abort(exit_code) do { unireg_clear(exit_code); DBUG_RETURN(exit_code); } while(0)
inline void kill_delayed_threads(void) {}
#define check_stack_overrun(A, B, C) 0
#endif
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 973073935a4..7fe498ae147 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -177,39 +177,41 @@ int initgroups(const char *,unsigned int);
#ifdef HAVE_FP_EXCEPT // Fix type conflict
typedef fp_except fp_except_t;
#endif
+#endif /* __FreeBSD__ && HAVE_IEEEFP_H */
+#ifdef HAVE_SYS_FPU_H
+/* for IRIX to use set_fpc_csr() */
+#include <sys/fpu.h>
+#endif
-/**
- We can't handle floating point exceptions with threads, so disable
- this on freebsd.
-*/
-inline void set_proper_floating_point_mode()
+inline void setup_fpu()
{
- /* Don't fall for overflow, underflow,divide-by-zero or loss of precision */
+#if defined(__FreeBSD__) && defined(HAVE_IEEEFP_H)
+ /* We can't handle floating point exceptions with threads, so disable
+ this on freebsd
+ Don't fall for overflow, underflow,divide-by-zero or loss of precision
+ */
#if defined(__i386__)
fpsetmask(~(FP_X_INV | FP_X_DNML | FP_X_OFL | FP_X_UFL | FP_X_DZ |
FP_X_IMP));
#else
- fpsetmask(~(FP_X_INV | FP_X_OFL | FP_X_UFL | FP_X_DZ |
- FP_X_IMP));
-#endif
-}
-#elif defined(__sgi)
-/* for IRIX to use set_fpc_csr() */
-#include <sys/fpu.h>
+ fpsetmask(~(FP_X_INV | FP_X_OFL | FP_X_UFL | FP_X_DZ |
+ FP_X_IMP));
+#endif /* __i386__ */
+#endif /* __FreeBSD__ && HAVE_IEEEFP_H */
-inline void set_proper_floating_point_mode()
-{
+#ifdef HAVE_FESETROUND
+ /* Set FPU rounding mode to "round-to-nearest" */
+ fesetround(FE_TONEAREST);
+#endif /* HAVE_FESETROUND */
+
+#if defined(__sgi) && defined(HAVE_SYS_FPU_H)
/* Enable denormalized DOUBLE values support for IRIX */
- {
- union fpc_csr n;
- n.fc_word = get_fpc_csr();
- n.fc_struct.flush = 0;
- set_fpc_csr(n.fc_word);
- }
+ union fpc_csr n;
+ n.fc_word = get_fpc_csr();
+ n.fc_struct.flush = 0;
+ set_fpc_csr(n.fc_word);
+#endif
}
-#else
-#define set_proper_floating_point_mode()
-#endif /* __FreeBSD__ && HAVE_IEEEFP_H */
} /* cplusplus */
@@ -646,6 +648,9 @@ static int defaults_argc;
static char **defaults_argv;
static char *opt_bin_logname;
+int orig_argc;
+char **orig_argv;
+
static my_socket unix_sock,ip_sock;
struct rand_struct sql_rand; ///< used by sql_class.cc:THD::THD()
@@ -742,12 +747,12 @@ uint connection_count= 0;
pthread_handler_t signal_hand(void *arg);
static int mysql_init_variables(void);
-static void get_options(int *argc,char **argv);
+static int get_options(int *argc,char **argv);
extern "C" my_bool mysqld_get_one_option(int, const struct my_option *, char *);
static void set_server_version(void);
static int init_thread_environment();
static char *get_relative_path(const char *path);
-static void fix_paths(void);
+static int fix_paths(void);
pthread_handler_t handle_connections_sockets(void *arg);
pthread_handler_t kill_server_thread(void *arg);
static void bootstrap(FILE *file);
@@ -761,7 +766,7 @@ pthread_handler_t handle_connections_shared_memory(void *arg);
pthread_handler_t handle_slave(void *arg);
static ulong find_bit_type(const char *x, TYPELIB *bit_lib);
static ulong find_bit_type_or_exit(const char *x, TYPELIB *bit_lib,
- const char *option);
+ const char *option, int *error);
static void clean_up(bool print_message);
static int test_if_case_insensitive(const char *dir_name);
@@ -1185,7 +1190,8 @@ extern "C" void unireg_abort(int exit_code)
my_end(opt_endinfo ? MY_CHECK_ERROR | MY_GIVE_INFO : 0);
exit(exit_code); /* purecov: inspected */
}
-#endif
+
+#endif /*EMBEDDED_LIBRARY*/
void clean_up(bool print_message)
@@ -2919,18 +2925,16 @@ pthread_handler_t handle_shutdown(void *arg)
}
#endif
-#if !defined(EMBEDDED_LIBRARY)
-static const char *load_default_groups[]= {
+const char *load_default_groups[]= {
#ifdef WITH_NDBCLUSTER_STORAGE_ENGINE
"mysql_cluster",
#endif
"mysqld","server", MYSQL_BASE_VERSION, 0, 0};
-#if defined(__WIN__)
+#if defined(__WIN__) && !defined(EMBEDDED_LIBRARY)
static const int load_default_groups_sz=
sizeof(load_default_groups)/sizeof(load_default_groups[0]);
#endif
-#endif /*!EMBEDDED_LIBRARY*/
/**
@@ -3218,10 +3222,13 @@ static int init_common_variables(const char *conf_file_name, int argc,
SQLCOM_END + 8);
#endif
+ orig_argc=argc;
+ orig_argv=argv;
load_defaults(conf_file_name, groups, &argc, &argv);
defaults_argv=argv;
defaults_argc=argc;
- get_options(&defaults_argc, defaults_argv);
+ if (get_options(&defaults_argc, defaults_argv))
+ return 1;
set_server_version();
DBUG_PRINT("info",("%s Ver %s for %s on %s\n",my_progname,
@@ -3671,7 +3678,7 @@ static int init_server_components()
query_cache_init();
query_cache_resize(query_cache_size);
randominit(&sql_rand,(ulong) server_start_time,(ulong) server_start_time/2);
- set_proper_floating_point_mode();
+ setup_fpu();
init_thr_lock();
#ifdef HAVE_REPLICATION
init_slave_list();
@@ -3699,7 +3706,10 @@ static int init_server_components()
#ifndef EMBEDDED_LIBRARY
if (freopen(log_error_file, "a+", stdout))
#endif
+ {
freopen(log_error_file, "a+", stderr);
+ setbuf(stderr, NULL);
+ }
}
}
@@ -3879,6 +3889,7 @@ server.");
if ((ho_error= handle_options(&defaults_argc, &tmp_argv, no_opts,
mysqld_get_one_option)))
unireg_abort(ho_error);
+ my_getopt_skip_unknown= TRUE;
if (defaults_argc)
{
@@ -4327,6 +4338,7 @@ we force server id to 2, but this MySQL server will not act as a slave.");
{
freopen(log_error_file,"a+",stdout);
freopen(log_error_file,"a+",stderr);
+ setbuf(stderr, NULL);
FreeConsole(); // Remove window
}
#endif
@@ -6241,7 +6253,7 @@ Can't be set to 1 if --log-slave-updates is used.",
GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"server-id", OPT_SERVER_ID,
"Uniquely identifies the server instance in the community of replication partners.",
- (uchar**) &server_id, (uchar**) &server_id, 0, GET_ULONG, REQUIRED_ARG, 0, 0, 0,
+ (uchar**) &server_id, (uchar**) &server_id, 0, GET_ULONG, REQUIRED_ARG, 0, 0, UINT_MAX32,
0, 0, 0},
{"set-variable", 'O',
"Change the value of a variable. Please note that this option is deprecated;you can set variables directly with --variable-name=value.",
@@ -7492,6 +7504,7 @@ To see what values a running MySQL server is using, type\n\
static int mysql_init_variables(void)
{
+ int error;
/* Things reset to zero */
opt_skip_slave_start= opt_reckless_slave = 0;
mysql_home[0]= pidfile_name[0]= log_error_file[0]= 0;
@@ -7549,7 +7562,10 @@ static int mysql_init_variables(void)
delay_key_write_options= (uint) DELAY_KEY_WRITE_ON;
slave_exec_mode_options= 0;
slave_exec_mode_options= (uint)
- find_bit_type_or_exit(slave_exec_mode_str, &slave_exec_mode_typelib, NULL);
+ find_bit_type_or_exit(slave_exec_mode_str, &slave_exec_mode_typelib, NULL,
+ &error);
+ if (error)
+ return 1;
opt_specialflag= SPECIAL_ENGLISH;
unix_sock= ip_sock= INVALID_SOCKET;
mysql_home_ptr= mysql_home;
@@ -7727,6 +7743,8 @@ mysqld_get_one_option(int optid,
const struct my_option *opt __attribute__((unused)),
char *argument)
{
+ int error;
+
switch(optid) {
case '#':
#ifndef DBUG_OFF
@@ -7770,7 +7788,9 @@ mysqld_get_one_option(int optid,
break;
case OPT_SLAVE_EXEC_MODE:
slave_exec_mode_options= (uint)
- find_bit_type_or_exit(argument, &slave_exec_mode_typelib, "");
+ find_bit_type_or_exit(argument, &slave_exec_mode_typelib, "", &error);
+ if (error)
+ return 1;
break;
#endif
case OPT_SAFEMALLOC_MEM_LIMIT:
@@ -7838,18 +7858,16 @@ mysqld_get_one_option(int optid,
if (!(p= strstr(argument, "->")))
{
- fprintf(stderr,
- "Bad syntax in replicate-rewrite-db - missing '->'!\n");
- exit(1);
+ sql_print_error("Bad syntax in replicate-rewrite-db - missing '->'!\n");
+ return 1;
}
val= p--;
while (my_isspace(mysqld_charset, *p) && p > argument)
*p-- = 0;
if (p == argument)
{
- fprintf(stderr,
- "Bad syntax in replicate-rewrite-db - empty FROM db!\n");
- exit(1);
+ sql_print_error("Bad syntax in replicate-rewrite-db - empty FROM db!\n");
+ return 1;
}
*val= 0;
val+= 2;
@@ -7857,9 +7875,8 @@ mysqld_get_one_option(int optid,
*val++;
if (!*val)
{
- fprintf(stderr,
- "Bad syntax in replicate-rewrite-db - empty TO db!\n");
- exit(1);
+ sql_print_error("Bad syntax in replicate-rewrite-db - empty TO db!\n");
+ return 1;
}
rpl_filter->add_db_rewrite(key, val);
@@ -7887,8 +7904,8 @@ mysqld_get_one_option(int optid,
{
if (rpl_filter->add_do_table(argument))
{
- fprintf(stderr, "Could not add do table rule '%s'!\n", argument);
- exit(1);
+ sql_print_error("Could not add do table rule '%s'!\n", argument);
+ return 1;
}
break;
}
@@ -7896,8 +7913,8 @@ mysqld_get_one_option(int optid,
{
if (rpl_filter->add_wild_do_table(argument))
{
- fprintf(stderr, "Could not add do table rule '%s'!\n", argument);
- exit(1);
+ sql_print_error("Could not add do table rule '%s'!\n", argument);
+ return 1;
}
break;
}
@@ -7905,8 +7922,8 @@ mysqld_get_one_option(int optid,
{
if (rpl_filter->add_wild_ignore_table(argument))
{
- fprintf(stderr, "Could not add ignore table rule '%s'!\n", argument);
- exit(1);
+ sql_print_error("Could not add ignore table rule '%s'!\n", argument);
+ return 1;
}
break;
}
@@ -7914,8 +7931,8 @@ mysqld_get_one_option(int optid,
{
if (rpl_filter->add_ignore_table(argument))
{
- fprintf(stderr, "Could not add ignore table rule '%s'!\n", argument);
- exit(1);
+ sql_print_error("Could not add ignore table rule '%s'!\n", argument);
+ return 1;
}
break;
}
@@ -7936,7 +7953,9 @@ mysqld_get_one_option(int optid,
{
log_output_str= argument;
log_output_options=
- find_bit_type_or_exit(argument, &log_output_typelib, opt->name);
+ find_bit_type_or_exit(argument, &log_output_typelib, opt->name, &error);
+ if (error)
+ return 1;
}
break;
}
@@ -7946,7 +7965,7 @@ mysqld_get_one_option(int optid,
sql_perror("Event scheduler is not supported in embedded build.");
#else
if (Events::set_opt_event_scheduler(argument))
- exit(1);
+ return 1;
#endif
break;
case (int) OPT_SKIP_NEW:
@@ -7985,7 +8004,7 @@ mysqld_get_one_option(int optid,
case (int) OPT_SKIP_NETWORKING:
#if defined(__NETWARE__)
sql_perror("Can't start server: skip-networking option is currently not supported on NetWare");
- exit(1);
+ return 1;
#endif
opt_disable_networking=1;
mysqld_port=0;
@@ -8156,7 +8175,10 @@ mysqld_get_one_option(int optid,
{
myisam_recover_options_str=argument;
myisam_recover_options=
- find_bit_type_or_exit(argument, &myisam_recover_typelib, opt->name);
+ find_bit_type_or_exit(argument, &myisam_recover_typelib, opt->name,
+ &error);
+ if (error)
+ return 1;
}
ha_open_options|=HA_OPEN_ABORT_IF_CRASHED;
break;
@@ -8201,7 +8223,9 @@ mysqld_get_one_option(int optid,
{
sql_mode_str= argument;
global_system_variables.sql_mode=
- find_bit_type_or_exit(argument, &sql_mode_typelib, opt->name);
+ find_bit_type_or_exit(argument, &sql_mode_typelib, opt->name, &error);
+ if (error)
+ return 1;
global_system_variables.sql_mode= fix_sql_mode(global_system_variables.
sql_mode);
break;
@@ -8240,13 +8264,17 @@ mysqld_get_one_option(int optid,
/** Handle arguments for multiple key caches. */
-extern "C" uchar **mysql_getopt_value(const char *keyname, uint key_length,
- const struct my_option *option);
+extern "C" int mysql_getopt_value(uchar **value,
+ const char *keyname, uint key_length,
+ const struct my_option *option,
+ int *error);
-uchar* *
+static uchar* *
mysql_getopt_value(const char *keyname, uint key_length,
- const struct my_option *option)
+ const struct my_option *option, int *error)
{
+ if (error)
+ *error= 0;
switch (option->id) {
case OPT_KEY_BUFFER_SIZE:
case OPT_KEY_CACHE_BLOCK_SIZE:
@@ -8255,7 +8283,11 @@ mysql_getopt_value(const char *keyname, uint key_length,
{
KEY_CACHE *key_cache;
if (!(key_cache= get_or_create_key_cache(keyname, key_length)))
- exit(1);
+ {
+ if (error)
+ *error= EXIT_OUT_OF_MEMORY;
+ return 0;
+ }
switch (option->id) {
case OPT_KEY_BUFFER_SIZE:
return (uchar**) &key_cache->param_buff_size;
@@ -8293,7 +8325,7 @@ void option_error_reporter(enum loglevel level, const char *format, ...)
@todo
- FIXME add EXIT_TOO_MANY_ARGUMENTS to "mysys_err.h" and return that code?
*/
-static void get_options(int *argc,char **argv)
+static int get_options(int *argc,char **argv)
{
int ho_error;
@@ -8307,7 +8339,7 @@ static void get_options(int *argc,char **argv)
if ((ho_error= handle_options(argc, &argv, my_long_options,
mysqld_get_one_option)))
- exit(ho_error);
+ return ho_error;
(*argc)++; /* add back one for the progname handle_options removes */
/* no need to do this for argv as we are discarding it. */
@@ -8346,7 +8378,8 @@ static void get_options(int *argc,char **argv)
max_allowed_packet= global_system_variables.max_allowed_packet;
net_buffer_length= global_system_variables.net_buffer_length;
#endif
- fix_paths();
+ if (fix_paths())
+ return 1;
/*
Set some global variables from the global_system_variables
@@ -8373,7 +8406,7 @@ static void get_options(int *argc,char **argv)
&global_system_variables.time_format) ||
init_global_datetime_format(MYSQL_TIMESTAMP_DATETIME,
&global_system_variables.datetime_format))
- exit(1);
+ return 1;
#ifdef EMBEDDED_LIBRARY
one_thread_scheduler(&thread_scheduler);
@@ -8386,6 +8419,7 @@ static void get_options(int *argc,char **argv)
else
pool_of_threads_scheduler(&thread_scheduler); /* purecov: tested */
#endif
+ return 0;
}
@@ -8449,7 +8483,7 @@ fn_format_relative_to_data_home(char * to, const char *name,
}
-static void fix_paths(void)
+static int fix_paths(void)
{
char buff[FN_REFLEN],*pos;
convert_dirname(mysql_home,mysql_home,NullS);
@@ -8496,12 +8530,12 @@ static void fix_paths(void)
charsets_dir=mysql_charsets_dir;
if (init_tmpdir(&mysql_tmpdir_list, opt_mysql_tmpdir))
- exit(1);
+ return 1;
#ifdef HAVE_REPLICATION
if (!slave_load_tmpdir)
{
if (!(slave_load_tmpdir = (char*) my_strdup(mysql_tmpdir, MYF(MY_FAE))))
- exit(1);
+ return 1;
}
#endif /* HAVE_REPLICATION */
/*
@@ -8514,30 +8548,37 @@ static void fix_paths(void)
my_free(opt_secure_file_priv, MYF(0));
opt_secure_file_priv= my_strdup(buff, MYF(MY_FAE));
}
+ return 0;
}
static ulong find_bit_type_or_exit(const char *x, TYPELIB *bit_lib,
- const char *option)
+ const char *option, int *error)
{
- ulong res;
-
+ ulong result;
const char **ptr;
- if ((res= find_bit_type(x, bit_lib)) == ~(ulong) 0)
+ *error= 0;
+ if ((result= find_bit_type(x, bit_lib)) == ~(ulong) 0)
{
+ char *buff= (char *) my_alloca(2048);
+ char *cbuf;
ptr= bit_lib->type_names;
- if (!*x)
- fprintf(stderr, "No option given to %s\n", option);
- else
- fprintf(stderr, "Wrong option to %s. Option(s) given: %s\n", option, x);
- fprintf(stderr, "Alternatives are: '%s'", *ptr);
+ cbuf= buff + ((!*x) ?
+ my_snprintf(buff, 2048, "No option given to %s\n", option) :
+ my_snprintf(buff, 2048, "Wrong option to %s. Option(s) given: %s\n",
+ option, x));
+ cbuf+= my_snprintf(cbuf, 2048 - (cbuf-buff), "Alternatives are: '%s'", *ptr);
while (*++ptr)
- fprintf(stderr, ",'%s'", *ptr);
- fprintf(stderr, "\n");
- exit(1);
+ cbuf+= my_snprintf(cbuf, 2048 - (cbuf-buff), ",'%s'", *ptr);
+ my_snprintf(cbuf, 2048 - (cbuf-buff), "\n");
+ sql_perror(buff);
+ *error= 1;
+ my_afree(buff);
+ return 0;
}
- return res;
+
+ return result;
}
diff --git a/sql/opt_range.cc b/sql/opt_range.cc
index 9f8f17eb4ba..31cb829fd93 100644
--- a/sql/opt_range.cc
+++ b/sql/opt_range.cc
@@ -9239,32 +9239,37 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree)
*/
KEY *cur_index_info= table->key_info;
KEY *cur_index_info_end= cur_index_info + table->s->keys;
- KEY_PART_INFO *cur_part= NULL;
- KEY_PART_INFO *end_part; /* Last part for loops. */
- /* Last index part. */
- KEY_PART_INFO *last_part= NULL;
- KEY_PART_INFO *first_non_group_part= NULL;
- KEY_PART_INFO *first_non_infix_part= NULL;
- uint key_infix_parts= 0;
- uint cur_group_key_parts= 0;
- uint cur_group_prefix_len= 0;
/* Cost-related variables for the best index so far. */
double best_read_cost= DBL_MAX;
ha_rows best_records= 0;
SEL_ARG *best_index_tree= NULL;
ha_rows best_quick_prefix_records= 0;
uint best_param_idx= 0;
- double cur_read_cost= DBL_MAX;
- ha_rows cur_records;
+
+ const uint pk= param->table->s->primary_key;
SEL_ARG *cur_index_tree= NULL;
ha_rows cur_quick_prefix_records= 0;
uint cur_param_idx=MAX_KEY;
- key_map cur_used_key_parts;
- uint pk= param->table->s->primary_key;
for (uint cur_index= 0 ; cur_index_info != cur_index_info_end ;
cur_index_info++, cur_index++)
{
+ KEY_PART_INFO *cur_part;
+ KEY_PART_INFO *end_part; /* Last part for loops. */
+ /* Last index part. */
+ KEY_PART_INFO *last_part;
+ KEY_PART_INFO *first_non_group_part;
+ KEY_PART_INFO *first_non_infix_part;
+ uint key_infix_parts;
+ uint cur_group_key_parts= 0;
+ uint cur_group_prefix_len= 0;
+ double cur_read_cost;
+ ha_rows cur_records;
+ key_map used_key_parts_map;
+ uint cur_key_infix_len= 0;
+ uchar cur_key_infix[MAX_KEY_LENGTH];
+ uint cur_used_key_parts;
+
/* Check (B1) - if current index is covering. */
if (!table->covering_keys.is_set(cur_index))
goto next_index;
@@ -9334,7 +9339,7 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree)
else if (join->select_distinct)
{
select_items_it.rewind();
- cur_used_key_parts.clear_all();
+ used_key_parts_map.clear_all();
uint max_key_part= 0;
while ((item= select_items_it++))
{
@@ -9345,13 +9350,13 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree)
Check if this attribute was already present in the select list.
If it was present, then its corresponding key part was alredy used.
*/
- if (cur_used_key_parts.is_set(key_part_nr))
+ if (used_key_parts_map.is_set(key_part_nr))
continue;
if (key_part_nr < 1 || key_part_nr > join->fields_list.elements)
goto next_index;
cur_part= cur_index_info->key_part + key_part_nr - 1;
cur_group_prefix_len+= cur_part->store_length;
- cur_used_key_parts.set_bit(key_part_nr);
+ used_key_parts_map.set_bit(key_part_nr);
++cur_group_key_parts;
max_key_part= max(max_key_part,key_part_nr);
}
@@ -9363,7 +9368,7 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree)
*/
ulonglong all_parts, cur_parts;
all_parts= (1<<max_key_part) - 1;
- cur_parts= cur_used_key_parts.to_ulonglong() >> 1;
+ cur_parts= used_key_parts_map.to_ulonglong() >> 1;
if (all_parts != cur_parts)
goto next_index;
}
@@ -9413,7 +9418,8 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree)
&dummy);
if (!get_constant_key_infix(cur_index_info, index_range_tree,
first_non_group_part, min_max_arg_part,
- last_part, thd, key_infix, &key_infix_len,
+ last_part, thd, cur_key_infix,
+ &cur_key_infix_len,
&first_non_infix_part))
goto next_index;
}
@@ -9467,9 +9473,9 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree)
}
/* If we got to this point, cur_index_info passes the test. */
- key_infix_parts= key_infix_len ?
+ key_infix_parts= cur_key_infix_len ?
(first_non_infix_part - first_non_group_part) : 0;
- used_key_parts= cur_group_key_parts + key_infix_parts;
+ cur_used_key_parts= cur_group_key_parts + key_infix_parts;
/* Compute the cost of using this index. */
if (tree)
@@ -9481,7 +9487,7 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree)
cur_quick_prefix_records= check_quick_select(param, cur_param_idx,
cur_index_tree, TRUE);
}
- cost_group_min_max(table, cur_index_info, used_key_parts,
+ cost_group_min_max(table, cur_index_info, cur_used_key_parts,
cur_group_key_parts, tree, cur_index_tree,
cur_quick_prefix_records, have_min, have_max,
&cur_read_cost, &cur_records);
@@ -9492,7 +9498,6 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree)
*/
if (cur_read_cost < best_read_cost - (DBL_EPSILON * cur_read_cost))
{
- DBUG_ASSERT(tree != 0 || cur_param_idx == MAX_KEY);
index_info= cur_index_info;
index= cur_index;
best_read_cost= cur_read_cost;
@@ -9502,11 +9507,13 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree)
best_param_idx= cur_param_idx;
group_key_parts= cur_group_key_parts;
group_prefix_len= cur_group_prefix_len;
+ key_infix_len= cur_key_infix_len;
+ if (key_infix_len)
+ memcpy (key_infix, cur_key_infix, sizeof (key_infix));
+ used_key_parts= cur_used_key_parts;
}
- next_index:
- cur_group_key_parts= 0;
- cur_group_prefix_len= 0;
+ next_index:;
}
if (!index_info) /* No usable index found. */
DBUG_RETURN(NULL);
diff --git a/sql/protocol.cc b/sql/protocol.cc
index 4177cd0054d..16975c68a54 100644
--- a/sql/protocol.cc
+++ b/sql/protocol.cc
@@ -573,7 +573,8 @@ bool Protocol::send_fields(List<Item> *list, uint flags)
else
{
/* With conversion */
- uint max_char_len;
+ ulonglong max_length;
+ uint32 field_length;
int2store(pos, thd_charset->number);
/*
For TEXT/BLOB columns, field_length describes the maximum data
@@ -584,12 +585,22 @@ bool Protocol::send_fields(List<Item> *list, uint flags)
char_count * mbmaxlen, where character count is taken from the
definition of the column. In other words, the maximum number
of characters here is limited by the column definition.
+
+ When one has a LONG TEXT column with a single-byte
+ character set, and the connection character set is multi-byte, the
+ client may get fields longer than UINT_MAX32, due to
+ <character set column> -> <character set connection> conversion.
+ In that case column max length does not fit into the 4 bytes
+ reserved for it in the protocol.
*/
- max_char_len= (field.type >= (int) MYSQL_TYPE_TINY_BLOB &&
- field.type <= (int) MYSQL_TYPE_BLOB) ?
- field.length / item->collation.collation->mbminlen :
- field.length / item->collation.collation->mbmaxlen;
- int4store(pos+2, max_char_len * thd_charset->mbmaxlen);
+ max_length= (field.type >= MYSQL_TYPE_TINY_BLOB &&
+ field.type <= MYSQL_TYPE_BLOB) ?
+ field.length / item->collation.collation->mbminlen :
+ field.length / item->collation.collation->mbmaxlen;
+ max_length*= thd_charset->mbmaxlen;
+ field_length= (max_length > UINT_MAX32) ?
+ UINT_MAX32 : (uint32) max_length;
+ int4store(pos + 2, field_length);
}
pos[6]= field.type;
int2store(pos+7,field.flags);
diff --git a/sql/rpl_record.cc b/sql/rpl_record.cc
index 7c74dcba5a0..14a80cbb4b6 100644
--- a/sql/rpl_record.cc
+++ b/sql/rpl_record.cc
@@ -297,21 +297,16 @@ unpack_row(Relay_log_info const *rli,
/**
Fills @c table->record[0] with default values.
- First @c empty_record() is called and then, additionally, fields are
- initialized explicitly with a call to @c set_default().
-
- For optimization reasons, the explicit initialization can be skipped for
- first @c skip fields. This is useful if later we are going to fill these
- fields from other source (e.g. from a Rows replication event).
-
- If @c check is true, fields are explicitly initialized only if they have
- default value or can be NULL. Otherwise error is reported.
+ First @c restore_record() is called to restore the default values for
+ record concerning the given table. Then, if @c check is true,
+ a check is performed to see if fields are have default value or can
+ be NULL. Otherwise error is reported.
@param table Table whose record[0] buffer is prepared.
- @param skip Number of columns for which default value initialization
+ @param skip Number of columns for which default/nullable check
should be skipped.
- @param check Indicates if errors should be checked when setting default
- values.
+ @param check Indicates if errors should be raised when checking
+ default/nullable field properties.
@returns 0 on success or a handler level error code
*/
@@ -321,25 +316,28 @@ int prepare_record(TABLE *const table,
DBUG_ENTER("prepare_record");
int error= 0;
- empty_record(table);
+ restore_record(table, s->default_values);
- if (skip >= table->s->fields) // nothing to do
+ /*
+ This skip should be revisited in 6.0, because in 6.0 RBR one
+ can have holes in the row (as the grain of the writeset is
+ the column and not the entire row).
+ */
+ if (skip >= table->s->fields || !check)
DBUG_RETURN(0);
- /* Explicit initialization of fields */
+ /* Checking if exists default/nullable fields in the default values. */
for (Field **field_ptr= table->field+skip ; *field_ptr ; ++field_ptr)
{
uint32 const mask= NOT_NULL_FLAG | NO_DEFAULT_VALUE_FLAG;
Field *const f= *field_ptr;
- if (check && ((f->flags & mask) == mask))
+ if (((f->flags & mask) == mask))
{
my_error(ER_NO_DEFAULT_FOR_FIELD, MYF(0), f->field_name);
error = HA_ERR_ROWS_EVENT_APPLY;
}
- else
- f->set_default();
}
DBUG_RETURN(error);
diff --git a/sql/rpl_rli.cc b/sql/rpl_rli.cc
index 3a0f784d195..e93417374fe 100644
--- a/sql/rpl_rli.cc
+++ b/sql/rpl_rli.cc
@@ -104,6 +104,11 @@ int init_relay_log_info(Relay_log_info* rli,
rli->tables_to_lock= 0;
rli->tables_to_lock_count= 0;
+ fn_format(rli->slave_patternload_file, PREFIX_SQL_LOAD, slave_load_tmpdir, "",
+ MY_PACK_FILENAME | MY_UNPACK_FILENAME |
+ MY_RETURN_REAL_PATH);
+ rli->slave_patternload_file_size= strlen(rli->slave_patternload_file);
+
/*
The relay log will now be opened, as a SEQ_READ_APPEND IO_CACHE.
Note that the I/O thread flushes it to disk after writing every
diff --git a/sql/rpl_rli.h b/sql/rpl_rli.h
index e13ea93842c..171778d9675 100644
--- a/sql/rpl_rli.h
+++ b/sql/rpl_rli.h
@@ -260,6 +260,13 @@ public:
char ign_master_log_name_end[FN_REFLEN];
ulonglong ign_master_log_pos_end;
+ /*
+ Indentifies where the SQL Thread should create temporary files for the
+ LOAD DATA INFILE. This is used for security reasons.
+ */
+ char slave_patternload_file[FN_REFLEN];
+ size_t slave_patternload_file_size;
+
Relay_log_info();
~Relay_log_info();
diff --git a/sql/set_var.cc b/sql/set_var.cc
index 7e2efd2d580..84e628fbddf 100644
--- a/sql/set_var.cc
+++ b/sql/set_var.cc
@@ -110,6 +110,7 @@ static void sys_default_init_connect(THD*, enum_var_type type);
static bool sys_update_init_slave(THD*, set_var*);
static void sys_default_init_slave(THD*, enum_var_type type);
static bool set_option_bit(THD *thd, set_var *var);
+static bool set_option_log_bin_bit(THD *thd, set_var *var);
static bool set_option_autocommit(THD *thd, set_var *var);
static int check_log_update(THD *thd, set_var *var);
static bool set_log_update(THD *thd, set_var *var);
@@ -134,8 +135,6 @@ static int check_max_delayed_threads(THD *thd, set_var *var);
static void fix_thd_mem_root(THD *thd, enum_var_type type);
static void fix_trans_mem_root(THD *thd, enum_var_type type);
static void fix_server_id(THD *thd, enum_var_type type);
-static ulonglong fix_unsigned(THD *, ulonglong, const struct my_option *);
-static bool get_unsigned(THD *thd, set_var *var);
bool throw_bounds_warning(THD *thd, bool fixed, bool unsignd,
const char *name, longlong val);
static KEY_CACHE *create_key_cache(const char *name, uint length);
@@ -731,7 +730,7 @@ static sys_var_thd_bit sys_log_update(&vars, "sql_log_update",
OPTION_BIN_LOG);
static sys_var_thd_bit sys_log_binlog(&vars, "sql_log_bin",
check_log_update,
- set_option_bit,
+ set_option_log_bin_bit,
OPTION_BIN_LOG);
static sys_var_thd_bit sys_sql_warnings(&vars, "sql_warnings", 0,
set_option_bit,
@@ -1370,6 +1369,19 @@ static void fix_server_id(THD *thd, enum_var_type type)
}
+/**
+ Throw warning (error in STRICT mode) if value for variable needed bounding.
+ Only call from check(), not update(), because an error in update() would be
+ bad mojo. Plug-in interface also uses this.
+
+ @param thd thread handle
+ @param fixed did we have to correct the value? (throw warn/err if so)
+ @param unsignd is value's type unsigned?
+ @param name variable's name
+ @param val variable's value
+
+ @retval TRUE on error, FALSE otherwise (warning or OK)
+ */
bool throw_bounds_warning(THD *thd, bool fixed, bool unsignd,
const char *name, longlong val)
{
@@ -1395,26 +1407,128 @@ bool throw_bounds_warning(THD *thd, bool fixed, bool unsignd,
return FALSE;
}
-static ulonglong fix_unsigned(THD *thd, ulonglong num,
+
+/**
+ check an unsigned user-supplied value for a systemvariable against bounds.
+
+ TODO: This is a wrapper function to call clipping from within an update()
+ function. Calling bounds from within update() is fair game in theory,
+ but we can only send warnings from in there, not errors, and besides,
+ it violates our model of separating check from update phase.
+ To avoid breaking out of the server with an ASSERT() in strict mode,
+ we pretend we're not in strict mode when we go through here. Bug#43233
+ was opened to remind us to replace this kludge with The Right Thing,
+ which of course is to do the check in the actual check phase, and then
+ throw an error or warning accordingly.
+
+ @param thd thread handle
+ @param num the value to limit
+ @param option_limits the bounds-record, or NULL if none
+ */
+static void bound_unsigned(THD *thd, ulonglong *num,
const struct my_option *option_limits)
{
- my_bool fixed= FALSE;
- ulonglong out= getopt_ull_limit_value(num, option_limits, &fixed);
+ if (option_limits)
+ {
+ my_bool fixed = FALSE;
+ ulonglong unadjusted= *num;
+
+ *num= getopt_ull_limit_value(unadjusted, option_limits, &fixed);
- throw_bounds_warning(thd, fixed, TRUE, option_limits->name, (longlong) num);
- return out;
+ if (fixed)
+ {
+ ulong ssm= thd->variables.sql_mode;
+ thd->variables.sql_mode&= ~MODE_STRICT_ALL_TABLES;
+ throw_bounds_warning(thd, fixed, TRUE, option_limits->name, unadjusted);
+ thd->variables.sql_mode= ssm;
+ }
+ }
}
-static bool get_unsigned(THD *thd, set_var *var)
-{
+
+/**
+ Get unsigned system-variable.
+ Negative value does not wrap around, but becomes zero.
+ Check user-supplied value for a systemvariable against bounds.
+ If we needed to adjust the value, throw a warning or error depending
+ on SQL-mode.
+
+ @param thd thread handle
+ @param var the system-variable to get
+ @param user_max a limit given with --maximum-variable-name=... or 0
+ @param var_type function will bound on systems where necessary.
+
+ @retval TRUE on error, FALSE otherwise (warning or OK)
+ */
+static bool get_unsigned(THD *thd, set_var *var, ulonglong user_max,
+ ulong var_type)
+{
+ int warnings= 0;
+ ulonglong unadjusted;
+ const struct my_option *limits= var->var->option_limits;
+ struct my_option fallback;
+
+ /* get_unsigned() */
if (var->value->unsigned_flag)
var->save_result.ulonglong_value= (ulonglong) var->value->val_int();
else
{
longlong v= var->value->val_int();
var->save_result.ulonglong_value= (ulonglong) ((v < 0) ? 0 : v);
+ if (v < 0)
+ {
+ warnings++;
+ if (throw_bounds_warning(thd, TRUE, FALSE, var->var->name, v))
+ return TRUE; /* warning was promoted to error, give up */
+ }
}
- return 0;
+
+ unadjusted= var->save_result.ulonglong_value;
+
+ /* max, if any */
+
+ if ((user_max > 0) && (unadjusted > user_max))
+ {
+ var->save_result.ulonglong_value= user_max;
+
+ if ((warnings == 0) && throw_bounds_warning(thd, TRUE, TRUE,
+ var->var->name,
+ (longlong) unadjusted))
+ return TRUE;
+
+ warnings++;
+ }
+
+ /*
+ if the sysvar doesn't have a proper bounds record but the check
+ function would like bounding to ULONG where its size differs from
+ that of ULONGLONG, we make up a bogus limits record here and let
+ the usual suspects handle the actual limiting.
+ */
+
+ if (!limits && var_type != GET_ULL)
+ {
+ bzero(&fallback, sizeof(fallback));
+ fallback.var_type= var_type;
+ limits= &fallback;
+ }
+
+ /* fix_unsigned() */
+ if (limits)
+ {
+ my_bool fixed;
+
+ var->save_result.ulonglong_value= getopt_ull_limit_value(var->save_result.
+ ulonglong_value,
+ limits, &fixed);
+
+ if ((warnings == 0) && throw_bounds_warning(thd, fixed, TRUE,
+ var->var->name,
+ (longlong) unadjusted))
+ return TRUE;
+ }
+
+ return FALSE;
}
@@ -1428,29 +1542,13 @@ sys_var_long_ptr(sys_var_chain *chain, const char *name_arg, ulong *value_ptr_ar
bool sys_var_long_ptr_global::check(THD *thd, set_var *var)
{
- return get_unsigned(thd, var);
+ return get_unsigned(thd, var, 0, GET_ULONG);
}
bool sys_var_long_ptr_global::update(THD *thd, set_var *var)
{
- ulonglong tmp= var->save_result.ulonglong_value;
pthread_mutex_lock(guard);
- if (option_limits)
- *value= (ulong) fix_unsigned(thd, tmp, option_limits);
- else
- {
-#if SIZEOF_LONG < SIZEOF_LONG_LONG
- /* Avoid overflows on 32 bit systems */
- if (tmp > ULONG_MAX)
- {
- tmp= ULONG_MAX;
- throw_bounds_warning(thd, TRUE, TRUE, name,
- (longlong) var->save_result.ulonglong_value);
- }
-#endif
- *value= (ulong) tmp;
- }
-
+ *value= (ulong) var->save_result.ulonglong_value;
pthread_mutex_unlock(guard);
return 0;
}
@@ -1470,10 +1568,8 @@ bool sys_var_ulonglong_ptr::update(THD *thd, set_var *var)
{
ulonglong tmp= var->save_result.ulonglong_value;
pthread_mutex_lock(&LOCK_global_system_variables);
- if (option_limits)
- *value= (ulonglong) fix_unsigned(thd, tmp, option_limits);
- else
- *value= (ulonglong) tmp;
+ bound_unsigned(thd, &tmp, option_limits);
+ *value= (ulonglong) tmp;
pthread_mutex_unlock(&LOCK_global_system_variables);
return 0;
}
@@ -1523,36 +1619,18 @@ uchar *sys_var_enum_const::value_ptr(THD *thd, enum_var_type type,
bool sys_var_thd_ulong::check(THD *thd, set_var *var)
{
- return (get_unsigned(thd, var) ||
- (check_func && (*check_func)(thd, var)));
+ if (get_unsigned(thd, var, max_system_variables.*offset, GET_ULONG))
+ return TRUE;
+ DBUG_ASSERT(var->save_result.ulonglong_value <= ULONG_MAX);
+ return ((check_func && (*check_func)(thd, var)));
}
bool sys_var_thd_ulong::update(THD *thd, set_var *var)
{
- ulonglong tmp= var->save_result.ulonglong_value;
-
- /* Don't use bigger value than given with --maximum-variable-name=.. */
- if (tmp > max_system_variables.*offset)
- {
- throw_bounds_warning(thd, TRUE, TRUE, name, (longlong) tmp);
- tmp= max_system_variables.*offset;
- }
-
- if (option_limits)
- tmp= fix_unsigned(thd, tmp, option_limits);
-#if SIZEOF_LONG < SIZEOF_LONG_LONG
- else if (tmp > ULONG_MAX)
- {
- tmp= ULONG_MAX;
- throw_bounds_warning(thd, TRUE, TRUE, name, (longlong) var->save_result.ulonglong_value);
- }
-#endif
-
- DBUG_ASSERT(tmp <= ULONG_MAX);
if (var->type == OPT_GLOBAL)
- global_system_variables.*offset= (ulong) tmp;
+ global_system_variables.*offset= (ulong) var->save_result.ulonglong_value;
else
- thd->variables.*offset= (ulong) tmp;
+ thd->variables.*offset= (ulong) var->save_result.ulonglong_value;
return 0;
}
@@ -1590,8 +1668,8 @@ bool sys_var_thd_ha_rows::update(THD *thd, set_var *var)
if ((ha_rows) tmp > max_system_variables.*offset)
tmp= max_system_variables.*offset;
- if (option_limits)
- tmp= (ha_rows) fix_unsigned(thd, tmp, option_limits);
+ bound_unsigned(thd, &tmp, option_limits);
+
if (var->type == OPT_GLOBAL)
{
/* Lock is needed to make things safe on 32 bit systems */
@@ -1632,27 +1710,21 @@ uchar *sys_var_thd_ha_rows::value_ptr(THD *thd, enum_var_type type,
bool sys_var_thd_ulonglong::check(THD *thd, set_var *var)
{
- return get_unsigned(thd, var);
+ return get_unsigned(thd, var, max_system_variables.*offset, GET_ULL);
}
bool sys_var_thd_ulonglong::update(THD *thd, set_var *var)
{
- ulonglong tmp= var->save_result.ulonglong_value;
-
- if (tmp > max_system_variables.*offset)
- tmp= max_system_variables.*offset;
-
- if (option_limits)
- tmp= fix_unsigned(thd, tmp, option_limits);
if (var->type == OPT_GLOBAL)
{
/* Lock is needed to make things safe on 32 bit systems */
pthread_mutex_lock(&LOCK_global_system_variables);
- global_system_variables.*offset= (ulonglong) tmp;
+ global_system_variables.*offset= (ulonglong)
+ var->save_result.ulonglong_value;
pthread_mutex_unlock(&LOCK_global_system_variables);
}
else
- thd->variables.*offset= (ulonglong) tmp;
+ thd->variables.*offset= (ulonglong) var->save_result.ulonglong_value;
return 0;
}
@@ -2284,10 +2356,10 @@ bool sys_var_key_buffer_size::update(THD *thd, set_var *var)
goto end;
}
- key_cache->param_buff_size=
- (ulonglong) fix_unsigned(thd, tmp, option_limits);
+ bound_unsigned(thd, &tmp, option_limits);
+ key_cache->param_buff_size= (ulonglong) tmp;
- /* If key cache didn't existed initialize it, else resize it */
+ /* If key cache didn't exist initialize it, else resize it */
key_cache->in_init= 1;
pthread_mutex_unlock(&LOCK_global_system_variables);
@@ -2313,7 +2385,7 @@ end:
*/
bool sys_var_key_cache_long::update(THD *thd, set_var *var)
{
- ulong tmp= (ulong) var->value->val_int();
+ ulonglong tmp= var->value->val_int();
LEX_STRING *base_name= &var->base;
bool error= 0;
@@ -2338,8 +2410,8 @@ bool sys_var_key_cache_long::update(THD *thd, set_var *var)
if (key_cache->in_init)
goto end;
- *((ulong*) (((char*) key_cache) + offset))=
- (ulong) fix_unsigned(thd, tmp, option_limits);
+ bound_unsigned(thd, &tmp, option_limits);
+ *((ulong*) (((char*) key_cache) + offset))= (ulong) tmp;
/*
Don't create a new key cache if it didn't exist
@@ -2963,6 +3035,16 @@ static bool set_option_bit(THD *thd, set_var *var)
return 0;
}
+/*
+ Functions to be only used to update thd->options OPTION_BIN_LOG bit
+*/
+static bool set_option_log_bin_bit(THD *thd, set_var *var)
+{
+ set_option_bit(thd, var);
+ if (!thd->in_sub_stmt)
+ thd->sql_log_bin_toplevel= thd->options & OPTION_BIN_LOG;
+ return 0;
+}
static bool set_option_autocommit(THD *thd, set_var *var)
{
diff --git a/sql/share/errmsg.txt b/sql/share/errmsg.txt
index befd064e3e3..aa1521acab6 100644
--- a/sql/share/errmsg.txt
+++ b/sql/share/errmsg.txt
@@ -5775,9 +5775,9 @@ ER_PARTITION_MGMT_ON_NONPARTITIONED
ger "Partitionsverwaltung einer nicht partitionierten Tabelle ist nicht möglich"
swe "Partitioneringskommando på en opartitionerad tabell är inte möjligt"
ER_FOREIGN_KEY_ON_PARTITIONED
- eng "Foreign key condition is not yet supported in conjunction with partitioning"
+ eng "Foreign key clause is not yet supported in conjunction with partitioning"
ger "Fremdschlüssel-Beschränkungen sind im Zusammenhang mit Partitionierung nicht zulässig"
- swe "Foreign key villkor är inte ännu implementerad i kombination med partitionering"
+ swe "Foreign key klausul är inte ännu implementerad i kombination med partitionering"
ER_DROP_PARTITION_NON_EXISTENT
eng "Error in list of partitions to %-.64s"
ger "Fehler in der Partitionsliste bei %-.64s"
@@ -5791,13 +5791,13 @@ ER_COALESCE_ONLY_ON_HASH_PARTITION
ger "COALESCE PARTITION kann nur auf HASH- oder KEY-Partitionen benutzt werden"
swe "COALESCE PARTITION kan bara användas på HASH/KEY partitioner"
ER_REORG_HASH_ONLY_ON_SAME_NO
- eng "REORGANISE PARTITION can only be used to reorganise partitions not to change their numbers"
+ eng "REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers"
ger "REORGANIZE PARTITION kann nur zur Reorganisation von Partitionen verwendet werden, nicht, um ihre Nummern zu ändern"
- swe "REORGANISE PARTITION kan bara användas för att omorganisera partitioner, inte för att ändra deras antal"
+ swe "REORGANIZE PARTITION kan bara användas för att omorganisera partitioner, inte för att ändra deras antal"
ER_REORG_NO_PARAM_ERROR
- eng "REORGANISE PARTITION without parameters can only be used on auto-partitioned tables using HASH PARTITIONs"
+ eng "REORGANIZE PARTITION without parameters can only be used on auto-partitioned tables using HASH PARTITIONs"
ger "REORGANIZE PARTITION ohne Parameter kann nur für auto-partitionierte Tabellen verwendet werden, die HASH-Partitionierung benutzen"
- swe "REORGANISE PARTITION utan parametrar kan bara användas på auto-partitionerade tabeller som använder HASH partitionering"
+ swe "REORGANIZE PARTITION utan parametrar kan bara användas på auto-partitionerade tabeller som använder HASH partitionering"
ER_ONLY_ON_RANGE_LIST_PARTITION
eng "%-.64s PARTITION can only be used on RANGE/LIST partitions"
ger "%-.64s PARTITION kann nur für RANGE- oder LIST-Partitionen verwendet werden"
@@ -5815,7 +5815,7 @@ ER_COALESCE_PARTITION_NO_PARTITION
ger "Zumindest eine Partition muss mit COALESCE PARTITION zusammengefügt werden"
swe "Åtminstone en partition måste slås ihop vid COALESCE PARTITION"
ER_REORG_PARTITION_NOT_EXIST
- eng "More partitions to reorganise than there are partitions"
+ eng "More partitions to reorganize than there are partitions"
ger "Es wurde versucht, mehr Partitionen als vorhanden zu reorganisieren"
swe "Fler partitioner att reorganisera än det finns partitioner"
ER_SAME_NAME_PARTITION
@@ -5827,7 +5827,7 @@ ER_NO_BINLOG_ERROR
ger "Es es nicht erlaubt, bei diesem Befehl binlog abzuschalten"
swe "Det är inte tillåtet att stänga av binlog på detta kommando"
ER_CONSECUTIVE_REORG_PARTITIONS
- eng "When reorganising a set of partitions they must be in consecutive order"
+ eng "When reorganizing a set of partitions they must be in consecutive order"
ger "Bei der Reorganisation eines Satzes von Partitionen müssen diese in geordneter Reihenfolge vorliegen"
swe "När ett antal partitioner omorganiseras måste de vara i konsekutiv ordning"
ER_REORG_OUTSIDE_RANGE
@@ -6154,3 +6154,26 @@ WARN_PLUGIN_BUSY
ER_VARIABLE_IS_READONLY
eng "%s variable '%s' is read-only. Use SET %s to assign the value"
+
+ER_WARN_ENGINE_TRANSACTION_ROLLBACK
+ eng "Storage engine %s does not support rollback for this statement. Transaction rolled back and must be restarted"
+
+ER_SLAVE_HEARTBEAT_FAILURE
+ eng "Unexpected master's heartbeat data: %s"
+ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE
+ eng "The requested value for the heartbeat period %s %s"
+
+ER_NDB_REPLICATION_SCHEMA_ERROR
+ eng "Bad schema for mysql.ndb_replication table. Message: %-.64s"
+ER_CONFLICT_FN_PARSE_ERROR
+ eng "Error in parsing conflict function. Message: %-.64s"
+ER_EXCEPTIONS_WRITE_ERROR
+ eng "Write to exceptions table failed. Message: %-.128s""
+
+ER_TOO_LONG_TABLE_COMMENT
+ eng "Comment for table '%-.64s' is too long (max = %lu)"
+ por "Comentário para a tabela '%-.64s' é longo demais (max = %lu)"
+
+ER_TOO_LONG_FIELD_COMMENT
+ eng "Comment for field '%-.64s' is too long (max = %lu)"
+ por "Comentário para o campo '%-.64s' é longo demais (max = %lu)"
diff --git a/sql/sp.cc b/sql/sp.cc
index cc545992857..b2c7c389136 100644
--- a/sql/sp.cc
+++ b/sql/sp.cc
@@ -936,10 +936,12 @@ sp_create_routine(THD *thd, int type, sp_head *sp)
ret= SP_INTERNAL_ERROR;
goto done;
}
-
+ /* restore sql_mode when binloging */
+ thd->variables.sql_mode= saved_mode;
/* Such a statement can always go directly to binlog, no trans cache */
thd->binlog_query(THD::MYSQL_QUERY_TYPE,
log_query.c_ptr(), log_query.length(), FALSE, FALSE);
+ thd->variables.sql_mode= 0;
}
}
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index d17bf085e3b..0db371a666d 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -1440,7 +1440,8 @@ void close_temporary_tables(THD *thd)
if (!thd->temporary_tables)
return;
- if (!mysql_bin_log.is_open() || thd->current_stmt_binlog_row_based)
+ if (!mysql_bin_log.is_open() ||
+ (thd->current_stmt_binlog_row_based && thd->variables.binlog_format == BINLOG_FORMAT_ROW))
{
TABLE *tmp_next;
for (table= thd->temporary_tables; table; table= tmp_next)
diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc
index 4a5b75c4f78..25907d4ec20 100644
--- a/sql/sql_cache.cc
+++ b/sql/sql_cache.cc
@@ -418,6 +418,43 @@ TYPELIB query_cache_type_typelib=
array_elements(query_cache_type_names)-1,"", query_cache_type_names, NULL
};
+
+/**
+ Helper function for determine if a SELECT statement has a SQL_NO_CACHE
+ directive.
+
+ @param sql A pointer to the first white space character after SELECT
+
+ @return
+ @retval TRUE The character string contains SQL_NO_CACHE
+ @retval FALSE No directive found.
+*/
+
+static bool has_no_cache_directive(char *sql)
+{
+ int i=0;
+ while (sql[i] == ' ')
+ ++i;
+
+ if (my_toupper(system_charset_info, sql[i]) == 'S' &&
+ my_toupper(system_charset_info, sql[i+1]) == 'Q' &&
+ my_toupper(system_charset_info, sql[i+2]) == 'L' &&
+ my_toupper(system_charset_info, sql[i+3]) == '_' &&
+ my_toupper(system_charset_info, sql[i+4]) == 'N' &&
+ my_toupper(system_charset_info, sql[i+5]) == 'O' &&
+ my_toupper(system_charset_info, sql[i+6]) == '_' &&
+ my_toupper(system_charset_info, sql[i+7]) == 'C' &&
+ my_toupper(system_charset_info, sql[i+8]) == 'A' &&
+ my_toupper(system_charset_info, sql[i+9]) == 'C' &&
+ my_toupper(system_charset_info, sql[i+10]) == 'H' &&
+ my_toupper(system_charset_info, sql[i+11]) == 'E' &&
+ my_toupper(system_charset_info, sql[i+12]) == ' ')
+ return TRUE;
+
+ return FALSE;
+}
+
+
/*****************************************************************************
Query_cache_block_table method(s)
*****************************************************************************/
@@ -1233,6 +1270,16 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length)
DBUG_PRINT("qcache", ("The statement is not a SELECT; Not cached"));
goto err;
}
+
+ if (query_length > 20 && has_no_cache_directive(&sql[i+6]))
+ {
+ /*
+ We do not increase 'refused' statistics here since it will be done
+ later when the query is parsed.
+ */
+ DBUG_PRINT("qcache", ("The statement has a SQL_NO_CACHE directive"));
+ goto err;
+ }
}
STRUCT_LOCK(&structure_guard_mutex);
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index 597478933d6..cd00d0e20f1 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -538,6 +538,7 @@ THD::THD()
Open_tables_state(refresh_version), rli_fake(0),
lock_id(&main_lock_id),
user_time(0), in_sub_stmt(0),
+ sql_log_bin_toplevel(false),
binlog_table_maps(0), binlog_flags(0UL),
table_map_for_update(0),
arg_of_last_insert_id_function(FALSE),
@@ -787,6 +788,7 @@ void THD::init(void)
update_charset();
reset_current_stmt_binlog_row_based();
bzero((char *) &status_var, sizeof(status_var));
+ sql_log_bin_toplevel= options & OPTION_BIN_LOG;
}
@@ -3662,7 +3664,7 @@ int THD::binlog_query(THD::enum_binlog_query_type qtype, char const *query_arg,
If we are in statement mode and trying to log an unsafe statement,
we should print a warning.
*/
- if (lex->is_stmt_unsafe() &&
+ if (sql_log_bin_toplevel && lex->is_stmt_unsafe() &&
variables.binlog_format == BINLOG_FORMAT_STMT)
{
push_warning(this, MYSQL_ERROR::WARN_LEVEL_WARN,
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 3439e5b4f74..0a33d2767f5 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -1350,6 +1350,8 @@ public:
/* <> 0 if we are inside of trigger or stored function. */
uint in_sub_stmt;
+ /* TRUE when the current top has SQL_LOG_BIN ON */
+ bool sql_log_bin_toplevel;
/* container for handler's private per-connection data */
Ha_data ha_data[MAX_HA];
diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc
index 28a9fb5c78e..9c8bba6208c 100644
--- a/sql/sql_handler.cc
+++ b/sql/sql_handler.cc
@@ -160,6 +160,9 @@ static void mysql_ha_close_table(THD *thd, TABLE_LIST *tables,
table->query_id= thd->query_id;
table->open_by_handler= 0;
}
+
+ /* Mark table as closed, ready for re-open if necessary. */
+ tables->table= NULL;
}
/*
@@ -177,8 +180,7 @@ static void mysql_ha_close_table(THD *thd, TABLE_LIST *tables,
'reopen' is set when a handler table is to be re-opened. In this case,
'tables' is the pointer to the hashed TABLE_LIST object which has been
saved on the original open.
- 'reopen' is also used to suppress the sending of an 'ok' message or
- error messages.
+ 'reopen' is also used to suppress the sending of an 'ok' message.
RETURN
FALSE OK
@@ -214,8 +216,7 @@ bool mysql_ha_open(THD *thd, TABLE_LIST *tables, bool reopen)
strlen(tables->alias) + 1))
{
DBUG_PRINT("info",("duplicate '%s'", tables->alias));
- if (! reopen)
- my_error(ER_NONUNIQ_TABLE, MYF(0), tables->alias);
+ my_error(ER_NONUNIQ_TABLE, MYF(0), tables->alias);
goto err;
}
}
@@ -259,8 +260,7 @@ bool mysql_ha_open(THD *thd, TABLE_LIST *tables, bool reopen)
/* There can be only one table in '*tables'. */
if (! (tables->table->file->ha_table_flags() & HA_CAN_SQL_HANDLER))
{
- if (! reopen)
- my_error(ER_ILLEGAL_HA, MYF(0), tables->alias);
+ my_error(ER_ILLEGAL_HA, MYF(0), tables->alias);
goto err;
}
@@ -479,8 +479,7 @@ retry:
if (need_reopen)
{
- mysql_ha_close_table(thd, tables, FALSE);
- hash_tables->table= NULL;
+ mysql_ha_close_table(thd, hash_tables, FALSE);
/*
The lock might have been aborted, we need to manually reset
thd->some_tables_deleted because handler's tables are closed
@@ -761,11 +760,7 @@ void mysql_ha_flush(THD *thd)
{
hash_tables= (TABLE_LIST*) hash_element(&thd->handler_tables_hash, i);
if (hash_tables->table && hash_tables->table->needs_reopen_or_name_lock())
- {
mysql_ha_close_table(thd, hash_tables, TRUE);
- /* Mark table as closed, ready for re-open. */
- hash_tables->table= NULL;
- }
}
DBUG_VOID_RETURN;
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index 9619d26893c..19a19f2b6fb 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -1559,6 +1559,7 @@ void st_select_lex::init_query()
exclude_from_table_unique_test= no_wrap_view_item= FALSE;
nest_level= 0;
link_next= 0;
+ lock_option= TL_READ_DEFAULT;
}
void st_select_lex::init_select()
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index ed6b9e7d8df..a48b99d07c7 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -688,6 +688,15 @@ public:
int cur_pos_in_select_list;
List<udf_func> udf_list; /* udf function calls stack */
+
+ /**
+ Per sub-query locking strategy.
+ Note: This variable might interfer with the corresponding statement-level
+ variable Lex::lock_option because on how different parser rules depend
+ on eachother.
+ */
+ thr_lock_type lock_option;
+
/*
This is a copy of the original JOIN USING list that comes from
the parser. The parser :
diff --git a/sql/sql_load.cc b/sql/sql_load.cc
index 239fb1d49f3..0acc22c3daf 100644
--- a/sql/sql_load.cc
+++ b/sql/sql_load.cc
@@ -15,10 +15,10 @@
/* Copy data from a textfile to table */
-
#include "mysql_priv.h"
#include <my_dir.h>
#include <m_ctype.h>
+#include "rpl_mi.h"
#include "sql_repl.h"
#include "sp_head.h"
#include "sql_trigger.h"
@@ -310,8 +310,31 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
is_fifo = 1;
#endif
- if (opt_secure_file_priv &&
- strncmp(opt_secure_file_priv, name, strlen(opt_secure_file_priv)))
+ if (thd->slave_thread)
+ {
+#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
+ if (strncmp(active_mi->rli.slave_patternload_file, name,
+ active_mi->rli.slave_patternload_file_size))
+ {
+ /*
+ LOAD DATA INFILE in the slave SQL Thread can only read from
+ --slave-load-tmpdir". This should never happen. Please, report a bug.
+ */
+
+ sql_print_error("LOAD DATA INFILE in the slave SQL Thread can only read from --slave-load-tmpdir. " \
+ "Please, report a bug.");
+ my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--slave-load-tmpdir");
+ DBUG_RETURN(TRUE);
+ }
+#else
+ /*
+ This is impossible and should never happen.
+ */
+ DBUG_ASSERT(FALSE);
+#endif
+ }
+ else if (opt_secure_file_priv &&
+ strncmp(opt_secure_file_priv, name, strlen(opt_secure_file_priv)))
{
/* Read only allowed from within dir specified by secure_file_priv */
my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--secure-file-priv");
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index f7d6d5bac4d..94725b1b53f 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -4129,9 +4129,32 @@ end_with_restore_list:
res= (sp_result= lex->sphead->create(thd));
switch (sp_result) {
- case SP_OK:
+ case SP_OK: {
#ifndef NO_EMBEDDED_ACCESS_CHECKS
/* only add privileges if really neccessary */
+
+ Security_context security_context;
+ bool restore_backup_context= false;
+ Security_context *backup= NULL;
+ LEX_USER *definer= thd->lex->definer;
+ /*
+ Check if the definer exists on slave,
+ then use definer privilege to insert routine privileges to mysql.procs_priv.
+
+ For current user of SQL thread has GLOBAL_ACL privilege,
+ which doesn't any check routine privileges,
+ so no routine privilege record will insert into mysql.procs_priv.
+ */
+ if (thd->slave_thread && is_acl_user(definer->host.str, definer->user.str))
+ {
+ security_context.change_security_context(thd,
+ &thd->lex->definer->user,
+ &thd->lex->definer->host,
+ &thd->lex->sphead->m_db,
+ &backup);
+ restore_backup_context= true;
+ }
+
if (sp_automatic_privileges && !opt_noacl &&
check_routine_access(thd, DEFAULT_CREATE_PROC_ACLS,
lex->sphead->m_db.str, name,
@@ -4143,8 +4166,19 @@ end_with_restore_list:
ER_PROC_AUTO_GRANT_FAIL,
ER(ER_PROC_AUTO_GRANT_FAIL));
}
+
+ /*
+ Restore current user with GLOBAL_ACL privilege of SQL thread
+ */
+ if (restore_backup_context)
+ {
+ DBUG_ASSERT(thd->slave_thread == 1);
+ thd->security_ctx->restore_security_context(thd, backup);
+ }
+
#endif
break;
+ }
case SP_WRITE_ROW_FAILED:
my_error(ER_SP_ALREADY_EXISTS, MYF(0), SP_TYPE_STRING(lex), name);
break;
@@ -5580,6 +5614,14 @@ void mysql_reset_thd_for_next_command(THD *thd)
}
+/**
+ Resets the lex->current_select object.
+ @note It is assumed that lex->current_select != NULL
+
+ This function is a wrapper around select_lex->init_select() with an added
+ check for the special situation when using INTO OUTFILE and LOAD DATA.
+*/
+
void
mysql_init_select(LEX *lex)
{
@@ -5594,6 +5636,18 @@ mysql_init_select(LEX *lex)
}
+/**
+ Used to allocate a new SELECT_LEX object on the current thd mem_root and
+ link it into the relevant lists.
+
+ This function is always followed by mysql_init_select.
+
+ @see mysql_init_select
+
+ @retval TRUE An error occurred
+ @retval FALSE The new SELECT_LEX was successfully allocated.
+*/
+
bool
mysql_new_select(LEX *lex, bool move_down)
{
@@ -6411,7 +6465,6 @@ void st_select_lex::set_lock_for_tables(thr_lock_type lock_type)
DBUG_ENTER("set_lock_for_tables");
DBUG_PRINT("enter", ("lock_type: %d for_update: %d", lock_type,
for_update));
-
for (TABLE_LIST *tables= (TABLE_LIST*) table_list.first;
tables;
tables= tables->next_local)
diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc
index 60f205ec8e8..1465b6d2d30 100644
--- a/sql/sql_plugin.cc
+++ b/sql/sql_plugin.cc
@@ -1139,8 +1139,9 @@ int plugin_init(int *argc, char **argv, int flags)
for (plugin= *builtins; plugin->info; plugin++)
{
if (opt_ignore_builtin_innodb &&
- !my_strcasecmp(&my_charset_latin1, plugin->name, "InnoDB"))
- continue;
+ !my_strnncoll(&my_charset_latin1, (const uchar*) plugin->name,
+ 6, (const uchar*) "InnoDB", 6))
+ continue;
/* by default, ndbcluster and federated are disabled */
def_enabled=
my_strcasecmp(&my_charset_latin1, plugin->name, "NDBCLUSTER") != 0 &&
@@ -1633,8 +1634,8 @@ bool mysql_install_plugin(THD *thd, const LEX_STRING *name, const LEX_STRING *dl
{
TABLE_LIST tables;
TABLE *table;
- int error, argc;
- char *argv[2];
+ int error, argc=orig_argc;
+ char **argv=orig_argv;
struct st_plugin_int *tmp;
DBUG_ENTER("mysql_install_plugin");
@@ -1650,21 +1651,31 @@ bool mysql_install_plugin(THD *thd, const LEX_STRING *name, const LEX_STRING *dl
pthread_mutex_lock(&LOCK_plugin);
rw_wrlock(&LOCK_system_variables_hash);
- /* handle_options() assumes arg0 (program name) always exists */
- argv[0]= const_cast<char*>(""); // without a cast gcc emits a warning
- argv[1]= 0;
- argc= 1;
+
+ my_load_defaults(MYSQL_CONFIG_NAME, load_default_groups, &argc, &argv, NULL);
error= plugin_add(thd->mem_root, name, dl, &argc, argv, REPORT_TO_USER);
+ if (argv)
+ free_defaults(argv);
rw_unlock(&LOCK_system_variables_hash);
if (error || !(tmp= plugin_find_internal(name, MYSQL_ANY_PLUGIN)))
goto err;
- if (plugin_initialize(tmp))
+ if (tmp->state == PLUGIN_IS_DISABLED)
{
- my_error(ER_CANT_INITIALIZE_UDF, MYF(0), name->str,
- "Plugin initialization function failed.");
- goto deinit;
+ push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
+ ER_CANT_INITIALIZE_UDF, ER(ER_CANT_INITIALIZE_UDF),
+ name->str, "Plugin is disabled");
+ }
+ else
+ {
+ DBUG_ASSERT(tmp->state == PLUGIN_IS_UNINITIALIZED);
+ if (plugin_initialize(tmp))
+ {
+ my_error(ER_CANT_INITIALIZE_UDF, MYF(0), name->str,
+ "Plugin initialization function failed.");
+ goto deinit;
+ }
}
/*
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index bea748562eb..0a3238b0185 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -7625,7 +7625,7 @@ static COND *build_equal_items_for_cond(THD *thd, COND *cond,
if (and_level)
{
/*
- Retrieve all conjucts of this level detecting the equality
+ Retrieve all conjuncts of this level detecting the equality
that are subject to substitution by multiple equality items and
removing each such predicate from the conjunction after having
found/created a multiple equality whose inference the predicate is.
@@ -7641,6 +7641,15 @@ static COND *build_equal_items_for_cond(THD *thd, COND *cond,
li.remove();
}
+ /*
+ Check if we eliminated all the predicates of the level, e.g.
+ (a=a AND b=b AND a=a).
+ */
+ if (!args->elements &&
+ !cond_equal.current_level.elements &&
+ !eq_list.elements)
+ return new Item_int((longlong) 1, 1);
+
List_iterator_fast<Item_equal> it(cond_equal.current_level);
while ((item_equal= it++))
{
@@ -9788,6 +9797,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
table->in_use= thd;
table->quick_keys.init();
table->covering_keys.init();
+ table->merge_keys.init();
table->keys_in_use_for_query.init();
table->s= share;
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 71fd79b597a..d08b3a248c4 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -287,7 +287,7 @@ static struct show_privileges_st sys_privileges[]=
{"Alter", "Tables", "To alter the table"},
{"Alter routine", "Functions,Procedures", "To alter or drop stored functions/procedures"},
{"Create", "Databases,Tables,Indexes", "To create new databases and tables"},
- {"Create routine","Functions,Procedures","To use CREATE FUNCTION/PROCEDURE"},
+ {"Create routine","Databases","To use CREATE FUNCTION/PROCEDURE"},
{"Create temporary tables","Databases","To use CREATE TEMPORARY TABLE"},
{"Create view", "Tables", "To create new views"},
{"Create user", "Server Admin", "To create new users"},
@@ -1598,21 +1598,25 @@ void append_definer(THD *thd, String *buffer, const LEX_STRING *definer_user,
int
view_store_create_info(THD *thd, TABLE_LIST *table, String *buff)
{
+ my_bool compact_view_name= TRUE;
my_bool foreign_db_mode= (thd->variables.sql_mode & (MODE_POSTGRESQL |
MODE_ORACLE |
MODE_MSSQL |
MODE_DB2 |
MODE_MAXDB |
MODE_ANSI)) != 0;
- /*
- Compact output format for view can be used
- - if user has db of this view as current db
- - if this view only references table inside it's own db
- */
+
if (!thd->db || strcmp(thd->db, table->view_db.str))
- table->compact_view_format= FALSE;
+ /*
+ print compact view name if the view belongs to the current database
+ */
+ compact_view_name= table->compact_view_format= FALSE;
else
{
+ /*
+ Compact output format for view body can be used
+ if this view only references table inside it's own db
+ */
TABLE_LIST *tbl;
table->compact_view_format= TRUE;
for (tbl= thd->lex->query_tables;
@@ -1633,7 +1637,7 @@ view_store_create_info(THD *thd, TABLE_LIST *table, String *buff)
view_store_options(thd, table, buff);
}
buff->append(STRING_WITH_LEN("VIEW "));
- if (!table->compact_view_format)
+ if (!compact_view_name)
{
append_identifier(thd, buff, table->view_db.str, table->view_db.length);
buff->append('.');
@@ -1700,7 +1704,8 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose)
field_list.push_back(field=new Item_empty_string("db",NAME_CHAR_LEN));
field->maybe_null=1;
field_list.push_back(new Item_empty_string("Command",16));
- field_list.push_back(new Item_return_int("Time",7, MYSQL_TYPE_LONG));
+ field_list.push_back(field= new Item_return_int("Time",7, MYSQL_TYPE_LONG));
+ field->unsigned_flag= 0;
field_list.push_back(field=new Item_empty_string("State",30));
field->maybe_null=1;
field_list.push_back(field=new Item_empty_string("Info",max_query_length));
@@ -1793,7 +1798,7 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose)
else
protocol->store(command_name[thd_info->command].str, system_charset_info);
if (thd_info->start_time)
- protocol->store((uint32) (now - thd_info->start_time));
+ protocol->store_long ((longlong) (now - thd_info->start_time));
else
protocol->store_null();
protocol->store(thd_info->state_info, system_charset_info);
@@ -1868,8 +1873,8 @@ int fill_schema_processlist(THD* thd, TABLE_LIST* tables, COND* cond)
table->field[4]->store(command_name[tmp->command].str,
command_name[tmp->command].length, cs);
/* MYSQL_TIME */
- table->field[5]->store((uint32)(tmp->start_time ?
- now - tmp->start_time : 0), TRUE);
+ table->field[5]->store((longlong)(tmp->start_time ?
+ now - tmp->start_time : 0), FALSE);
/* STATE */
#ifndef EMBEDDED_LIBRARY
val= (char*) (tmp->locked ? "Locked" :
@@ -3792,8 +3797,19 @@ static int get_schema_column_record(THD *thd, TABLE_LIST *tables,
cs);
table->field[4]->store((longlong) count, TRUE);
field->sql_type(type);
- table->field[14]->store(type.ptr(), type.length(), cs);
+ table->field[14]->store(type.ptr(), type.length(), cs);
+ /*
+ MySQL column type has the following format:
+ base_type [(dimension)] [unsigned] [zerofill].
+ For DATA_TYPE column we extract only base type.
+ */
tmp_buff= strchr(type.ptr(), '(');
+ if (!tmp_buff)
+ /*
+ if there is no dimention part then check the presence of
+ [unsigned] [zerofill] attributes and cut them of if exist.
+ */
+ tmp_buff= strchr(type.ptr(), ' ');
table->field[7]->store(type.ptr(),
(tmp_buff ? tmp_buff - type.ptr() :
type.length()), cs);
@@ -6543,7 +6559,7 @@ ST_FIELD_INFO processlist_fields_info[]=
SKIP_OPEN_TABLE},
{"DB", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 1, "Db", SKIP_OPEN_TABLE},
{"COMMAND", 16, MYSQL_TYPE_STRING, 0, 0, "Command", SKIP_OPEN_TABLE},
- {"TIME", 7, MYSQL_TYPE_LONGLONG, 0, 0, "Time", SKIP_OPEN_TABLE},
+ {"TIME", 7, MYSQL_TYPE_LONG, 0, 0, "Time", SKIP_OPEN_TABLE},
{"STATE", 64, MYSQL_TYPE_STRING, 0, 1, "State", SKIP_OPEN_TABLE},
{"INFO", PROCESS_LIST_INFO_WIDTH, MYSQL_TYPE_STRING, 0, 1, "Info",
SKIP_OPEN_TABLE},
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index f0059e7a95b..60714348d03 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -3321,7 +3321,7 @@ bool mysql_create_table_no_lock(THD *thd,
if (key->type == Key::FOREIGN_KEY &&
!part_info->is_auto_partitioned)
{
- my_error(ER_CANNOT_ADD_FOREIGN, MYF(0));
+ my_error(ER_FOREIGN_KEY_ON_PARTITIONED, MYF(0));
goto err;
}
}
@@ -4297,7 +4297,14 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
view_checksum(thd, table) == HA_ADMIN_WRONG_CHECKSUM)
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
ER_VIEW_CHECKSUM, ER(ER_VIEW_CHECKSUM));
- result_code= HA_ADMIN_CORRUPT;
+ if (thd->main_da.is_error() &&
+ (thd->main_da.sql_errno() == ER_NO_SUCH_TABLE ||
+ thd->main_da.sql_errno() == ER_FILE_NOT_FOUND))
+ /* A missing table is just issued as a failed command */
+ result_code= HA_ADMIN_FAILED;
+ else
+ /* Default failure code is corrupt table */
+ result_code= HA_ADMIN_CORRUPT;
goto send_result;
}
diff --git a/sql/sql_view.cc b/sql/sql_view.cc
index be66f7c2d80..b6ea6579d08 100644
--- a/sql/sql_view.cc
+++ b/sql/sql_view.cc
@@ -564,24 +564,36 @@ bool mysql_create_view(THD *thd, TABLE_LIST *views,
fill_effective_table_privileges(thd, &view->grant, view->db,
view->table_name);
+ /*
+ Make sure that the current user does not have more column-level privileges
+ on the newly created view than he/she does on the underlying
+ tables. E.g. it must not be so that the user has UPDATE privileges on a
+ view column of he/she doesn't have it on the underlying table's
+ corresponding column. In that case, return an error for CREATE VIEW.
+ */
{
Item *report_item= NULL;
+ /*
+ This will hold the intersection of the priviliges on all columns in the
+ view.
+ */
uint final_priv= VIEW_ANY_ACL;
-
- for (sl= select_lex; sl; sl= sl->next_select())
- {
- DBUG_ASSERT(view->db); /* Must be set in the parser */
- List_iterator_fast<Item> it(sl->item_list);
- Item *item;
- while ((item= it++))
+
+ for (sl= select_lex; sl; sl= sl->next_select())
{
+ DBUG_ASSERT(view->db); /* Must be set in the parser */
+ List_iterator_fast<Item> it(sl->item_list);
+ Item *item;
+ while ((item= it++))
+ {
Item_field *fld= item->filed_for_view_update();
- uint priv= (get_column_grant(thd, &view->grant, view->db,
- view->table_name, item->name) &
- VIEW_ANY_ACL);
+ uint priv= (get_column_grant(thd, &view->grant, view->db,
+ view->table_name, item->name) &
+ VIEW_ANY_ACL);
if (fld && !fld->field->table->s->tmp_table)
- {
+ {
+
final_priv&= fld->have_privileges;
if (~fld->have_privileges & priv)
@@ -589,17 +601,15 @@ bool mysql_create_view(THD *thd, TABLE_LIST *views,
}
}
}
-
- if (!final_priv)
- {
- DBUG_ASSERT(report_item);
-
- my_error(ER_COLUMNACCESS_DENIED_ERROR, MYF(0),
- "create view", thd->security_ctx->priv_user,
+
+ if (!final_priv && report_item)
+ {
+ my_error(ER_COLUMNACCESS_DENIED_ERROR, MYF(0),
+ "create view", thd->security_ctx->priv_user,
thd->security_ctx->priv_host, report_item->name,
- view->table_name);
- res= TRUE;
- goto err;
+ view->table_name);
+ res= TRUE;
+ goto err;
}
}
#endif
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 371a146696d..e56ff7c6ad7 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -6489,7 +6489,8 @@ select_option:
{
if (check_simple_select())
MYSQL_YYABORT;
- Lex->lock_option= TL_READ_HIGH_PRIORITY;
+ Lex->lock_option= TL_READ_HIGH_PRIORITY;
+ Lex->current_select->lock_option= TL_READ_HIGH_PRIORITY;
}
| DISTINCT { Select->options|= SELECT_DISTINCT; }
| SQL_SMALL_RESULT { Select->options|= SELECT_SMALL_RESULT; }
@@ -6535,6 +6536,7 @@ select_lock_type:
{
LEX *lex=Lex;
lex->current_select->set_lock_for_tables(TL_WRITE);
+ lex->current_select->lock_option= TL_WRITE;
lex->safe_to_cache_query=0;
}
| LOCK_SYM IN_SYM SHARE_SYM MODE_SYM
@@ -6542,6 +6544,7 @@ select_lock_type:
LEX *lex=Lex;
lex->current_select->
set_lock_for_tables(TL_READ_WITH_SHARED_LOCKS);
+ lex->current_select->lock_option= TL_READ_WITH_SHARED_LOCKS;
lex->safe_to_cache_query=0;
}
;
@@ -12909,6 +12912,18 @@ subselect_start:
subselect_end:
{
LEX *lex=Lex;
+ /*
+ Set the required lock level for the tables associated with the
+ current sub-select. This will overwrite previous lock options set
+ using st_select_lex::add_table_to_list in any of the following
+ rules: single_multi, table_wild_one, load_data, table_alias_ref,
+ table_factor.
+ The default lock level is TL_READ_DEFAULT but it can be modified
+ with query options specific for a certain (sub-)SELECT.
+ */
+ lex->current_select->
+ set_lock_for_tables(lex->current_select->lock_option);
+
lex->pop_context();
SELECT_LEX *child= lex->current_select;
lex->current_select = lex->current_select->return_after_parsing();
diff --git a/sql/table.cc b/sql/table.cc
index 17454ffb012..d24ee4c6a27 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -1652,6 +1652,7 @@ int open_table_from_share(THD *thd, TABLE_SHARE *share, const char *alias,
goto err;
outparam->quick_keys.init();
outparam->covering_keys.init();
+ outparam->merge_keys.init();
outparam->keys_in_use_for_query.init();
/* Allocate handler */
@@ -2982,11 +2983,8 @@ void st_table::reset_item_list(List<Item> *item_list) const
void TABLE_LIST::calc_md5(char *buffer)
{
- my_MD5_CTX context;
uchar digest[16];
- my_MD5Init(&context);
- my_MD5Update(&context,(uchar *) select_stmt.str, select_stmt.length);
- my_MD5Final(digest, &context);
+ MY_MD5_HASH(digest, (uchar *) select_stmt.str, select_stmt.length);
sprintf((char *) buffer,
"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
digest[0], digest[1], digest[2], digest[3],
diff --git a/sql/unireg.cc b/sql/unireg.cc
index da018ebec3d..51293184ad8 100644
--- a/sql/unireg.cc
+++ b/sql/unireg.cc
@@ -229,16 +229,16 @@ bool mysql_create_frm(THD *thd, const char *file_name,
create_info->comment.length, 60);
if (tmp_len < create_info->comment.length)
{
- (void) my_snprintf(buff, sizeof(buff), "Too long comment for table '%s'",
- table);
if ((thd->variables.sql_mode &
(MODE_STRICT_TRANS_TABLES | MODE_STRICT_ALL_TABLES)))
{
- my_message(ER_UNKNOWN_ERROR, buff, MYF(0));
+ my_error(ER_TOO_LONG_TABLE_COMMENT, MYF(0), table, tmp_len);
goto err;
}
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
- ER_UNKNOWN_ERROR, ER(ER_UNKNOWN_ERROR), buff);
+ ER_TOO_LONG_TABLE_COMMENT,
+ ER(ER_TOO_LONG_TABLE_COMMENT),
+ table, tmp_len);
create_info->comment.length= tmp_len;
}
@@ -613,17 +613,16 @@ static bool pack_header(uchar *forminfo, enum legacy_db_type table_type,
255);
if (tmp_len < field->comment.length)
{
- char buff[128];
- (void) my_snprintf(buff,sizeof(buff), "Too long comment for field '%s'",
- field->field_name);
if ((current_thd->variables.sql_mode &
(MODE_STRICT_TRANS_TABLES | MODE_STRICT_ALL_TABLES)))
{
- my_message(ER_UNKNOWN_ERROR, buff, MYF(0));
+ my_error(ER_TOO_LONG_FIELD_COMMENT, MYF(0), field->field_name, tmp_len);
DBUG_RETURN(1);
}
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
- ER_UNKNOWN_ERROR, ER(ER_UNKNOWN_ERROR), buff);
+ ER_TOO_LONG_FIELD_COMMENT,
+ ER(ER_TOO_LONG_FIELD_COMMENT),
+ field->field_name, tmp_len);
field->comment.length= tmp_len;
}
diff --git a/storage/Makefile.am b/storage/Makefile.am
index b978453d29d..4f19be3a361 100644
--- a/storage/Makefile.am
+++ b/storage/Makefile.am
@@ -20,6 +20,7 @@ AUTOMAKE_OPTIONS = foreign
# These are built from source in the Docs directory
EXTRA_DIST =
SUBDIRS = @mysql_se_dirs@
+DIST_SUBDIRS = @mysql_se_distdirs@
# Don't update the files from bitkeeper
%::SCCS/s.%
diff --git a/storage/archive/ha_archive.cc b/storage/archive/ha_archive.cc
index 7edfca53751..d20ab3bf723 100644
--- a/storage/archive/ha_archive.cc
+++ b/storage/archive/ha_archive.cc
@@ -1076,11 +1076,9 @@ int ha_archive::unpack_row(azio_stream *file_to_read, uchar *record)
read= azread(file_to_read, record_buffer->buffer, row_len, &error);
- DBUG_ASSERT(row_len == read);
-
if (read != row_len || error)
{
- DBUG_RETURN(-1);
+ DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE);
}
/* Copy null bits */
@@ -1257,7 +1255,7 @@ int ha_archive::repair(THD* thd, HA_CHECK_OPT* check_opt)
int rc= optimize(thd, check_opt);
if (rc)
- DBUG_RETURN(HA_ERR_CRASHED_ON_REPAIR);
+ DBUG_RETURN(HA_ADMIN_CORRUPT);
share->crashed= FALSE;
DBUG_RETURN(0);
diff --git a/storage/ibmdb2i/CMakeLists.txt b/storage/ibmdb2i/CMakeLists.txt
new file mode 100644
index 00000000000..11cc4300569
--- /dev/null
+++ b/storage/ibmdb2i/CMakeLists.txt
@@ -0,0 +1,25 @@
+# Copyright (C) 2006 MySQL AB
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 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")
+
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/sql
+ ${CMAKE_SOURCE_DIR}/regex
+ ${CMAKE_SOURCE_DIR}/extra/yassl/include)
+ADD_LIBRARY(ibmdb2i ha_ibmdb2i.cc db2i_ileBridge.cc db2i_conversion.cc
+ db2i_blobCollection.cc db2i_file.cc db2i_charsetSupport.cc
+ db2i_collationSupport.cc db2i_errors.cc db2i_constraints.cc
+ db2i_rir.cc db2i_sqlStatementStream.cc db2i_ioBuffers.cc db2i_myconv.cc)
diff --git a/storage/ibmdb2i/Makefile.am b/storage/ibmdb2i/Makefile.am
new file mode 100644
index 00000000000..2436a764429
--- /dev/null
+++ b/storage/ibmdb2i/Makefile.am
@@ -0,0 +1,53 @@
+#
+# Copyright (c) 2007, 2008, IBM Corporation.
+# All rights reserved.
+#
+#
+
+#called from the top level Makefile
+
+MYSQLDATAdir = $(localstatedir)
+MYSQLSHAREdir = $(pkgdatadir)
+MYSQLBASEdir= $(prefix)
+MYSQLLIBdir= $(pkglibdir)
+pkgplugindir = $(pkglibdir)/plugin
+INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include \
+ -I$(top_srcdir)/regex \
+ -I$(top_srcdir)/sql \
+ -I$(srcdir) \
+ -I$ /afs/rchland.ibm.com/lande/shadow/dev2000/osxpf/v5r4m0f.xpf/cur/cmvc/base.pgm/my.xpf/apis \
+ -I$ /afs/rchland.ibm.com/lande/shadow/dev2000/osxpf/v5r4m0.xpf/bld/cmvc/base.pgm/lg.xpf \
+ -I$ /afs/rchland.ibm.com/lande/shadow/dev2000/osxpf/v5r4m0.xpf/bld/cmvc/base.pgm/tq.xpf
+WRAPLIBS=
+
+LDADD =
+
+DEFS = @DEFS@
+
+noinst_HEADERS = ha_ibmdb2i.h db2i_collationSupport.h db2i_file.h \
+ db2i_ioBuffers.h db2i_blobCollection.h \
+ db2i_global.h db2i_misc.h db2i_charsetSupport.h db2i_errors.h \
+ db2i_ileBridge.h db2i_validatedPointer.h
+
+EXTRA_LTLIBRARIES = ha_ibmdb2i.la
+pkgplugin_LTLIBRARIES = @plugin_ibmdb2i_shared_target@
+ha_ibmdb2i_la_LIBADD = -liconv
+ha_ibmdb2i_la_LDFLAGS = -module -rpath $(MYSQLLIBdir)
+ha_ibmdb2i_la_CXXFLAGS= $(AM_CFLAGS) -DMYSQL_DYNAMIC_PLUGIN
+ha_ibmdb2i_la_CFLAGS = $(AM_CFLAGS) -DMYSQL_DYNAMIC_PLUGIN
+ha_ibmdb2i_la_SOURCES = ha_ibmdb2i.cc db2i_ileBridge.cc db2i_conversion.cc \
+ db2i_blobCollection.cc db2i_file.cc db2i_charsetSupport.cc \
+ db2i_collationSupport.cc db2i_errors.cc db2i_constraints.cc \
+ db2i_rir.cc db2i_sqlStatementStream.cc db2i_ioBuffers.cc \
+ db2i_myconv.cc
+
+EXTRA_LIBRARIES = libibmdb2i.a
+noinst_LIBRARIES = @plugin_ibmdb2i_static_target@
+libibmdb2i_a_CXXFLAGS = $(AM_CFLAGS)
+libibmdb2i_a_CFLAGS = $(AM_CFLAGS)
+libibmdb2i_a_SOURCES= $(ha_ibmdb2i_la_SOURCES)
+
+
+EXTRA_DIST = CMakeLists.txt plug.in
+# Don't update the files from bitkeeper
+%::SCCS/s.%
diff --git a/storage/ibmdb2i/db2i_blobCollection.cc b/storage/ibmdb2i/db2i_blobCollection.cc
new file mode 100644
index 00000000000..17101c9c0a4
--- /dev/null
+++ b/storage/ibmdb2i/db2i_blobCollection.cc
@@ -0,0 +1,107 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+
+#include "db2i_blobCollection.h"
+
+/**
+ Return the size to use when allocating space for blob reads.
+
+ @param fieldIndex The field to allocate for
+ @param[out] shouldProtect Indicates whether storage protection should be
+ applied to the space, because the size returned is
+ smaller than the maximum possible size.
+*/
+
+uint32
+BlobCollection::getSizeToAllocate(int fieldIndex, bool& shouldProtect)
+{
+ Field* field = table->getMySQLTable()->field[fieldIndex];
+ uint fieldLength = field->max_display_length();
+
+ if (fieldLength <= MAX_FULL_ALLOCATE_BLOB_LENGTH)
+ {
+ shouldProtect = false;
+ return fieldLength;
+ }
+
+ shouldProtect = true;
+
+ uint curMaxSize = table->getBlobFieldActualSize(fieldIndex);
+
+ uint defaultAllocSize = min(defaultAllocation, fieldLength);
+
+ return max(defaultAllocSize, curMaxSize);
+
+}
+
+void
+BlobCollection::generateBuffer(int fieldIndex)
+{
+ DBUG_ASSERT(table->db2Field(fieldIndex).isBlob());
+
+ bool protect;
+ buffers[table->getBlobIdFromField(fieldIndex)].Malloc(getSizeToAllocate(fieldIndex, protect), protect);
+
+ return;
+}
+
+/**
+ Realloc the read buffer associated with a blob field.
+
+ This is used when the previous allocation for a blob field is found to be
+ too small (this is discovered when QMY_READ trips over the protected boundary
+ page).
+
+ @param fieldIndex The field to be reallocated
+ @param size The size of buffer to allocate for this field.
+*/
+
+ValidatedPointer<char>&
+BlobCollection::reallocBuffer(int fieldIndex, size_t size)
+{
+ ProtectedBuffer& buf = buffers[table->getBlobIdFromField(fieldIndex)];
+ if (size <= buf.allocLen())
+ return buf.ptr();
+
+ table->updateBlobFieldActualSize(fieldIndex, size);
+
+ DBUG_PRINT("BlobCollection::reallocBuffer",("PERF: reallocing %d to %d: ", fieldIndex, size));
+
+ bool protect;
+ buf.Free();
+ buf.Malloc(getSizeToAllocate(fieldIndex, protect), protect);
+ return buf.ptr();
+}
diff --git a/storage/ibmdb2i/db2i_blobCollection.h b/storage/ibmdb2i/db2i_blobCollection.h
new file mode 100644
index 00000000000..6a60394555f
--- /dev/null
+++ b/storage/ibmdb2i/db2i_blobCollection.h
@@ -0,0 +1,151 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+
+#ifndef DB2I_BLOBCOLLECTION_H
+#define DB2I_BLOBCOLLECTION_H
+
+#include "db2i_global.h"
+#include "db2i_file.h"
+
+/**
+ @class ProtectedBuffer
+ @brief Implements memory management for (optionally) protected buffers.
+
+ Buffers created with the protection option will have a guard page set on the
+ page following requested allocation size. The side effect is that the actual
+ allocation is up to 2*4096-1 bytes larger than the size requested by the
+ using code.
+*/
+
+class ProtectedBuffer
+{
+public:
+ ProtectedBuffer() : protectBuf(false)
+ {;}
+
+ void Malloc(size_t size, bool protect = false)
+ {
+ protectBuf = protect;
+ bufptr.alloc(size + (protectBuf ? 0x1fff : 0x0));
+ if ((void*)bufptr != NULL)
+ {
+ len = size;
+ if (protectBuf)
+ mprotect(protectedPage(), 0x1000, PROT_NONE);
+#ifndef DBUG_OFF
+ // Prevents a problem with DBUG_PRINT over-reading in recent versions of
+ // MySQL
+ *((char*)protectedPage()-1) = 0;
+#endif
+ }
+ }
+
+ void Free()
+ {
+ if ((void*)bufptr != NULL)
+ {
+ if (protectBuf)
+ mprotect(protectedPage(), 0x1000, PROT_READ | PROT_WRITE);
+ bufptr.dealloc();
+ }
+ }
+
+ ~ProtectedBuffer()
+ {
+ Free();
+ }
+
+ ValidatedPointer<char>& ptr() {return bufptr;}
+ bool isProtected() const {return protectBuf;}
+ size_t allocLen() const {return len;}
+private:
+ void* protectedPage()
+ {
+ return (void*)(((address64_t)(void*)bufptr + len + 0x1000) & ~0xfff);
+ }
+
+ ValidatedPointer<char> bufptr;
+ size_t len;
+ bool protectBuf;
+
+};
+
+
+/**
+ @class BlobCollection
+ @brief Manages memory allocation for reading blobs associated with a table.
+
+ Allocations are done on-demand and are protected with a guard page if less
+ than the max possible size is allocated.
+*/
+class BlobCollection
+{
+ public:
+ BlobCollection(db2i_table* db2Table, uint32 defaultAllocSize) :
+ defaultAllocation(defaultAllocSize), table(db2Table)
+ {
+ buffers = new ProtectedBuffer[table->getBlobCount()];
+ }
+
+ ~BlobCollection()
+ {
+ delete[] buffers;
+ }
+
+ ValidatedPointer<char>& getBufferPtr(int fieldIndex)
+ {
+ int blobIndex = table->getBlobIdFromField(fieldIndex);
+ if ((char*)buffers[blobIndex].ptr() == NULL)
+ generateBuffer(fieldIndex);
+
+ return buffers[blobIndex].ptr();
+ }
+
+ ValidatedPointer<char>& reallocBuffer(int fieldIndex, size_t size);
+
+
+ private:
+
+ uint32 getSizeToAllocate(int fieldIndex, bool& shouldProtect);
+ void generateBuffer(int fieldIndex);
+
+ db2i_table* table; // The table being read
+ ProtectedBuffer* buffers; // The buffers
+ uint32 defaultAllocation;
+ /* The default size to use when first allocating a buffer */
+};
+
+#endif
diff --git a/storage/ibmdb2i/db2i_charsetSupport.cc b/storage/ibmdb2i/db2i_charsetSupport.cc
new file mode 100644
index 00000000000..2609d42887e
--- /dev/null
+++ b/storage/ibmdb2i/db2i_charsetSupport.cc
@@ -0,0 +1,793 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+
+
+#include "db2i_charsetSupport.h"
+#include "as400_types.h"
+#include "as400_protos.h"
+#include "db2i_ileBridge.h"
+#include "qlgusr.h"
+#include "db2i_errors.h"
+
+
+/*
+ The following arrays define a mapping between IANA-style text descriptors and
+ IBM i CCSID text descriptors. The mapping is a 1-to-1 correlation between
+ corresponding array slots.
+*/
+#define MAX_IANASTRING 23
+static const char ianaStringType[MAX_IANASTRING][10] =
+{
+ {"ascii"},
+ {"Big5"}, //big5
+ {"cp1250"},
+ {"cp1251"},
+ {"cp1256"},
+ {"cp850"},
+ {"cp852"},
+ {"cp866"},
+ {"IBM943"}, //cp932
+ {"EUC-KR"}, //euckr
+ {"IBM1381"}, //gb2312
+ {"IBM1386"}, //gbk
+ {"greek"},
+ {"hebrew"},
+ {"latin1"},
+ {"latin2"},
+ {"latin5"},
+ {"macce"},
+ {"tis620"},
+ {"Shift_JIS"}, //sjis
+ {"ucs2"},
+ {"EUC-JP"}, //ujis
+ {"utf8"}
+};
+static const char ccsidType[MAX_IANASTRING][6] =
+{
+ {"367"}, //ascii
+ {"950"}, //big5
+ {"1250"}, //cp1250
+ {"1251"}, //cp1251
+ {"1256"}, //cp1256
+ {"850"}, //cp850
+ {"852"}, //cp852
+ {"866"}, //cp866
+ {"943"}, //cp932
+ {"970"}, //euckr
+ {"1381"}, //gb2312
+ {"1386"}, //gbk
+ {"813"}, //greek
+ {"916"}, //hebrew
+ {"923"}, //latin1
+ {"912"}, //latin2
+ {"920"}, //latin5
+ {"1282"}, //macce
+ {"874"}, //tis620
+ {"943"}, //sjis
+ {"13488"},//ucs2
+ {"5050"}, //ujis
+ {"1208"} //utf8
+};
+
+static _ILEpointer *QlgCvtTextDescToDesc_sym;
+
+/* We keep a cache of the mapping for text descriptions obtained via
+ QlgTextDescToDesc. The following structures implement this cache. */
+static HASH textDescMapHash;
+static MEM_ROOT textDescMapMemroot;
+static pthread_mutex_t textDescMapHashMutex;
+struct TextDescMap
+{
+ struct HashKey
+ {
+ int32 inType;
+ int32 outType;
+ char inDesc[Qlg_MaxDescSize];
+ } hashKey;
+ char outDesc[Qlg_MaxDescSize];
+};
+
+/* We keep a cache of the mapping for open iconv descriptors. The following
+ structures implement this cache. */
+static HASH iconvMapHash;
+static MEM_ROOT iconvMapMemroot;
+static pthread_mutex_t iconvMapHashMutex;
+struct IconvMap
+{
+ struct HashKey
+ {
+ uint16 direction; // This is a uint16 instead of a uchar to avoid garbage data in the key from compiler padding
+ uint16 db2CCSID;
+ const CHARSET_INFO* myCharset;
+ } hashKey;
+ iconv_t iconvDesc;
+};
+
+
+/**
+ Initialize the static structures used by this module.
+
+ This must only be called once per plugin instantiation.
+
+ @return 0 if successful. Failure otherwise
+*/
+int32 initCharsetSupport()
+{
+ DBUG_ENTER("initCharsetSupport");
+
+ int actmark = _ILELOAD("QSYS/QLGUSR", ILELOAD_LIBOBJ);
+ if ( actmark == -1 )
+ {
+ DBUG_PRINT("initCharsetSupport", ("conversion srvpgm activation failed"));
+ DBUG_RETURN(1);
+ }
+
+ QlgCvtTextDescToDesc_sym = (ILEpointer*)malloc_aligned(sizeof(ILEpointer));
+ if (_ILESYM(QlgCvtTextDescToDesc_sym, actmark, "QlgCvtTextDescToDesc") == -1)
+ {
+ DBUG_PRINT("initCharsetSupport",
+ ("resolve of QlgCvtTextDescToDesc failed"));
+ DBUG_RETURN(errno);
+ }
+
+ VOID(pthread_mutex_init(&textDescMapHashMutex,MY_MUTEX_INIT_FAST));
+ hash_init(&textDescMapHash, &my_charset_bin, 10, offsetof(TextDescMap, hashKey), sizeof(TextDescMap::hashKey), 0, 0, HASH_UNIQUE);
+
+ VOID(pthread_mutex_init(&iconvMapHashMutex,MY_MUTEX_INIT_FAST));
+ hash_init(&iconvMapHash, &my_charset_bin, 10, offsetof(IconvMap, hashKey), sizeof(IconvMap::hashKey), 0, 0, HASH_UNIQUE);
+
+ init_alloc_root(&textDescMapMemroot, 2048, 0);
+ init_alloc_root(&iconvMapMemroot, 256, 0);
+
+ initMyconv();
+
+ DBUG_RETURN(0);
+}
+
+/**
+ Cleanup the static structures used by this module.
+
+ This must only be called once per plugin instantiation and only if
+ initCharsetSupport() was successful.
+*/
+void doneCharsetSupport()
+{
+ cleanupMyconv();
+
+ free_root(&textDescMapMemroot, 0);
+ free_root(&iconvMapMemroot, 0);
+
+ pthread_mutex_destroy(&textDescMapHashMutex);
+ hash_free(&textDescMapHash);
+ pthread_mutex_destroy(&iconvMapHashMutex);
+ hash_free(&iconvMapHash);
+ free_aligned(QlgCvtTextDescToDesc_sym);
+}
+
+
+/**
+ Convert a text description from one type to another.
+
+ This function is just a wrapper for the IBM i QlgTextDescToDesc function plus
+ some overrides for conversions that the API does not handle correctly and
+ support for caching the computed conversion.
+
+ @param inType The type of descriptor pointed to by "in".
+ @param outType The type of descriptor requested for "out".
+ @param in The descriptor to be convereted.
+ @param[out] out The equivalent descriptor
+ @param hashKey The hash key to be used for caching the conversion result.
+
+ @return 0 if successful. Failure otherwise
+*/
+static int32 getNewTextDesc(const int32 inType,
+ const int32 outType,
+ const char* in,
+ char* out,
+ const TextDescMap::HashKey* hashKey)
+{
+ DBUG_ENTER("db2i_charsetSupport::getNewTextDesc");
+ const arg_type_t signature[] = { ARG_INT32, ARG_INT32, ARG_MEMPTR, ARG_INT32, ARG_MEMPTR, ARG_INT32, ARG_INT32, ARG_END };
+ struct ArgList
+ {
+ ILEarglist_base base;
+ int32 CRDIInType;
+ int32 CRDIOutType;
+ ILEpointer CRDIDesc;
+ int32 CRDIDescSize;
+ ILEpointer CRDODesc;
+ int32 CRDODescSize;
+ int32 CTDCCSID;
+ } *arguments;
+
+ if ((inType == Qlg_TypeIANA) && (outType == Qlg_TypeAix41))
+ {
+ // Override non-standard charsets
+ if (unlikely(strcmp("IBM1381", in) == 0))
+ {
+ strcpy(out, "IBM-1381");
+ DBUG_RETURN(0);
+ }
+ }
+ else if ((inType == Qlg_TypeAS400CCSID) && (outType == Qlg_TypeAix41))
+ {
+ // Override non-standard charsets
+ if (unlikely(strcmp("1148", in) == 0))
+ {
+ strcpy(out, "IBM-1148");
+ DBUG_RETURN(0);
+ }
+ }
+
+ char argBuf[sizeof(ArgList)+15];
+ arguments = (ArgList*)roundToQuadWordBdy(argBuf);
+
+ arguments->CRDIInType = inType;
+ arguments->CRDIOutType = outType;
+ arguments->CRDIDesc.s.addr = (address64_t) in;
+ arguments->CRDIDescSize = Qlg_MaxDescSize;
+ arguments->CRDODesc.s.addr = (address64_t) out;
+ arguments->CRDODescSize = Qlg_MaxDescSize;
+ arguments->CTDCCSID = 819;
+ _ILECALL(QlgCvtTextDescToDesc_sym,
+ &arguments->base,
+ signature,
+ RESULT_INT32);
+ if (unlikely(arguments->base.result.s_int32.r_int32 < 0))
+ {
+ getErrTxt(DB2I_ERR_ILECALL,"QlgCvtTextDescToDesc",arguments->base.result.s_int32.r_int32);
+ DBUG_RETURN(DB2I_ERR_ILECALL);
+ }
+
+ // Store the conversion information into a cache entry
+ TextDescMap* mapping = (TextDescMap*)alloc_root(&textDescMapMemroot, sizeof(TextDescMap));
+ if (unlikely(!mapping))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ memcpy(&(mapping->hashKey), hashKey, sizeof(hashKey));
+ strcpy(mapping->outDesc, out);
+ pthread_mutex_lock(&textDescMapHashMutex);
+ my_hash_insert(&textDescMapHash, (const uchar*)mapping);
+ pthread_mutex_unlock(&textDescMapHashMutex);
+
+ DBUG_RETURN(0);
+}
+
+
+/**
+ Convert a text description from one type to another.
+
+ This function takes a text description in one representation and converts
+ it into another representation. Although the OS provides some facilities for
+ doing this, the support is not complete, nor does MySQL always use standard
+ identifiers. Therefore, there are a lot of hardcoded overrides required.
+ There is probably some room for optimization here, but this should not be
+ called frequently under most circumstances.
+
+ @param inType The type of descriptor pointed to by "in".
+ @param outType The type of descriptor requested for "out".
+ @param in The descriptor to be convereted.
+ @param[out] out The equivalent descriptor
+
+ @return 0 if successful. Failure otherwise
+*/
+static int32 convertTextDesc(const int32 inType, const int32 outType, const char* inDesc, char* outDesc)
+{
+ DBUG_ENTER("db2i_charsetSupport::convertTextDesc");
+ const char* inDescOverride;
+
+ if (inType == Qlg_TypeIANA)
+ {
+ // Override non-standard charsets
+ if (strcmp("big5", inDesc) == 0)
+ inDescOverride = "Big5";
+ else if (strcmp("cp932", inDesc) == 0)
+ inDescOverride = "IBM943";
+ else if (strcmp("euckr", inDesc) == 0)
+ inDescOverride = "EUC-KR";
+ else if (strcmp("gb2312", inDesc) == 0)
+ inDescOverride = "IBM1381";
+ else if (strcmp("gbk", inDesc) == 0)
+ inDescOverride = "IBM1386";
+ else if (strcmp("sjis", inDesc) == 0)
+ inDescOverride = "Shift_JIS";
+ else if (strcmp("ujis", inDesc) == 0)
+ inDescOverride = "EUC-JP";
+ else
+ inDescOverride = inDesc;
+
+ // Hardcode non-standard charsets
+ if (outType == Qlg_TypeAix41)
+ {
+ if (strcmp("Big5", inDescOverride) == 0)
+ {
+ strcpy(outDesc,"big5");
+ DBUG_RETURN(0);
+ }
+ else if (strcmp("IBM1386", inDescOverride) == 0)
+ {
+ strcpy(outDesc,"GBK");
+ DBUG_RETURN(0);
+ }
+ else if (strcmp("Shift_JIS", inDescOverride) == 0 ||
+ strcmp("IBM943", inDescOverride) == 0)
+ {
+ strcpy(outDesc,"IBM-943");
+ DBUG_RETURN(0);
+ }
+ else if (strcmp("tis620", inDescOverride) == 0)
+ {
+ strcpy(outDesc,"TIS-620");
+ DBUG_RETURN(0);
+ }
+ else if (strcmp("ucs2", inDescOverride) == 0)
+ {
+ strcpy(outDesc,"UCS-2");
+ DBUG_RETURN(0);
+ }
+ else if (strcmp("cp1250", inDescOverride) == 0)
+ {
+ strcpy(outDesc,"IBM-1250");
+ DBUG_RETURN(0);
+ }
+ else if (strcmp("cp1251", inDescOverride) == 0)
+ {
+ strcpy(outDesc,"IBM-1251");
+ DBUG_RETURN(0);
+ }
+ else if (strcmp("cp1256", inDescOverride) == 0)
+ {
+ strcpy(outDesc,"IBM-1256");
+ DBUG_RETURN(0);
+ }
+ }
+ else if (outType == Qlg_TypeAS400CCSID)
+ {
+ // See if we can fast path the convert
+ for (int loopCnt = 0; loopCnt < MAX_IANASTRING; ++loopCnt)
+ {
+ if (strcmp((char*)ianaStringType[loopCnt],inDescOverride) == 0)
+ {
+ strcpy(outDesc,ccsidType[loopCnt]);
+ DBUG_RETURN(0);
+ }
+ }
+ }
+ }
+ else
+ inDescOverride = inDesc;
+
+ // We call getNewTextDesc for all other conversions and cache the result.
+ TextDescMap *mapping;
+ TextDescMap::HashKey hashKey;
+ hashKey.inType= inType;
+ hashKey.outType= outType;
+ uint32 len = strlen(inDescOverride);
+ memcpy(hashKey.inDesc, inDescOverride, len);
+ memset(hashKey.inDesc+len, 0, sizeof(hashKey.inDesc) - len);
+
+ if (!(mapping=(TextDescMap *) hash_search(&textDescMapHash,
+ (const uchar*)&hashKey,
+ sizeof(hashKey))))
+ {
+ DBUG_RETURN(getNewTextDesc(inType, outType, inDescOverride, outDesc, &hashKey));
+ }
+ else
+ {
+ strcpy(outDesc, mapping->outDesc);
+ }
+ DBUG_RETURN(0);
+}
+
+
+/**
+ Convert an IANA character set name into a DB2 for i CCSID value.
+
+ @param parmIANADesc An IANA character set name
+ @param[out] db2Ccsid The equivalent CCSID value
+
+ @return 0 if successful. Failure otherwise
+*/
+int32 convertIANAToDb2Ccsid(const char* parmIANADesc, uint16* db2Ccsid)
+{
+ int32 rc;
+ uint16 aixCcsid;
+ char aixCcsidString[Qlg_MaxDescSize];
+ int aixEncodingScheme;
+ int db2EncodingScheme;
+ rc = convertTextDesc(Qlg_TypeIANA, Qlg_TypeAS400CCSID, parmIANADesc, aixCcsidString);
+ if (rc != 0)
+ return rc;
+ aixCcsid = atoi(aixCcsidString);
+ rc = getEncodingScheme(aixCcsid, aixEncodingScheme);
+ if (rc != 0)
+ return rc;
+ switch(aixEncodingScheme) { // Select on encoding scheme
+ case 0x1100: // EDCDIC SBCS
+ case 0x2100: // ASCII SBCS
+ case 0x4100: // AIX SBCS
+ case 0x4105: // MS Windows
+ case 0x5100: // ISO 7 bit ASCII
+ db2EncodingScheme = 0x1100;
+ break;
+ case 0x1200: // EDCDIC DBCS
+ case 0x2200: // ASCII DBCS
+ db2EncodingScheme = 0x1200;
+ break;
+ case 0x1301: // EDCDIC Mixed
+ case 0x2300: // ASCII Mixed
+ case 0x4403: // EUC (ISO 2022)
+ db2EncodingScheme = 0x1301;
+ break;
+ case 0x7200: // UCS2
+ db2EncodingScheme = 0x7200;
+ break;
+ case 0x7807: // UTF-8
+ db2EncodingScheme = 0x7807;
+ break;
+ case 0x7500: // UTF-32
+ db2EncodingScheme = 0x7500;
+ break;
+ default: // Unknown
+ {
+ getErrTxt(DB2I_ERR_UNKNOWN_ENCODING,aixEncodingScheme);
+ return DB2I_ERR_UNKNOWN_ENCODING;
+ }
+ break;
+ }
+ if (aixEncodingScheme == db2EncodingScheme)
+ {
+ *db2Ccsid = aixCcsid;
+ }
+ else
+ {
+ rc = getAssociatedCCSID(aixCcsid, db2EncodingScheme, db2Ccsid); // EDCDIC SBCS
+ if (rc != 0)
+ return rc;
+ }
+
+ return 0;
+}
+
+
+/**
+ Obtain the encoding scheme of a CCSID.
+
+ @param inCcsid An IBM i CCSID
+ @param[out] outEncodingScheme The associated encoding scheme
+
+ @return 0 if successful. Failure otherwise
+*/
+int32 getEncodingScheme(const uint16 inCcsid, int32& outEncodingScheme)
+{
+ DBUG_ENTER("db2i_charsetSupport::getEncodingScheme");
+
+ static bool ptrInited = FALSE;
+ static char ptrSpace[sizeof(ILEpointer) + 15];
+ static ILEpointer* ptrToPtr = (ILEpointer*)roundToQuadWordBdy(ptrSpace);
+ int rc;
+
+ if (!ptrInited)
+ {
+ rc = _RSLOBJ2(ptrToPtr, RSLOBJ_TS_PGM, "QTQGESP", "QSYS");
+
+ if (rc)
+ {
+ getErrTxt(DB2I_ERR_RESOLVE_OBJ,"QTQGESP","QSYS","*PGM",errno);
+ DBUG_RETURN(DB2I_ERR_RESOLVE_OBJ);
+ }
+ ptrInited = TRUE;
+ }
+
+ DBUG_ASSERT(inCcsid != 0);
+
+ int GESPCCSID = inCcsid;
+ int GESPLen = 32;
+ int GESPNbrVal = 0;
+ int32 GESPES;
+ int GESPCSCPL[32];
+ int GESPFB[3];
+ void* ILEArgv[7];
+ ILEArgv[0] = &GESPCCSID;
+ ILEArgv[1] = &GESPLen;
+ ILEArgv[2] = &GESPNbrVal;
+ ILEArgv[3] = &GESPES;
+ ILEArgv[4] = &GESPCSCPL;
+ ILEArgv[5] = &GESPFB;
+ ILEArgv[6] = NULL;
+
+ rc = _PGMCALL(ptrToPtr, (void**)&ILEArgv, 0);
+
+ if (rc)
+ {
+ getErrTxt(DB2I_ERR_PGMCALL,"QTQGESP","QSYS",rc);
+ DBUG_RETURN(DB2I_ERR_PGMCALL);
+ }
+ if (GESPFB[0] != 0 ||
+ GESPFB[1] != 0 ||
+ GESPFB[2] != 0)
+ {
+ getErrTxt(DB2I_ERR_QTQGESP,GESPFB[0],GESPFB[1],GESPFB[2]);
+ DBUG_RETURN(DB2I_ERR_QTQGESP);
+ }
+ outEncodingScheme = GESPES;
+
+ DBUG_RETURN(0);
+}
+
+
+/**
+ Get the best fit equivalent CCSID. (Wrapper for QTQGRDC API)
+
+ @param inCcsid An IBM i CCSID
+ @param inEncodingScheme The encoding scheme
+ @param[out] outCcsid The equivalent CCSID
+
+ @return 0 if successful. Failure otherwise
+*/
+int32 getAssociatedCCSID(const uint16 inCcsid, const int inEncodingScheme, uint16* outCcsid)
+{
+ DBUG_ENTER("db2i_charsetSupport::getAssociatedCCSID");
+ static bool ptrInited = FALSE;
+ static char ptrSpace[sizeof(ILEpointer) + 15];
+ static ILEpointer* ptrToPtr = (ILEpointer*)roundToQuadWordBdy(ptrSpace);
+ int rc;
+
+ // Override non-standard charsets
+ if ((inCcsid == 923) && (inEncodingScheme == 0x1100))
+ {
+ *outCcsid = 1148;
+ DBUG_RETURN(0);
+ }
+
+ if (!ptrInited)
+ {
+ rc = _RSLOBJ2(ptrToPtr, RSLOBJ_TS_PGM, "QTQGRDC", "QSYS");
+
+ if (rc)
+ {
+ getErrTxt(DB2I_ERR_RESOLVE_OBJ,"QTQGRDC","QSYS","*PGM",errno);
+ DBUG_RETURN(DB2I_ERR_RESOLVE_OBJ);
+ }
+ ptrInited = TRUE;
+ }
+
+ int GRDCCCSID = inCcsid;
+ int GRDCES = inEncodingScheme;
+ int GRDCSel = 0;
+ int GRDCAssCCSID;
+ int GRDCFB[3];
+ void* ILEArgv[7];
+ ILEArgv[0] = &GRDCCCSID;
+ ILEArgv[1] = &GRDCES;
+ ILEArgv[2] = &GRDCSel;
+ ILEArgv[3] = &GRDCAssCCSID;
+ ILEArgv[4] = &GRDCFB;
+ ILEArgv[5] = NULL;
+
+ rc = _PGMCALL(ptrToPtr, (void**)&ILEArgv, 0);
+
+ if (rc)
+ {
+ getErrTxt(DB2I_ERR_PGMCALL,"QTQGRDC","QSYS",rc);
+ DBUG_RETURN(DB2I_ERR_PGMCALL);
+ }
+ if (GRDCFB[0] != 0 ||
+ GRDCFB[1] != 0 ||
+ GRDCFB[2] != 0)
+ {
+ getErrTxt(DB2I_ERR_QTQGRDC,GRDCFB[0],GRDCFB[1],GRDCFB[2]);
+ DBUG_RETURN(DB2I_ERR_QTQGRDC);
+ }
+
+ *outCcsid = GRDCAssCCSID;
+
+ DBUG_RETURN(0);
+}
+
+/**
+ Open an iconv conversion between a MySQL charset and the respective IBM i CCSID
+
+ @param direction The direction of the conversion
+ @param mysqlCSName Name of the MySQL character set
+ @param db2CCSID The IBM i CCSID
+ @param hashKey The key to use for inserting the opened conversion into the cache
+ @param[out] newConversion The iconv descriptor
+
+ @return 0 if successful. Failure otherwise
+*/
+static int32 openNewConversion(enum_conversionDirection direction,
+ const char* mysqlCSName,
+ uint16 db2CCSID,
+ IconvMap::HashKey* hashKey,
+ iconv_t& newConversion)
+{
+ DBUG_ENTER("db2i_charsetSupport::openNewConversion");
+
+ char mysqlAix41Desc[Qlg_MaxDescSize];
+ char db2Aix41Desc[Qlg_MaxDescSize];
+ char db2CcsidString[6] = "";
+ int32 rc;
+
+ /*
+ First we have to convert the MySQL IANA-like name and the DB2 CCSID into
+ there equivalent iconv descriptions.
+ */
+ rc = convertTextDesc(Qlg_TypeIANA, Qlg_TypeAix41, mysqlCSName, mysqlAix41Desc);
+ if (rc)
+ DBUG_RETURN(rc);
+ CHARSET_INFO *cs= &my_charset_bin;
+ (uint)(cs->cset->long10_to_str)(cs,db2CcsidString,sizeof(db2CcsidString), 10, db2CCSID);
+ rc = convertTextDesc(Qlg_TypeAS400CCSID, Qlg_TypeAix41, db2CcsidString, db2Aix41Desc);
+ if (rc)
+ DBUG_RETURN(rc);
+
+ /* Call iconv to open the conversion. */
+ if (direction == toDB2)
+ {
+ newConversion = iconv_open(db2Aix41Desc, mysqlAix41Desc);
+ if (newConversion == (iconv_t) -1)
+ {
+ getErrTxt(DB2I_ERR_ICONV_OPEN, mysqlAix41Desc, db2Aix41Desc, errno);
+ DBUG_RETURN(DB2I_ERR_ICONV_OPEN);
+ }
+ }
+ else
+ {
+ newConversion = iconv_open(mysqlAix41Desc, db2Aix41Desc);
+ if (newConversion == (iconv_t) -1)
+ {
+ getErrTxt(DB2I_ERR_ICONV_OPEN, db2Aix41Desc, mysqlAix41Desc, errno);
+ DBUG_RETURN(DB2I_ERR_ICONV_OPEN);
+ }
+ }
+
+ /* Insert the new conversion into the cache. */
+ IconvMap* mapping = (IconvMap*)alloc_root(&iconvMapMemroot, sizeof(IconvMap));
+ if (!mapping)
+ {
+ my_error(ER_OUTOFMEMORY, MYF(0), sizeof(IconvMap));
+ DBUG_RETURN( HA_ERR_OUT_OF_MEM);
+ }
+ memcpy(&(mapping->hashKey), hashKey, sizeof(mapping->hashKey));
+ mapping->iconvDesc = newConversion;
+ pthread_mutex_lock(&iconvMapHashMutex);
+ my_hash_insert(&iconvMapHash, (const uchar*)mapping);
+ pthread_mutex_unlock(&iconvMapHashMutex);
+
+ DBUG_RETURN(0);
+}
+
+
+/**
+ Open an iconv conversion between a MySQL charset and the respective IBM i CCSID
+
+ @param direction The direction of the conversion
+ @param cs The MySQL character set
+ @param db2CCSID The IBM i CCSID
+ @param[out] newConversion The iconv descriptor
+
+ @return 0 if successful. Failure otherwise
+*/
+int32 getConversion(enum_conversionDirection direction, const CHARSET_INFO* cs, uint16 db2CCSID, iconv_t& conversion)
+{
+ DBUG_ENTER("db2i_charsetSupport::getConversion");
+
+ int32 rc;
+
+ /* Build the hash key */
+ IconvMap::HashKey hashKey;
+ hashKey.direction= direction;
+ hashKey.myCharset= cs;
+ hashKey.db2CCSID= db2CCSID;
+
+ /* Look for the conversion in the cache and add it if it is not there. */
+ IconvMap *mapping;
+ if (!(mapping= (IconvMap *) hash_search(&iconvMapHash,
+ (const uchar*)&hashKey,
+ sizeof(hashKey))))
+ {
+ DBUG_PRINT("getConversion", ("Hash miss for direction=%d, cs=%s, ccsid=%d", direction, cs->name, db2CCSID));
+ rc= openNewConversion(direction, cs->csname, db2CCSID, &hashKey, conversion);
+ if (rc)
+ DBUG_RETURN(rc);
+ }
+ else
+ {
+ conversion= mapping->iconvDesc;
+ }
+
+ DBUG_RETURN(0);
+}
+
+/**
+ Fast-path conversion from ASCII to EBCDIC for use in converting
+ identifiers to be sent to the QMY APIs.
+
+ @param input ASCII data
+ @param[out] ouput EBCDIC data
+ @param ilen Size of input buffer and output buffer
+*/
+int convToEbcdic(const char* input, char* output, size_t ilen)
+{
+ static bool inited = FALSE;
+ static iconv_t ic;
+
+ if (ilen == 0)
+ return 0;
+
+ if (!inited)
+ {
+ ic = iconv_open( "IBM-037", "ISO8859-1" );
+ inited = TRUE;
+ }
+ size_t substitutedChars;
+ size_t olen = ilen;
+ if (iconv( ic, (char**)&input, &ilen, &output, &olen, &substitutedChars ) == -1)
+ return errno;
+
+ return 0;
+}
+
+
+/**
+ Fast-path conversion from EBCDIC to ASCII for use in converting
+ data received from the QMY APIs.
+
+ @param input EBCDIC data
+ @param[out] ouput ASCII data
+ @param ilen Size of input buffer and output buffer
+*/
+int convFromEbcdic(const char* input, char* output, size_t ilen)
+{
+ static bool inited = FALSE;
+ static iconv_t ic;
+
+ if (ilen == 0)
+ return 0;
+
+ if (!inited)
+ {
+ ic = iconv_open("ISO8859-1", "IBM-037");
+ inited = TRUE;
+ }
+
+ size_t substitutedChars;
+ size_t olen = ilen;
+ if (iconv( ic, (char**)&input, &ilen, &output, &olen, &substitutedChars) == -1)
+ return errno;
+
+ return 0;
+}
diff --git a/storage/ibmdb2i/db2i_charsetSupport.h b/storage/ibmdb2i/db2i_charsetSupport.h
new file mode 100644
index 00000000000..77051e1e0db
--- /dev/null
+++ b/storage/ibmdb2i/db2i_charsetSupport.h
@@ -0,0 +1,65 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+
+#ifndef DB2I_CHARSETSUPPORT_H
+#define DB2I_CHARSETSUPPORT_H
+
+#include "db2i_global.h"
+#include "mysql_priv.h"
+#include <mysql/plugin.h>
+#include "db2i_iconv.h"
+
+/**
+ @enum enum_conversionDirection
+
+ Conversion directions for getConversion()
+*/
+enum enum_conversionDirection
+{
+ toMySQL,
+ toDB2
+};
+
+int initCharsetSupport();
+void doneCharsetSupport();
+int32 convertIANAToDb2Ccsid(const char* parmIANADesc, uint16* db2Ccsid);
+int32 getEncodingScheme(const uint16 inCcsid, int32& outEncodingScheme);
+int32 getAssociatedCCSID(const uint16 inCcsid, const int inEncodingScheme, uint16* outCcsid);
+int convToEbcdic(const char* input, char* output, size_t ilen);
+int convFromEbcdic(const char* input, char* output, size_t ilen);
+int32 getConversion(enum_conversionDirection direction, const CHARSET_INFO* cs, uint16 db2CCSID, iconv_t& conversion);
+
+#endif
diff --git a/storage/ibmdb2i/db2i_collationSupport.cc b/storage/ibmdb2i/db2i_collationSupport.cc
new file mode 100644
index 00000000000..26ad0c9dee6
--- /dev/null
+++ b/storage/ibmdb2i/db2i_collationSupport.cc
@@ -0,0 +1,359 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+
+#include "db2i_collationSupport.h"
+#include "db2i_errors.h"
+
+
+/*
+ The following arrays define a mapping between MySQL collation names and
+ corresponding IBM i sort sequences. The mapping is a 1-to-1 correlation
+ between corresponding array slots but is incomplete without case-sensitivity
+ markers dynamically added to the mySqlSortSequence names.
+*/
+#define MAX_COLLATION 89
+static const char* mySQLCollation[MAX_COLLATION] =
+{
+ {"ascii_general"},
+ {"ascii"},
+ {"big5_chinese"},
+ {"big5"},
+ {"cp1250_croatian"},
+ {"cp1250_czech"},
+ {"cp1250_general"},
+ {"cp1250_polish"},
+ {"cp1250"},
+ {"cp1251_bulgarian"},
+ {"cp1251_general"},
+ {"cp1251"},
+ {"cp1256_general"},
+ {"cp1256"},
+ {"cp850_general"},
+ {"cp850"},
+ {"cp852_general"},
+ {"cp852"},
+ {"cp932_japanese"},
+ {"cp932"},
+ {"euckr_korean"},
+ {"euckr"},
+ {"gb2312_chinese"},
+ {"gb2312"},
+ {"gbk_chinese"},
+ {"gbk"},
+ {"greek_general"},
+ {"greek"},
+ {"hebrew_general"},
+ {"hebrew"},
+ {"latin1_danish"},
+ {"latin1_general"},
+ {"latin1_german1"},
+ {"latin1_spanish"},
+ {"latin1_swedish"},
+ {"latin1"},
+ {"latin2_croatian"},
+ {"latin2_czech"},
+ {"latin2_general"},
+ {"latin2_hungarian"},
+ {"latin2"},
+ {"latin5_turkish"},
+ {"latin5"},
+ {"macce_general"},
+ {"macce"},
+ {"sjis_japanese"},
+ {"sjis"},
+ {"tis620_thai"},
+ {"tis620"},
+ {"ucs2_czech"},
+ {"ucs2_danish"},
+ {"ucs2_esperanto"},
+ {"ucs2_estonian"},
+ {"ucs2_general"},
+ {"ucs2_hungarian"},
+ {"ucs2_icelandic"},
+ {"ucs2_latvian"},
+ {"ucs2_lithuanian"},
+ {"ucs2_persian"},
+ {"ucs2_polish"},
+ {"ucs2_romanian"},
+ {"ucs2_slovak"},
+ {"ucs2_slovenian"},
+ {"ucs2_spanish"},
+ {"ucs2_spanish2"},
+ {"ucs2_turkish"},
+ {"ucs2_unicode"},
+ {"ucs2"},
+ {"ujis_japanese"},
+ {"ujis"},
+ {"utf8_czech"},
+ {"utf8_danish"},
+ {"utf8_esperanto"},
+ {"utf8_estonian"},
+ {"utf8_general"},
+ {"utf8_hungarian"},
+ {"utf8_icelandic"},
+ {"utf8_latvian"},
+ {"utf8_lithuanian"},
+ {"utf8_persian"},
+ {"utf8_polish"},
+ {"utf8_romanian"},
+ {"utf8_slovak"},
+ {"utf8_slovenian"},
+ {"utf8_spanish"},
+ {"utf8_spanish2"},
+ {"utf8_turkish"},
+ {"utf8_unicode"},
+ {"utf8"}
+};
+
+
+static const char* mySqlSortSequence[MAX_COLLATION] =
+{
+ {"QALA101F4"},
+ {"QBLA101F4"},
+ {"QACHT04B0"},
+ {"QBCHT04B0"},
+ {"QALA20481"},
+ {"QBLA20481"},
+ {"QCLA20481"},
+ {"QDLA20481"},
+ {"QELA20481"},
+ {"QACYR0401"},
+ {"QBCYR0401"},
+ {"QCCYR0401"},
+ {"QAARA01A4"},
+ {"QBARA01A4"},
+ {"QCLA101F4"},
+ {"QDLA101F4"},
+ {"QALA20366"},
+ {"QBLA20366"},
+ {"QAJPN04B0"},
+ {"QBJPN04B0"},
+ {"QAKOR04B0"},
+ {"QBKOR04B0"},
+ {"QACHS04B0"},
+ {"QBCHS04B0"},
+ {"QCCHS04B0"},
+ {"QDCHS04B0"},
+ {"QAELL036B"},
+ {"QBELL036B"},
+ {"QAHEB01A8"},
+ {"QBHEB01A8"},
+ {"QALA1047C"},
+ {"QBLA1047C"},
+ {"QCLA1047C"},
+ {"QDLA1047C"},
+ {"QELA1047C"},
+ {"QFLA1047C"},
+ {"QCLA20366"},
+ {"QDLA20366"},
+ {"QELA20366"},
+ {"QFLA20366"},
+ {"QGLA20366"},
+ {"QATRK0402"},
+ {"QBTRK0402"},
+ {"QHLA20366"},
+ {"QILA20366"},
+ {"QCJPN04B0"},
+ {"QDJPN04B0"},
+ {"QATHA0346"},
+ {"QBTHA0346"},
+ {"ACS"},
+ {"ADA"},
+ {"AEO"},
+ {"AET"},
+ {"QAUCS04B0"},
+ {"AHU"},
+ {"AIS"},
+ {"ALV"},
+ {"ALT"},
+ {"AFA"},
+ {"APL"},
+ {"ARO"},
+ {"ASK"},
+ {"ASL"},
+ {"AES"},
+ {"AES__TRADIT"},
+ {"ATR"},
+ {"AEN"},
+ {"*HEX"},
+ {"QEJPN04B0"},
+ {"QFJPN04B0"},
+ {"ACS"},
+ {"ADA"},
+ {"AEO"},
+ {"AET"},
+ {"QAUCS04B0"},
+ {"AHU"},
+ {"AIS"},
+ {"ALV"},
+ {"ALT"},
+ {"AFA"},
+ {"APL"},
+ {"ARO"},
+ {"ASK"},
+ {"ASL"},
+ {"AES"},
+ {"AES__TRADIT"},
+ {"ATR"},
+ {"AEN"},
+ {"*HEX"}
+};
+
+
+/**
+ Get the IBM i sort sequence that corresponds to the given MySQL collation.
+
+ @param fieldCharSet The collated character set
+ @param[out] rtnSortSequence The corresponding sort sequence
+
+ @return 0 if successful. Failure otherwise
+*/
+static int32 getAssociatedSortSequence(const CHARSET_INFO *fieldCharSet, const char** rtnSortSequence)
+{
+ DBUG_ENTER("ha_ibmdb2i::getAssociatedSortSequence");
+
+ if (strcmp(fieldCharSet->csname,"binary") != 0)
+ {
+ int collationSearchLen = strlen(fieldCharSet->name);
+ if (fieldCharSet->state & MY_CS_BINSORT)
+ collationSearchLen -= 4;
+ else
+ collationSearchLen -= 3;
+
+ uint16 loopCnt = 0;
+ for (loopCnt; loopCnt < MAX_COLLATION; ++loopCnt)
+ {
+ if ((strlen(mySQLCollation[loopCnt]) == collationSearchLen) &&
+ (strncmp((char*)mySQLCollation[loopCnt], fieldCharSet->name, collationSearchLen) == 0))
+ break;
+ }
+ if (loopCnt == MAX_COLLATION) // Did not find associated sort sequence
+ {
+ getErrTxt(DB2I_ERR_SRTSEQ);
+ DBUG_RETURN(DB2I_ERR_SRTSEQ);
+ }
+ *rtnSortSequence = mySqlSortSequence[loopCnt];
+ }
+
+ DBUG_RETURN(0);
+}
+
+
+/**
+ Update sort sequence information for a key.
+
+ This function accumulates information about a key as it is called for each
+ field composing the key. The caller should invoke the function for each field
+ and (with the exception of the charset parm) preserve the values for the
+ parms across invocations, until a particular key has been evaluated. Once
+ the last field in the key has been evaluated, the fileSortSequence and
+ fileSortSequenceLibrary parms will contain the correct information for
+ creating the corresponding DB2 key.
+
+ @param charset The character set under consideration
+ @param[in, out] fileSortSequenceType The type of the current key's sort seq
+ @param[in, out] fileSortSequence The IBM i identifier for the DB2 sort sequence
+ that corresponds
+
+ @return 0 if successful. Failure otherwise
+*/
+int32 updateAssociatedSortSequence(const CHARSET_INFO* charset,
+ char* fileSortSequenceType,
+ char* fileSortSequence,
+ char* fileSortSequenceLibrary)
+{
+ DBUG_ENTER("ha_ibmdb2i::updateAssociatedSortSequence");
+ DBUG_ASSERT(charset);
+ if (strcmp(charset->csname,"binary") != 0)
+ {
+ char newSortSequence[11] = "";
+ char newSortSequenceType = ' ';
+ const char* foundSortSequence;
+ int rc = getAssociatedSortSequence(charset, &foundSortSequence);
+ if (rc) DBUG_RETURN (rc);
+ switch(foundSortSequence[0])
+ {
+ case '*': // Binary
+ strcat(newSortSequence,foundSortSequence);
+ newSortSequenceType = 'B';
+ break;
+ case 'Q': // Non-ICU sort sequence
+ strcat(newSortSequence,foundSortSequence);
+ if ((charset->state & MY_CS_BINSORT) != 0)
+ {
+ strcat(newSortSequence,"U");
+ }
+ else if ((charset->state & MY_CS_CSSORT) != 0)
+ {
+ strcat(newSortSequence,"U");
+ }
+ else
+ {
+ strcat(newSortSequence,"S");
+ }
+ newSortSequenceType = 'N';
+ break;
+ default: // ICU sort sequence
+ {
+ if ((charset->state & MY_CS_CSSORT) == 0)
+ {
+ if (osVersion.v >= 6)
+ strcat(newSortSequence,"I34"); // ICU 3.4
+ else
+ strcat(newSortSequence,"I26"); // ICU 2.6.1
+ }
+ strcat(newSortSequence,foundSortSequence);
+ newSortSequenceType = 'I';
+ }
+ break;
+ }
+ if (*fileSortSequenceType == ' ') // If no sort sequence has been set yet
+ {
+ // Set associated sort sequence
+ strcpy(fileSortSequence,newSortSequence);
+ strcpy(fileSortSequenceLibrary,"QSYS");
+ *fileSortSequenceType = newSortSequenceType;
+ }
+ else if (strcmp(fileSortSequence,newSortSequence) != 0)
+ {
+ // Only one sort sequence/collation is supported for each DB2 index.
+ getErrTxt(DB2I_ERR_MIXED_COLLATIONS);
+ DBUG_RETURN(DB2I_ERR_MIXED_COLLATIONS);
+ }
+ }
+
+ DBUG_RETURN(0);
+}
diff --git a/storage/ibmdb2i/db2i_collationSupport.h b/storage/ibmdb2i/db2i_collationSupport.h
new file mode 100644
index 00000000000..b2ce09de1ea
--- /dev/null
+++ b/storage/ibmdb2i/db2i_collationSupport.h
@@ -0,0 +1,48 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+
+#ifndef DB2I_COLLATIONSUPPORT_H
+#define DB2I_COLLATIONSUPPORT_H
+
+#include "db2i_global.h"
+#include "mysql_priv.h"
+
+int32 updateAssociatedSortSequence(const CHARSET_INFO* charset,
+ char* fileSortSequenceType,
+ char* fileSortSequence,
+ char* fileSortSequenceLibrary);
+
+#endif
diff --git a/storage/ibmdb2i/db2i_constraints.cc b/storage/ibmdb2i/db2i_constraints.cc
new file mode 100644
index 00000000000..9a96eda1173
--- /dev/null
+++ b/storage/ibmdb2i/db2i_constraints.cc
@@ -0,0 +1,698 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+
+
+#include "ha_ibmdb2i.h"
+#include "db2i_safeString.h"
+
+// This function is called when building the CREATE TABLE information for
+// foreign key constraints. It converts a constraint, table, schema, or
+// field name from EBCDIC to ASCII. If the DB2 name is quoted, it removes
+// those quotes. It then adds the appropriate quotes for a MySQL identifier.
+
+static void convNameForCreateInfo(THD *thd, SafeString& info, char* fromName, int len)
+{
+ int quote;
+ char cquote; // Quote character
+ char convName[MAX_DB2_FILENAME_LENGTH]; // Converted name
+
+ memset(convName, 0, sizeof(convName));
+ convFromEbcdic(fromName, convName, len);
+ quote = get_quote_char_for_identifier(thd, convName, len);
+ cquote = (char) quote;
+ if (quote != EOF)
+ info.strcat(cquote);
+ if (convName[0] == '"') // If DB2 name was quoted, remove quotes
+ {
+ if (strstr(convName, "\"\""))
+ stripExtraQuotes(convName+1, len-1);
+ info.strncat((char*)(convName+1), len-2);
+ }
+ else // DB2 name was not quoted
+ info.strncat(convName, len);
+ if (quote != EOF)
+ info.strcat(cquote);
+}
+
+/**
+ Evaluate the parse tree to build foreign key constraint clauses
+
+ @parm lex The parse tree
+ @parm appendHere The DB2 string to receive the constraint clauses
+ @parm path The path to the table under consideration
+ @parm fields Pointer to the table's list of field pointers
+ @parm[in, out] fileSortSequenceType The sort sequence type associated with the table
+ @parm[in, out] fileSortSequence The sort sequence associated with the table
+ @parm[in, out] fileSortSequenceLibrary The sort sequence library associated with the table
+
+ @return 0 if successful; HA_ERR_CANNOT_ADD_FOREIGN otherwise
+*/
+int ha_ibmdb2i::buildDB2ConstraintString(LEX* lex,
+ String& appendHere,
+ const char* path,
+ Field** fields,
+ char* fileSortSequenceType,
+ char* fileSortSequence,
+ char* fileSortSequenceLibrary)
+{
+ List_iterator<Key> keyIter(lex->alter_info.key_list);
+ char colName[MAX_DB2_COLNAME_LENGTH+1];
+
+ Key* curKey;
+
+ while (curKey = keyIter++)
+ {
+ if (curKey->type == Key::FOREIGN_KEY)
+ {
+ appendHere.append(STRING_WITH_LEN(", "));
+
+ Foreign_key* fk = (Foreign_key*)curKey;
+
+ char db2LibName[MAX_DB2_SCHEMANAME_LENGTH+1];
+ if (fk->name)
+ {
+ char db2FKName[MAX_DB2_FILENAME_LENGTH+1];
+ appendHere.append(STRING_WITH_LEN("CONSTRAINT "));
+ if (fk->ref_table->db.str)
+ {
+ convertMySQLNameToDB2Name(fk->ref_table->db.str, db2LibName, sizeof(db2LibName));
+ }
+ else
+ {
+ db2i_table::getDB2LibNameFromPath(path, db2LibName);
+ }
+ if (lower_case_table_names == 1)
+ my_casedn_str(files_charset_info, db2LibName);
+ appendHere.append(db2LibName);
+
+ appendHere.append('.');
+
+ convertMySQLNameToDB2Name(fk->name, db2FKName, sizeof(db2FKName));
+ appendHere.append(db2FKName);
+ }
+
+ appendHere.append(STRING_WITH_LEN(" FOREIGN KEY ("));
+
+ bool firstTime = true;
+
+ List_iterator<Key_part_spec> column(fk->columns);
+ Key_part_spec* curColumn;
+
+ while (curColumn = column++)
+ {
+ if (!firstTime)
+ {
+ appendHere.append(',');
+ }
+ firstTime = false;
+
+ convertMySQLNameToDB2Name(curColumn->field_name, colName, sizeof(colName));
+ appendHere.append(colName);
+
+ // DB2 requires that the sort sequence on the child table match the parent table's
+ // sort sequence. We ensure that happens by updating the sort sequence according
+ // to the constrained fields.
+ Field** field = fields;
+ do
+ {
+ if (strcmp((*field)->field_name, curColumn->field_name) == 0)
+ {
+ int rc = updateAssociatedSortSequence((*field)->charset(),
+ fileSortSequenceType,
+ fileSortSequence,
+ fileSortSequenceLibrary);
+
+ if (unlikely(rc)) return rc;
+ }
+ } while (*(++field));
+ }
+
+ firstTime = true;
+
+ appendHere.append(STRING_WITH_LEN(") REFERENCES "));
+
+ if (fk->ref_table->db.str)
+ {
+ convertMySQLNameToDB2Name(fk->ref_table->db.str, db2LibName, sizeof(db2LibName));
+ }
+ else
+ {
+ db2i_table::getDB2LibNameFromPath(path, db2LibName);
+ }
+ if (lower_case_table_names == 1)
+ my_casedn_str(files_charset_info, db2LibName);
+ appendHere.append(db2LibName);
+ appendHere.append('.');
+
+ char db2FileName[MAX_DB2_FILENAME_LENGTH+1];
+ convertMySQLNameToDB2Name(fk->ref_table->table.str, db2FileName, sizeof(db2FileName));
+ if (lower_case_table_names)
+ my_casedn_str(files_charset_info, db2FileName);
+ appendHere.append(db2FileName);
+
+
+ if (!fk->ref_columns.is_empty())
+ {
+ List_iterator<Key_part_spec> ref(fk->ref_columns);
+ Key_part_spec* curRef;
+ appendHere.append(STRING_WITH_LEN(" ("));
+
+
+ while (curRef = ref++)
+ {
+ if (!firstTime)
+ {
+ appendHere.append(',');
+ }
+ firstTime = false;
+
+ convertMySQLNameToDB2Name(curRef->field_name, colName, sizeof(colName));
+ appendHere.append(colName);
+ }
+
+ appendHere.append(STRING_WITH_LEN(") "));
+ }
+
+ if (fk->delete_opt != Foreign_key::FK_OPTION_UNDEF)
+ {
+ appendHere.append(STRING_WITH_LEN("ON DELETE "));
+ switch (fk->delete_opt)
+ {
+ case Foreign_key::FK_OPTION_RESTRICT:
+ appendHere.append(STRING_WITH_LEN("RESTRICT ")); break;
+ case Foreign_key::FK_OPTION_CASCADE:
+ appendHere.append(STRING_WITH_LEN("CASCADE ")); break;
+ case Foreign_key::FK_OPTION_SET_NULL:
+ appendHere.append(STRING_WITH_LEN("SET NULL ")); break;
+ case Foreign_key::FK_OPTION_NO_ACTION:
+ appendHere.append(STRING_WITH_LEN("NO ACTION ")); break;
+ case Foreign_key::FK_OPTION_DEFAULT:
+ appendHere.append(STRING_WITH_LEN("SET DEFAULT ")); break;
+ default:
+ return HA_ERR_CANNOT_ADD_FOREIGN; break;
+ }
+ }
+
+ if (fk->update_opt != Foreign_key::FK_OPTION_UNDEF)
+ {
+ appendHere.append(STRING_WITH_LEN("ON UPDATE "));
+ switch (fk->update_opt)
+ {
+ case Foreign_key::FK_OPTION_RESTRICT:
+ appendHere.append(STRING_WITH_LEN("RESTRICT ")); break;
+ case Foreign_key::FK_OPTION_NO_ACTION:
+ appendHere.append(STRING_WITH_LEN("NO ACTION ")); break;
+ default:
+ return HA_ERR_CANNOT_ADD_FOREIGN; break;
+ }
+ }
+
+ }
+
+ }
+
+ return 0;
+}
+
+
+/***********************************************************************
+Get the foreign key information in the form of a character string so
+that it can be inserted into a CREATE TABLE statement. This is used by
+the SHOW CREATE TABLE statement. The string will later be freed by the
+free_foreign_key_create_info() method.
+************************************************************************/
+
+char* ha_ibmdb2i::get_foreign_key_create_info(void)
+{
+ DBUG_ENTER("ha_ibmdb2i::get_foreign_key_create_info");
+ int rc = 0;
+ char* infoBuffer = NULL; // Pointer to string returned to MySQL
+ uint32 constraintSpaceLength;// Length of space passed to DB2
+ ValidatedPointer<char> constraintSpace; // Space pointer passed to DB2
+ uint32 neededLen; // Length returned from DB2
+ uint32 cstCnt; // Number of foreign key constraints from DB2
+ uint32 fld; //
+ constraint_hdr* cstHdr; // Pointer to constraint header structure
+ FK_constraint* FKCstDef; // Pointer to constraint definition structure
+ cst_name* fieldName; // Pointer to field name structure
+ char* tempPtr; // Temp pointer for traversing constraint space
+ char convName[128];
+
+ /* Allocate space to retrieve the DB2 constraint information. */
+
+ if (!(share = get_share(table_share->path.str, table)))
+ DBUG_RETURN(NULL);
+
+ constraintSpaceLength = 5000; // Try allocating 5000 bytes and see if enough.
+
+ initBridge();
+
+ constraintSpace.alloc(constraintSpaceLength);
+ rc = bridge()->expectErrors(QMY_ERR_NEED_MORE_SPACE)
+ ->constraints(db2Table->dataFile()->getMasterDefnHandle(),
+ constraintSpace,
+ constraintSpaceLength,
+ &neededLen,
+ &cstCnt);
+
+ if (unlikely(rc == QMY_ERR_NEED_MORE_SPACE))
+ {
+ constraintSpaceLength = neededLen; // Get length of space that's needed
+ constraintSpace.realloc(constraintSpaceLength);
+ rc = bridge()->expectErrors(QMY_ERR_NEED_MORE_SPACE)
+ ->constraints(db2Table->dataFile()->getMasterDefnHandle(),
+ constraintSpace,
+ constraintSpaceLength,
+ &neededLen,
+ &cstCnt);
+ }
+
+ /* If constraint information was returned by DB2, build a text string */
+ /* to return to MySQL. */
+
+ if ((rc == 0) && (cstCnt > 0))
+ {
+ THD* thd = ha_thd();
+ infoBuffer = (char*) my_malloc(MAX_FOREIGN_LEN + 1, MYF(MY_WME));
+ if (infoBuffer == NULL)
+ {
+ free_share(share);
+ DBUG_RETURN(NULL);
+ }
+
+ SafeString info(infoBuffer, MAX_FOREIGN_LEN + 1);
+
+ /* Loop through the DB2 constraints and build a text string for each foreign */
+ /* key constraint that is found. */
+
+ tempPtr = constraintSpace;
+ cstHdr = (constraint_hdr_t*)(void*)constraintSpace; // Address first constraint definition
+ for (int i = 0; i < cstCnt && !info.overflowed(); ++i)
+ {
+ if (cstHdr->CstType[0] == QMY_CST_FK) // If this is a foreign key constraint
+ {
+ tempPtr = (char*)(tempPtr + cstHdr->CstDefOff);
+ FKCstDef = (FK_constraint_t*)tempPtr;
+
+ /* Process the constraint name. */
+
+ info.strncat(STRING_WITH_LEN(" CONSTRAINT "));
+ convNameForCreateInfo(thd, info,
+ FKCstDef->CstName.Name, FKCstDef->CstName.Len);
+
+ /* Process the names of the foreign keys. */
+
+ info.strncat(STRING_WITH_LEN(" FOREIGN KEY ("));
+ tempPtr = (char*)(tempPtr + FKCstDef->KeyColOff);
+ fieldName= (cst_name_t*)tempPtr;
+ for (fld = 0; fld < FKCstDef->KeyCnt; ++fld)
+ {
+ convNameForCreateInfo(thd, info, fieldName->Name, fieldName->Len);
+ if ((fld + 1) < FKCstDef->KeyCnt)
+ {
+ info.strncat(STRING_WITH_LEN(", "));
+ fieldName = fieldName + 1;
+ }
+ }
+
+ /* Process the schema-name and name of the referenced table. */
+
+ info.strncat(STRING_WITH_LEN(") REFERENCES "));
+ convNameForCreateInfo(thd, info,
+ FKCstDef->RefSchema.Name, FKCstDef->RefSchema.Len);
+ info.strcat('.');
+ convNameForCreateInfo(thd, info,
+ FKCstDef->RefTable.Name, FKCstDef->RefTable.Len);
+ info.strncat(STRING_WITH_LEN(" ("));
+
+ /* Process the names of the referenced keys. */
+
+ tempPtr = (char*)FKCstDef;
+ tempPtr = (char*)(tempPtr + FKCstDef->RefColOff);
+ fieldName= (cst_name_t*)tempPtr;
+ for (fld = 0; fld < FKCstDef->RefCnt; ++fld)
+ {
+ convNameForCreateInfo(thd, info, fieldName->Name, fieldName->Len);
+ if ((fld + 1) < FKCstDef->RefCnt)
+ {
+ info.strncat(STRING_WITH_LEN(", "));
+ fieldName = fieldName + 1;
+ }
+ }
+
+ /* Process the ON UPDATE and ON DELETE rules. */
+
+ info.strncat(STRING_WITH_LEN(") ON UPDATE "));
+ switch(FKCstDef->UpdMethod)
+ {
+ case QMY_NOACTION: info.strncat(STRING_WITH_LEN("NO ACTION")); break;
+ case QMY_RESTRICT: info.strncat(STRING_WITH_LEN("RESTRICT")); break;
+ default: break;
+ }
+ info.strncat(STRING_WITH_LEN(" ON DELETE "));
+ switch(FKCstDef->DltMethod)
+ {
+ case QMY_CASCADE: info.strncat(STRING_WITH_LEN("CASCADE")); break;
+ case QMY_SETDFT: info.strncat(STRING_WITH_LEN("SET DEFAULT")); break;
+ case QMY_SETNULL: info.strncat(STRING_WITH_LEN("SET NULL")); break;
+ case QMY_NOACTION: info.strncat(STRING_WITH_LEN("NO ACTION")); break;
+ case QMY_RESTRICT: info.strncat(STRING_WITH_LEN("RESTRICT")); break;
+ default: break;
+ }
+ }
+
+ /* Address the next constraint, if any. */
+
+ if ((i+1) < cstCnt)
+ {
+ info.strcat(',');
+ tempPtr = (char*)cstHdr + cstHdr->CstLen;
+ cstHdr = (constraint_hdr_t*)(tempPtr);
+ }
+ }
+ }
+
+ /* Cleanup and return */
+ free_share(share);
+
+ DBUG_RETURN(infoBuffer);
+}
+
+/***********************************************************************
+Free the foreign key create info (for a table) that was acquired by the
+get_foreign_key_create_info() method.
+***********************************************************************/
+
+void ha_ibmdb2i::free_foreign_key_create_info(char* info)
+{
+ DBUG_ENTER("ha_ibmdb2i::free_foreign_key_create_info");
+
+ if (info)
+ {
+ my_free(info, MYF(0));
+ }
+ DBUG_VOID_RETURN;
+}
+
+/***********************************************************************
+This method returns to MySQL a list, with one entry in the list describing
+each foreign key constraint.
+***********************************************************************/
+
+int ha_ibmdb2i::get_foreign_key_list(THD *thd, List<FOREIGN_KEY_INFO> *f_key_list)
+{
+ DBUG_ENTER("ha_ibmdb2i::get_foreign_key_list");
+ int rc = 0;
+ uint32 constraintSpaceLength; // Length of space passed to DB2
+ ValidatedPointer<char> constraintSpace; // Space pointer passed to DB2
+ uint16 rtnCode; // Return code from DB2
+ uint32 neededLen; // Bytes needed to contain DB2 constraint info
+ uint32 cstCnt; // Number of constraints returned by DB2
+ uint32 fld;
+ constraint_hdr* cstHdr; // Pointer to a cst header structure
+ FK_constraint* FKCstDef; // Pointer to definition of foreign key constraint
+ cst_name* fieldName; // Pointer to field name structure
+ const char *method;
+ ulong methodLen;
+ char* tempPtr; // Temp pointer for traversing constraint space
+ char convName[128];
+
+ if (!(share = get_share(table_share->path.str, table)))
+ DBUG_RETURN(0);
+
+ // Allocate space to retrieve the DB2 constraint information.
+ constraintSpaceLength = 5000; // Try allocating 5000 bytes and see if enough.
+
+ constraintSpace.alloc(constraintSpaceLength);
+ rc = bridge()->expectErrors(QMY_ERR_NEED_MORE_SPACE)
+ ->constraints(db2Table->dataFile()->getMasterDefnHandle(),
+ constraintSpace,
+ constraintSpaceLength,
+ &neededLen,
+ &cstCnt);
+
+ if (unlikely(rc == QMY_ERR_NEED_MORE_SPACE))
+ {
+ constraintSpaceLength = neededLen; // Get length of space that's needed
+ constraintSpace.realloc(constraintSpaceLength);
+ rc = bridge()->expectErrors(QMY_ERR_NEED_MORE_SPACE)
+ ->constraints(db2Table->dataFile()->getMasterDefnHandle(),
+ constraintSpace,
+ constraintSpaceLength,
+ &neededLen,
+ &cstCnt);
+ }
+
+ /* If constraint information was returned by DB2, build a text string */
+ /* to return to MySQL. */
+ if ((rc == 0) && (cstCnt > 0))
+ {
+ tempPtr = constraintSpace;
+ cstHdr = (constraint_hdr_t*)(void*)constraintSpace; // Address first constraint definition
+ for (int i = 0; i < cstCnt; ++i)
+ {
+ if (cstHdr->CstType[0] == QMY_CST_FK) // If this is a foreign key constraint
+ {
+ FOREIGN_KEY_INFO f_key_info;
+ LEX_STRING *name= 0;
+ tempPtr = (char*)(tempPtr + cstHdr->CstDefOff);
+ FKCstDef = (FK_constraint_t*)tempPtr;
+
+ /* Process the constraint name. */
+
+ convFromEbcdic(FKCstDef->CstName.Name, convName,FKCstDef->CstName.Len);
+ if (convName[0] == '"') // If quoted, exclude quotes.
+ f_key_info.forein_id = thd_make_lex_string(thd, 0,
+ convName + 1, (uint) (FKCstDef->CstName.Len - 2), 1);
+ else // Not quoted
+ f_key_info.forein_id = thd_make_lex_string(thd, 0,
+ convName, (uint) FKCstDef->CstName.Len, 1);
+
+ /* Process the names of the foreign keys. */
+
+
+ tempPtr = (char*)(tempPtr + FKCstDef->KeyColOff);
+ fieldName = (cst_name_t*)tempPtr;
+ for (fld = 0; fld < FKCstDef->KeyCnt; ++fld)
+ {
+ convFromEbcdic(fieldName->Name, convName, fieldName->Len);
+ if (convName[0] == '"') // If quoted, exclude quotes.
+ name = thd_make_lex_string(thd, name,
+ convName + 1, (uint) (fieldName->Len - 2), 1);
+ else
+ name = thd_make_lex_string(thd, name, convName, (uint) fieldName->Len, 1);
+ f_key_info.foreign_fields.push_back(name);
+ if ((fld + 1) < FKCstDef->KeyCnt)
+ fieldName = fieldName + 1;
+ }
+
+ /* Process the schema and name of the referenced table. */
+
+ convFromEbcdic(FKCstDef->RefSchema.Name, convName, FKCstDef->RefSchema.Len);
+ if (convName[0] == '"') // If quoted, exclude quotes.
+ f_key_info.referenced_db = thd_make_lex_string(thd, 0,
+ convName + 1, (uint) (FKCstDef->RefSchema.Len -2), 1);
+ else
+ f_key_info.referenced_db = thd_make_lex_string(thd, 0,
+ convName, (uint) FKCstDef->RefSchema.Len, 1);
+ convFromEbcdic(FKCstDef->RefTable.Name, convName, FKCstDef->RefTable.Len);
+ if (convName[0] == '"') // If quoted, exclude quotes.
+ f_key_info.referenced_table = thd_make_lex_string(thd, 0,
+ convName +1, (uint) (FKCstDef->RefTable.Len -2), 1);
+ else
+ f_key_info.referenced_table = thd_make_lex_string(thd, 0,
+ convName, (uint) FKCstDef->RefTable.Len, 1);
+
+ /* Process the names of the referenced keys. */
+
+ tempPtr = (char*)FKCstDef;
+ tempPtr = (char*)(tempPtr + FKCstDef->RefColOff);
+ fieldName= (cst_name_t*)tempPtr;
+ for (fld = 0; fld < FKCstDef->RefCnt; ++fld)
+ {
+ convFromEbcdic(fieldName->Name, convName, fieldName->Len);
+ if (convName[0] == '"') // If quoted, exclude quotes.
+ name = thd_make_lex_string(thd, name,
+ convName + 1, (uint) (fieldName->Len -2), 1);
+ else
+ name = thd_make_lex_string(thd, name, convName, (uint) fieldName->Len, 1);
+ f_key_info.referenced_fields.push_back(name);
+ if ((fld + 1) < FKCstDef->RefCnt)
+ fieldName = fieldName + 1;
+ }
+
+ /* Process the ON UPDATE and ON DELETE rules. */
+
+ switch(FKCstDef->UpdMethod)
+ {
+ case QMY_NOACTION:
+ {
+ method = "NO ACTION";
+ methodLen=9;
+ }
+ break;
+ case QMY_RESTRICT:
+ {
+ method = "RESTRICT";
+ methodLen = 8;
+ }
+ break;
+ default: break;
+ }
+ f_key_info.update_method = thd_make_lex_string(
+ thd, f_key_info.update_method, method, methodLen, 1);
+ switch(FKCstDef->DltMethod)
+ {
+ case QMY_CASCADE:
+ {
+ method = "CASCADE";
+ methodLen = 7;
+ }
+ break;
+ case QMY_SETDFT:
+ {
+ method = "SET DEFAULT";
+ methodLen = 11;
+ }
+ break;
+ case QMY_SETNULL:
+ {
+ method = "SET NULL";
+ methodLen = 8;
+ }
+ break;
+ case QMY_NOACTION:
+ {
+ method = "NO ACTION";
+ methodLen = 9;
+ }
+ break;
+ case QMY_RESTRICT:
+ {
+ method = "RESTRICT";
+ methodLen = 8;
+ }
+ break;
+ default: break;
+ }
+ f_key_info.delete_method = thd_make_lex_string(
+ thd, f_key_info.delete_method, method, methodLen, 1);
+ f_key_info.referenced_key_name= thd_make_lex_string(thd, 0, (char *)"", 1, 1);
+ FOREIGN_KEY_INFO *pf_key_info = (FOREIGN_KEY_INFO *)
+ thd_memdup(thd, &f_key_info, sizeof(FOREIGN_KEY_INFO));
+ f_key_list->push_back(pf_key_info);
+ }
+
+ /* Address the next constraint, if any. */
+
+ if ((i+1) < cstCnt)
+ {
+ tempPtr = (char*)cstHdr + cstHdr->CstLen;
+ cstHdr = (constraint_hdr_t*)(tempPtr);
+ }
+ }
+ }
+
+ /* Cleanup and return. */
+
+ free_share(share);
+ DBUG_RETURN(0);
+}
+
+/***********************************************************************
+Checks if the table is referenced by a foreign key.
+Returns: 0 if not referenced (or error occurs),
+ > 0 if is referenced
+***********************************************************************/
+
+uint ha_ibmdb2i::referenced_by_foreign_key(void)
+{
+ DBUG_ENTER("ha_ibmdb2i::referenced_by_foreign_key");
+
+ int rc = 0;
+ FILE_HANDLE queryFile = 0;
+ uint32 resultRowLen;
+ uint32 count = 0;
+
+ const char* libName = db2Table->getDB2LibName(db2i_table::ASCII_SQL);
+ const char* fileName = db2Table->getDB2TableName(db2i_table::ASCII_SQL);
+
+ String query(128);
+ query.append(STRING_WITH_LEN(" SELECT COUNT(*) FROM SYSIBM.SQLFOREIGNKEYS WHERE PKTABLE_SCHEM = '"));
+ query.append(libName+1, strlen(libName)-2); // parent library name
+ query.append(STRING_WITH_LEN("' AND PKTABLE_NAME = '"));
+ query.append(fileName+1, strlen(fileName)-2); // parent file name
+ query.append(STRING_WITH_LEN("'"));
+
+ SqlStatementStream sqlStream(query);
+
+ rc = bridge()->prepOpen(sqlStream.getPtrToData(),
+ &queryFile,
+ &resultRowLen);
+ if (rc == 0)
+ {
+ IOReadBuffer rowBuffer(1, resultRowLen);
+ rc = bridge()->read(queryFile, rowBuffer.ptr(), QMY_READ_ONLY, QMY_NONE, QMY_FIRST);
+ if (!rc) count = *((uint32*)rowBuffer.getRowN(0));
+ bridge()->deallocateFile(queryFile);
+ }
+ DBUG_RETURN(count);
+}
+
+
+bool ha_ibmdb2i::check_if_incompatible_data(HA_CREATE_INFO *info,
+ uint table_changes)
+{
+ DBUG_ENTER("ha_ibmdb2i::check_if_incompatible_data");
+ uint i;
+ /* Check that auto_increment value and field definitions were
+ not changed. */
+ if ((info->used_fields & HA_CREATE_USED_AUTO &&
+ info->auto_increment_value != 0) ||
+ table_changes != IS_EQUAL_YES)
+ DBUG_RETURN(COMPATIBLE_DATA_NO);
+ /* Check if any fields were renamed. */
+ for (i= 0; i < table->s->fields; i++)
+ {
+ Field *field= table->field[i];
+ if (field->flags & FIELD_IS_RENAMED)
+ {
+ DBUG_PRINT("info", ("Field has been renamed, copy table"));
+ DBUG_RETURN(COMPATIBLE_DATA_NO);
+ }
+ }
+ DBUG_RETURN(COMPATIBLE_DATA_YES);
+}
diff --git a/storage/ibmdb2i/db2i_conversion.cc b/storage/ibmdb2i/db2i_conversion.cc
new file mode 100644
index 00000000000..f746be6ab50
--- /dev/null
+++ b/storage/ibmdb2i/db2i_conversion.cc
@@ -0,0 +1,1446 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+
+
+#include "db2i_ileBridge.h"
+#include "mysql_priv.h"
+#include "db2i_charsetSupport.h"
+#include "ctype.h"
+#include "ha_ibmdb2i.h"
+#include "db2i_errors.h"
+#include "wchar.h"
+
+const char ZERO_DATETIME_VALUE[] = "0000-00-00 00:00:00";
+const char ZERO_DATETIME_VALUE_SUBST[] = "0001-01-01 00:00:00";
+const char ZERO_DATE_VALUE[] = "0000-00-00";
+const char ZERO_DATE_VALUE_SUBST[] = "0001-01-01";
+
+
+/**
+ Put a BCD digit into a BCD string.
+
+ @param[out] bcdString The BCD string to be modified
+ @param pos The position within the string to be updated.
+ @param val The value to be assigned into the string at pos.
+*/
+static inline void bcdAssign(char* bcdString, uint pos, uint val)
+{
+ bcdString[pos/2] |= val << ((pos % 2) ? 0 : 4);
+}
+
+/**
+ Read a BCD digit from a BCD string.
+
+ @param[out] bcdString The BCD string to be read
+ @param pos The position within the string to be read.
+
+ @return bcdGet The value of the BCD digit at pos.
+*/
+static inline uint bcdGet(const char* bcdString, uint pos)
+{
+ return (bcdString[pos/2] >> ((pos % 2) ? 0 : 4)) & 0xf;
+}
+
+/**
+ In-place convert a number in ASCII represenation to EBCDIC representation.
+
+ @param string The string of ASCII characters
+ @param len The length of string
+*/
+static inline void convertNumericToEbcdicFast(char* string, int len)
+{
+ for (int i = 0; i < len; ++i, ++string)
+ {
+ switch(*string)
+ {
+ case '-':
+ *string = 0x60; break;
+ case ':':
+ *string = 0x7A; break;
+ case '.':
+ *string = 0x4B; break;
+ default:
+ DBUG_ASSERT(isdigit(*string));
+ *string += 0xF0 - '0';
+ break;
+ }
+ }
+}
+
+
+/**
+ atoi()-like function for a 4-character EBCDIC string.
+
+ @param string The EBCDIC string
+ @return a4toi_ebcdic The decimal value of the EBCDIC string
+*/
+static inline uint16 a4toi_ebcdic(const uchar* string)
+{
+ return ((string[0]-0xF0) * 1000 +
+ (string[1]-0xF0) * 100 +
+ (string[2]-0xF0) * 10 +
+ (string[3]-0xF0));
+};
+
+
+/**
+ atoi()-like function for a 4-character EBCDIC string.
+
+ @param string The EBCDIC string
+ @return a4toi_ebcdic The decimal value of the EBCDIC string
+*/
+static inline uint8 a2toi_ebcdic(const uchar* string)
+{
+ return ((string[0]-0xF0) * 10 +
+ (string[1]-0xF0));
+};
+
+/**
+ Perform character conversion for textual field data.
+*/
+int ha_ibmdb2i::convertFieldChars(enum_conversionDirection direction,
+ uint16 fieldID,
+ const char* input,
+ char* output,
+ size_t ilen,
+ size_t olen,
+ size_t* outDataLen)
+{
+ DBUG_PRINT("ha_ibmdb2i::convertFieldChars",("Direction: %d; length = %d", direction, ilen));
+
+ if (unlikely(ilen == 0))
+ {
+ if (outDataLen) *outDataLen = 0;
+ return (0);
+ }
+
+ iconv_t& conversion = db2Table->getConversionDefinition(direction, fieldID);
+
+ if (unlikely(conversion == (iconv_t)(-1)))
+ {
+ return (DB2I_ERR_ICONV_OPEN);
+ }
+
+ size_t initOLen= olen;
+ size_t substitutedChars = 0;
+ int rc = iconv(conversion, (char**)&input, &ilen, &output, &olen, &substitutedChars );
+ if (unlikely(rc < 0))
+ {
+ int er = errno;
+ if (er == EILSEQ)
+ {
+ getErrTxt(DB2I_ERR_ILL_CHAR, table->field[fieldID]->field_name);
+ return (DB2I_ERR_ILL_CHAR);
+ }
+ else
+ {
+ getErrTxt(DB2I_ERR_ICONV,er);
+ return (DB2I_ERR_ICONV);
+ }
+ }
+ if (unlikely(substitutedChars))
+ {
+ warning(ha_thd(), DB2I_ERR_SUB_CHARS, table->field[fieldID]->field_name);
+ }
+
+ if (outDataLen) *outDataLen = initOLen - olen;
+
+ return (0);
+}
+
+/**
+ Append the appropriate default value clause onto a CREATE TABLE definition
+
+ This was inspired by get_field_default_value in sql/sql_show.cc.
+
+ @param field The field whose value is to be obtained
+ @param statement The string to receive the DEFAULT clause
+ @param quoteIt Does the data type require single quotes around the value?
+ @param ccsid The ccsid of the field value (if a string type); 0 if no conversion needed
+*/
+static void get_field_default_value(Field *field,
+ String &statement,
+ bool quoteIt,
+ uint32 ccsid,
+ bool substituteZeroDates)
+{
+ if ((field->type() != FIELD_TYPE_BLOB &&
+ !(field->flags & NO_DEFAULT_VALUE_FLAG) &&
+ field->unireg_check != Field::NEXT_NUMBER))
+ {
+ my_ptrdiff_t old_ptr= (my_ptrdiff_t) (field->table->s->default_values - field->table->record[0]);
+ field->move_field_offset(old_ptr);
+
+ String defaultClause(64);
+ defaultClause.length(0);
+ defaultClause.append(" DEFAULT ");
+ if (!field->is_null())
+ {
+ my_bitmap_map *old_map = tmp_use_all_columns(field->table, field->table->read_set);
+ char tmp[MAX_FIELD_WIDTH];
+
+ if (field->real_type() == MYSQL_TYPE_ENUM ||
+ field->real_type() == MYSQL_TYPE_SET)
+ {
+ CHARSET_INFO *cs= &my_charset_bin;
+ uint len = (uint)(cs->cset->longlong10_to_str)(cs,tmp,sizeof(tmp), 10, field->val_int());
+ tmp[len]=0;
+ defaultClause.append(tmp);
+ }
+ else
+ {
+ String type(tmp, sizeof(tmp), field->charset());
+ field->val_str(&type);
+ if (type.length())
+ {
+ if (field->type() == MYSQL_TYPE_DATE &&
+ memcmp(type.ptr(), STRING_WITH_LEN(ZERO_DATE_VALUE)) == 0)
+ {
+ if (substituteZeroDates)
+ type.set(STRING_WITH_LEN(ZERO_DATE_VALUE_SUBST), field->charset());
+ else
+ {
+ warning(current_thd, DB2I_ERR_WARN_COL_ATTRS, field->field_name);
+ return;
+ }
+ }
+ else if ((field->type() == MYSQL_TYPE_DATETIME ||
+ field->type() == MYSQL_TYPE_TIMESTAMP) &&
+ memcmp(type.ptr(), STRING_WITH_LEN(ZERO_DATETIME_VALUE)) == 0)
+ {
+ if (substituteZeroDates)
+ type.set(STRING_WITH_LEN(ZERO_DATETIME_VALUE_SUBST), field->charset());
+ else
+ {
+ warning(current_thd, DB2I_ERR_WARN_COL_ATTRS, field->field_name);
+ return;
+ }
+ }
+
+
+ if (field->type() != MYSQL_TYPE_STRING &&
+ field->type() != MYSQL_TYPE_VARCHAR &&
+ field->type() != MYSQL_TYPE_BLOB &&
+ field->type() != MYSQL_TYPE_BIT)
+ {
+ if (quoteIt)
+ defaultClause.append('\'');
+ defaultClause.append(type);
+ if (quoteIt)
+ defaultClause.append('\'');
+ }
+ else
+ {
+ int length;
+ char* out;
+
+ // If a ccsid is specified, we need to make sure that the DEFAULT
+ // string is converted to that encoding.
+ if (ccsid != 0)
+ {
+ iconv_t iconvD;
+ if (getConversion(toDB2, field->charset(), ccsid, iconvD))
+ {
+ warning(current_thd, DB2I_ERR_WARN_COL_ATTRS, field->field_name);
+ return;
+ }
+
+ size_t ilen = type.length();
+ size_t olen = 6 * ilen;
+ size_t origOlen = olen;
+ const char* in = type.ptr();
+ const char* tempIn = in;
+ out = (char*)my_malloc(olen, MYF(MY_WME));
+ char* tempOut = out;
+ size_t substitutedChars;
+
+ if (iconv(iconvD, (char**)&tempIn, &ilen, &tempOut, &olen, &substitutedChars) < 0)
+ {
+ warning(current_thd, DB2I_ERR_WARN_COL_ATTRS, field->field_name);
+ my_free(out, MYF(0));
+ return;
+ }
+ // Now we process the converted string to represent it as
+ // hexadecimal values.
+
+ length = origOlen - olen;
+ }
+ else
+ {
+ length = type.length();
+ out = (char*)my_malloc(length*2, MYF(MY_WME));
+ memcpy(out, (char*)type.ptr(), length);
+ }
+
+ if (length > 16370)
+ {
+ warning(current_thd, DB2I_ERR_WARN_COL_ATTRS, field->field_name);
+ my_free(out, MYF(0));
+ return;
+ }
+
+ if (ccsid == 1200)
+ defaultClause.append("ux'");
+ else if (ccsid == 13488)
+ defaultClause.append("gx'");
+ else if (field->charset() == &my_charset_bin)
+ defaultClause.append("binary(x'");
+ else
+ defaultClause.append("x'");
+
+ const char hexMap[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
+ for (int c = length-1; c >= 0; --c)
+ {
+ out[c*2+1] = hexMap[out[c] & 0xF];
+ out[c*2] = hexMap[out[c] >> 4];
+ }
+
+ defaultClause.append(out, length*2);
+ defaultClause.append('\'');
+ if (field->charset() == &my_charset_bin)
+ defaultClause.append(")");
+
+ my_free(out, MYF(0));
+ }
+ }
+ else
+ defaultClause.length(0);
+ }
+ tmp_restore_column_map(field->table->read_set, old_map);
+ }
+ else if (field->maybe_null())
+ defaultClause.append(STRING_WITH_LEN("NULL"));
+
+ if (old_ptr)
+ field->move_field_offset(-old_ptr);
+
+ statement.append(defaultClause);
+ }
+}
+
+
+
+
+/**
+ Convert a MySQL field definition into its corresponding DB2 type.
+
+ The result will be appended to mapping as a DB2 SQL phrase.
+
+ @param field The MySQL field to be evaluated
+ @param[out] mapping The receiver for the DB2 SQL syntax
+ @param timeFormat The format to be used for mapping the TIME type
+*/
+int ha_ibmdb2i::getFieldTypeMapping(Field* field,
+ String& mapping,
+ enum_TimeFormat timeFormat,
+ enum_BlobMapping blobMapping,
+ enum_ZeroDate zeroDateHandling,
+ bool propagateDefaults,
+ enum_YearFormat yearFormat)
+{
+ char stringBuildBuffer[257];
+ uint32 fieldLength;
+ bool defaultNeedsQuotes = false;
+ uint16 db2Ccsid = 0;
+
+ CHARSET_INFO* fieldCharSet = field->charset();
+ switch (field->type())
+ {
+ case MYSQL_TYPE_NEWDECIMAL:
+ {
+ uint precision= ((Field_new_decimal*)field)->precision;
+ uint scale= field->decimals();
+
+ if (precision <= MAX_DEC_PRECISION)
+ {
+ sprintf(stringBuildBuffer,"DECIMAL(%d, %d)",precision,scale);
+ }
+ else
+ {
+ if (scale > precision - MAX_DEC_PRECISION)
+ {
+ scale = scale - (precision - MAX_DEC_PRECISION);
+ precision = MAX_DEC_PRECISION;
+ sprintf(stringBuildBuffer,"DECIMAL(%d, %d)",precision,scale);
+ }
+ else
+ {
+ return HA_ERR_UNSUPPORTED;
+ }
+ warning(ha_thd(), DB2I_ERR_PRECISION);
+ }
+
+ mapping.append(stringBuildBuffer);
+ }
+ break;
+ case MYSQL_TYPE_TINY:
+ mapping.append(STRING_WITH_LEN("SMALLINT"));
+ break;
+ case MYSQL_TYPE_SHORT:
+ if (((Field_num*)field)->unsigned_flag)
+ mapping.append(STRING_WITH_LEN("INT"));
+ else
+ mapping.append(STRING_WITH_LEN("SMALLINT"));
+ break;
+ case MYSQL_TYPE_LONG:
+ if (((Field_num*)field)->unsigned_flag)
+ mapping.append(STRING_WITH_LEN("BIGINT"));
+ else
+ mapping.append(STRING_WITH_LEN("INT"));
+ break;
+ case MYSQL_TYPE_FLOAT:
+ mapping.append(STRING_WITH_LEN("REAL"));
+ break;
+ case MYSQL_TYPE_DOUBLE:
+ mapping.append(STRING_WITH_LEN("DOUBLE"));
+ break;
+ case MYSQL_TYPE_LONGLONG:
+ if (((Field_num*)field)->unsigned_flag)
+ mapping.append(STRING_WITH_LEN("DECIMAL(20,0)"));
+ else
+ mapping.append(STRING_WITH_LEN("BIGINT"));
+ break;
+ case MYSQL_TYPE_INT24:
+ mapping.append(STRING_WITH_LEN("INTEGER"));
+ break;
+ case MYSQL_TYPE_DATE:
+ case MYSQL_TYPE_NEWDATE:
+ mapping.append(STRING_WITH_LEN("DATE"));
+ defaultNeedsQuotes = true;
+ break;
+ case MYSQL_TYPE_TIME:
+ if (timeFormat == TIME_OF_DAY)
+ {
+ mapping.append(STRING_WITH_LEN("TIME"));
+ defaultNeedsQuotes = true;
+ }
+ else
+ mapping.append(STRING_WITH_LEN("INTEGER"));
+ break;
+ case MYSQL_TYPE_DATETIME:
+ mapping.append(STRING_WITH_LEN("TIMESTAMP"));
+ defaultNeedsQuotes = true;
+ break;
+ case MYSQL_TYPE_TIMESTAMP:
+ mapping.append(STRING_WITH_LEN("TIMESTAMP"));
+
+ if (table_share->timestamp_field == field && propagateDefaults)
+ {
+ switch (((Field_timestamp*)field)->get_auto_set_type())
+ {
+ case TIMESTAMP_NO_AUTO_SET:
+ break;
+ case TIMESTAMP_AUTO_SET_ON_INSERT:
+ mapping.append(STRING_WITH_LEN(" DEFAULT CURRENT_TIMESTAMP"));
+ break;
+ case TIMESTAMP_AUTO_SET_ON_UPDATE:
+ if (osVersion.v >= 6 &&
+ !field->is_null())
+ {
+ mapping.append(STRING_WITH_LEN(" GENERATED BY DEFAULT FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP"));
+ warning(ha_thd(), DB2I_ERR_WARN_COL_ATTRS, field->field_name);
+ }
+ else
+ warning(ha_thd(), DB2I_ERR_WARN_COL_ATTRS, field->field_name);
+ break;
+ case TIMESTAMP_AUTO_SET_ON_BOTH:
+ if (osVersion.v >= 6 &&
+ !field->is_null())
+ mapping.append(STRING_WITH_LEN(" GENERATED BY DEFAULT FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP"));
+ else
+ {
+ mapping.append(STRING_WITH_LEN(" DEFAULT CURRENT_TIMESTAMP"));
+ warning(ha_thd(), DB2I_ERR_WARN_COL_ATTRS, field->field_name);
+ }
+ break;
+ }
+ }
+ else
+ defaultNeedsQuotes = true;
+ break;
+ case MYSQL_TYPE_YEAR:
+ if (yearFormat == CHAR4)
+ {
+ mapping.append(STRING_WITH_LEN("CHAR(4) CCSID 1208"));
+ defaultNeedsQuotes = true;
+ }
+ else
+ {
+ mapping.append(STRING_WITH_LEN("SMALLINT"));
+ defaultNeedsQuotes = false;
+ }
+ break;
+ case MYSQL_TYPE_BIT:
+ sprintf(stringBuildBuffer, "BINARY(%d)", (field->max_display_length() / 8) + 1);
+ mapping.append(stringBuildBuffer);
+ break;
+ case MYSQL_TYPE_BLOB:
+ case MYSQL_TYPE_VARCHAR:
+ case MYSQL_TYPE_STRING:
+ {
+ if (field->real_type() == MYSQL_TYPE_ENUM ||
+ field->real_type() == MYSQL_TYPE_SET)
+ {
+ mapping.append(STRING_WITH_LEN("BIGINT"));
+ }
+ else
+ {
+ defaultNeedsQuotes = true;
+
+ fieldLength = field->max_display_length(); // Get field byte length
+
+ if (fieldCharSet == &my_charset_bin)
+ {
+ if (field->type() == MYSQL_TYPE_STRING)
+ {
+ sprintf(stringBuildBuffer, "BINARY(%d)", max(fieldLength, 1));
+ }
+ else
+ {
+ if (fieldLength <= MAX_VARCHAR_LENGTH)
+ {
+ sprintf(stringBuildBuffer, "VARBINARY(%d)", max(fieldLength, 1));
+ }
+ else if (blobMapping == AS_VARCHAR &&
+ (field->flags & PART_KEY_FLAG))
+ {
+ sprintf(stringBuildBuffer, "LONG VARBINARY ");
+ }
+ else
+ {
+ fieldLength = min(MAX_BLOB_LENGTH, fieldLength);
+ sprintf(stringBuildBuffer, "BLOB(%d)", max(fieldLength, 1));
+ }
+ }
+ mapping.append(stringBuildBuffer);
+ }
+ else
+ {
+ if (field->type() == MYSQL_TYPE_STRING)
+ {
+ if (fieldLength > MAX_CHAR_LENGTH)
+ return 1;
+ if (fieldCharSet->mbmaxlen > 1)
+ {
+ if (strncmp(fieldCharSet->name, "ucs2_", sizeof("ucs2_")) == 0 ) // UCS2
+ {
+ sprintf(stringBuildBuffer, "GRAPHIC(%d)", max(fieldLength / fieldCharSet->mbmaxlen, 1)); // Number of characters
+ db2Ccsid = 13488;
+ }
+ else if (strncmp(fieldCharSet->name, "utf8_", sizeof("utf8_")) == 0 &&
+ strcmp(fieldCharSet->name, "utf8_general_ci") != 0)
+ {
+ sprintf(stringBuildBuffer, "CHAR(%d)", max(fieldLength, 1)); // Number of bytes
+ db2Ccsid = 1208;
+ }
+ else
+ {
+ sprintf(stringBuildBuffer, "GRAPHIC(%d)", max(fieldLength / fieldCharSet->mbmaxlen, 1)); // Number of characters
+ db2Ccsid = 1200;
+ }
+ }
+ else
+ {
+ sprintf(stringBuildBuffer, "CHAR(%d)", max(fieldLength, 1));
+ }
+ mapping.append(stringBuildBuffer);
+ }
+ else
+ {
+ if (fieldLength <= MAX_VARCHAR_LENGTH)
+ {
+ if (fieldCharSet->mbmaxlen > 1)
+ {
+ if (strncmp(fieldCharSet->name, "ucs2_", sizeof("ucs2_")) == 0 ) // UCS2
+ {
+ sprintf(stringBuildBuffer, "VARGRAPHIC(%d)", max(fieldLength / fieldCharSet->mbmaxlen, 1)); // Number of characters
+ db2Ccsid = 13488;
+ }
+ else if (strncmp(fieldCharSet->name, "utf8_", sizeof("utf8_")) == 0 &&
+ strcmp(fieldCharSet->name, "utf8_general_ci") != 0)
+ {
+ sprintf(stringBuildBuffer, "VARCHAR(%d)", max(fieldLength, 1)); // Number of bytes
+ db2Ccsid = 1208;
+ }
+ else
+ {
+ sprintf(stringBuildBuffer, "VARGRAPHIC(%d)", max(fieldLength / fieldCharSet->mbmaxlen, 1)); // Number of characters
+ db2Ccsid = 1200;
+ }
+ }
+ else
+ {
+ sprintf(stringBuildBuffer, "VARCHAR(%d)", max(fieldLength, 1));
+ }
+ }
+ else if (blobMapping == AS_VARCHAR &&
+ (field->flags & PART_KEY_FLAG))
+ {
+ if (fieldCharSet->mbmaxlen > 1)
+ {
+ if (strncmp(fieldCharSet->name, "ucs2_", sizeof("ucs2_")) == 0 ) // UCS2
+ {
+ sprintf(stringBuildBuffer, "LONG VARGRAPHIC ");
+ db2Ccsid = 13488;
+ }
+ else if (strncmp(fieldCharSet->name, "utf8_", sizeof("utf8_")) == 0 &&
+ strcmp(fieldCharSet->name, "utf8_general_ci") != 0)
+ {
+ sprintf(stringBuildBuffer, "LONG VARCHAR ");
+ db2Ccsid = 1208;
+ }
+ else
+ {
+ sprintf(stringBuildBuffer, "LONG VARGRAPHIC ");
+ db2Ccsid = 1200;
+ }
+ }
+ else
+ {
+ sprintf(stringBuildBuffer, "LONG VARCHAR ");
+ }
+ }
+ else
+ {
+ fieldLength = min(MAX_BLOB_LENGTH, fieldLength);
+
+ if (fieldCharSet->mbmaxlen > 1)
+ {
+ if (strncmp(fieldCharSet->name, "ucs2_", sizeof("ucs2_")) == 0 ) // UCS2
+ {
+ sprintf(stringBuildBuffer, "DBCLOB(%d)", max(fieldLength / fieldCharSet->mbmaxlen, 1)); // Number of characters
+ db2Ccsid = 13488;
+ }
+ else if (strncmp(fieldCharSet->name, "utf8_", sizeof("utf8_")) == 0 &&
+ strcmp(fieldCharSet->name, "utf8_general_ci") != 0)
+ {
+ sprintf(stringBuildBuffer, "CLOB(%d)", max(fieldLength, 1)); // Number of bytes
+ db2Ccsid = 1208;
+ }
+ else
+ {
+ sprintf(stringBuildBuffer, "DBCLOB(%d)", max(fieldLength / fieldCharSet->mbmaxlen, 1)); // Number of characters
+ db2Ccsid = 1200;
+ }
+ }
+ else
+ {
+ sprintf(stringBuildBuffer, "CLOB(%d)", max(fieldLength, 1)); // Number of characters
+ }
+ }
+
+ mapping.append(stringBuildBuffer);
+ }
+ if (db2Ccsid == 0) // If not overriding CCSID
+ {
+ int32 rtnCode = convertIANAToDb2Ccsid(fieldCharSet->csname, &db2Ccsid);
+ if (rtnCode)
+ return rtnCode;
+ }
+ sprintf(stringBuildBuffer, " CCSID %d ", db2Ccsid);
+ mapping.append(stringBuildBuffer);
+ }
+ }
+ }
+ break;
+
+ }
+
+ if (propagateDefaults)
+ get_field_default_value(field,
+ mapping,
+ defaultNeedsQuotes,
+ db2Ccsid,
+ (zeroDateHandling==SUBSTITUTE_0001_01_01));
+
+ return 0;
+}
+
+
+/**
+ Convert MySQL field data into the equivalent DB2 format
+
+ @param field The MySQL field to be converted
+ @param db2Field The corresponding DB2 field definition
+ @param db2Buf The buffer to receive the converted data
+ @param data NULL if field points to the correct data; otherwise,
+ the data to be converted (for use with keys)
+*/
+int32 ha_ibmdb2i::convertMySQLtoDB2(Field* field, const DB2Field& db2Field, char* db2Buf, const uchar* data)
+{
+ enum_field_types fieldType = field->type();
+ switch (fieldType)
+ {
+ case MYSQL_TYPE_NEWDECIMAL:
+ {
+ uint precision= ((Field_new_decimal*)field)->precision;
+ uint scale= field->decimals();
+ uint db2Precision = min(precision, MAX_DEC_PRECISION);
+ uint truncationAmount = precision - db2Precision;
+
+ if (scale >= truncationAmount)
+ {
+ String tempString(precision+2);
+
+ if (data == NULL)
+ {
+ field->val_str((String*)&tempString, (String*)(NULL));
+ }
+ else
+ {
+ field->val_str(&tempString, data);
+ }
+ const char* temp = tempString.ptr();
+ char packed[32];
+ memset(&packed, 0, sizeof(packed));
+
+ int bcdPos = db2Precision - (db2Precision % 2 ? 1 : 0);
+ bcdAssign(packed, bcdPos+1, (temp[0] == '-' ? 0xD : 0xF));
+
+ int strPos=tempString.length() - 1 - truncationAmount;
+
+ for (;strPos >= 0 && bcdPos >= 0; strPos--)
+ {
+ if (my_isdigit(&my_charset_latin1, temp[strPos]))
+ {
+ bcdAssign(packed, bcdPos, temp[strPos]-'0');
+ --bcdPos;
+ }
+ }
+ memcpy(db2Buf, &packed, (db2Precision/2)+1);
+ }
+
+ }
+ break;
+ case MYSQL_TYPE_TINY:
+ {
+ int16 temp = (data == NULL ? field->val_int() : field->val_int(data));
+ memcpy(db2Buf , &temp, sizeof(temp));
+ }
+ break;
+ case MYSQL_TYPE_SHORT:
+ {
+ if (((Field_num*)field)->unsigned_flag)
+ {
+ memset(db2Buf, 0, 2);
+ memcpy(db2Buf+2, (data == NULL ? field->ptr : data), 2);
+ }
+ else
+ {
+ memcpy(db2Buf, (data == NULL ? field->ptr : data), 2);
+ }
+ }
+ break;
+ case MYSQL_TYPE_LONG:
+ {
+ if (((Field_num*)field)->unsigned_flag)
+ {
+ memset(db2Buf, 0, 4);
+ memcpy(db2Buf+4, (data == NULL ? field->ptr : data), 4);
+ }
+ else
+ {
+ memcpy(db2Buf, (data == NULL ? field->ptr : data), 4);
+ }
+ }
+ break;
+ case MYSQL_TYPE_FLOAT:
+ {
+ memcpy(db2Buf, (data == NULL ? field->ptr : data), 4);
+ }
+ break;
+ case MYSQL_TYPE_DOUBLE:
+ {
+ memcpy(db2Buf, (data == NULL ? field->ptr : data), 8);
+ }
+ break;
+ case MYSQL_TYPE_TIMESTAMP:
+ case MYSQL_TYPE_DATETIME:
+ {
+ String tempString(27);
+ if (data == NULL)
+ {
+ field->val_str(&tempString, &tempString);
+ }
+ else
+ {
+ field->val_str(&tempString, data);
+ }
+ memset(db2Buf, '0', 26);
+ memcpy(db2Buf, tempString.ptr(), tempString.length());
+ if (strncmp(db2Buf,ZERO_DATETIME_VALUE,strlen(ZERO_DATETIME_VALUE)) == 0)
+ {
+ if (cachedZeroDateOption == SUBSTITUTE_0001_01_01)
+ memcpy(db2Buf, ZERO_DATETIME_VALUE_SUBST, sizeof(ZERO_DATETIME_VALUE_SUBST));
+ else
+ {
+ getErrTxt(DB2I_ERR_INVALID_COL_VALUE, field->field_name);
+ return(DB2I_ERR_INVALID_COL_VALUE);
+ }
+ }
+ (db2Buf)[10] = '-';
+ (db2Buf)[13] = (db2Buf)[16] = (db2Buf)[19] = '.';
+
+ convertNumericToEbcdicFast(db2Buf, 26);
+ }
+ break;
+ case MYSQL_TYPE_LONGLONG:
+ {
+ if (((Field_num*)field)->unsigned_flag)
+ {
+ char temp[23];
+ String tempString(temp, sizeof(temp), &my_charset_latin1);
+
+ if (data == NULL)
+ {
+ field->val_str((String*)&tempString, (String*)(NULL));
+ }
+ else
+ {
+ field->val_str(&tempString, data);
+ }
+ char packed[11];
+ memset(packed, 0, sizeof(packed));
+ bcdAssign(packed, 21, (temp[0] == '-' ? 0xD : 0xF));
+ int strPos=tempString.length()-1;
+ int bcdPos=20;
+
+ for (;strPos >= 0; strPos--)
+ {
+ if (my_isdigit(&my_charset_latin1, temp[strPos]))
+ {
+ bcdAssign(packed, bcdPos, temp[strPos]-'0');
+ --bcdPos;
+ }
+ }
+ memcpy(db2Buf, &packed, 11);
+ }
+ else
+ {
+ *(uint64*)db2Buf = *(uint64*)(data == NULL ? field->ptr : data);
+ }
+ }
+ break;
+ case MYSQL_TYPE_INT24:
+ {
+ int32 temp= (data == NULL ? field->val_int() : field->val_int(data));
+ memcpy(db2Buf , &temp, sizeof(temp));
+ }
+ break;
+ case MYSQL_TYPE_DATE:
+ case MYSQL_TYPE_NEWDATE:
+ {
+ String tempString(11);
+ if (data == NULL)
+ {
+ field->val_str(&tempString, (String*)NULL);
+ }
+ else
+ {
+ field->val_str(&tempString, data);
+ }
+ memcpy(db2Buf, tempString.ptr(), 10);
+ if (strncmp(db2Buf,ZERO_DATE_VALUE,strlen(ZERO_DATE_VALUE)) == 0)
+ {
+ if (cachedZeroDateOption == SUBSTITUTE_0001_01_01)
+ memcpy(db2Buf, ZERO_DATE_VALUE_SUBST, sizeof(ZERO_DATE_VALUE_SUBST));
+ else
+ {
+ getErrTxt(DB2I_ERR_INVALID_COL_VALUE,field->field_name);
+ return(DB2I_ERR_INVALID_COL_VALUE);
+ }
+ }
+
+ convertNumericToEbcdicFast(db2Buf,10);
+ }
+ break;
+ case MYSQL_TYPE_TIME:
+ {
+ if (db2Field.getType() == QMY_TIME)
+ {
+ String tempString(10);
+ if (data == NULL)
+ {
+ field->val_str(&tempString, (String*)NULL);
+ }
+ else
+ {
+ field->val_str(&tempString, data);
+ }
+ memcpy(db2Buf, tempString.ptr(), 8);
+ (db2Buf)[2]=(db2Buf)[5] = '.';
+
+ convertNumericToEbcdicFast(db2Buf, 8);
+ }
+ else
+ {
+ int32 temp = sint3korr(data == NULL ? field->ptr : data);
+ memcpy(db2Buf, &temp, sizeof(temp));
+ }
+ }
+ break;
+ case MYSQL_TYPE_YEAR:
+ {
+ String tempString(5);
+ if (db2Field.getType() == QMY_CHAR)
+ {
+ if (data == NULL)
+ {
+ field->val_str(&tempString, (String*)NULL);
+ }
+ else
+ {
+ field->val_str(&tempString, data);
+ }
+ memcpy(db2Buf, tempString.ptr(), 4);
+ }
+ else
+ {
+ uint8 temp = *(uint8*)(data == NULL ? field->ptr : data);
+ *(uint16*)(db2Buf) = (temp ? temp + 1900 : 0);
+ }
+ }
+ break;
+ case MYSQL_TYPE_BIT:
+ {
+ int bytesToCopy = db2Field.getByteLengthInRecord();
+
+ if (data == NULL)
+ {
+ uint64 temp = field->val_int();
+ memcpy(db2Buf,
+ ((char*)&temp) + (sizeof(temp) - bytesToCopy),
+ bytesToCopy);
+ }
+ else
+ {
+ memcpy(db2Buf,
+ data,
+ bytesToCopy);
+ }
+ }
+ break;
+ case MYSQL_TYPE_VARCHAR:
+ case MYSQL_TYPE_STRING:
+ case MYSQL_TYPE_BLOB:
+ {
+ if (field->real_type() == MYSQL_TYPE_ENUM ||
+ field->real_type() == MYSQL_TYPE_SET)
+ {
+ int64 temp= (data == NULL ? field->val_int() : field->val_int(data));
+ *(int64*)db2Buf = temp;
+ }
+ else
+ {
+ const uchar* dataToStore;
+ uint32 bytesToStore;
+ uint32 bytesToPad = 0;
+ CHARSET_INFO* fieldCharSet = field->charset();
+ uint32 maxDisplayLength = field->max_display_length();
+ switch (fieldType)
+ {
+ case MYSQL_TYPE_STRING:
+ {
+ bytesToStore = maxDisplayLength;
+ if (data == NULL)
+ dataToStore = field->ptr;
+ else
+ dataToStore = data;
+ }
+ break;
+ case MYSQL_TYPE_VARCHAR:
+ {
+
+ if (data == NULL)
+ {
+ bytesToStore = field->data_length();
+ dataToStore = field->ptr + ((Field_varstring*)field)->length_bytes;
+ }
+ else
+ {
+ // Key lens are stored little-endian
+ bytesToStore = *(uint8*)data + ((*(uint8*)(data+1)) << 8);
+ dataToStore = data + 2;
+ }
+ bytesToPad = maxDisplayLength - bytesToStore;
+ }
+ break;
+ case MYSQL_TYPE_BLOB:
+ {
+ if (data == NULL)
+ {
+ bytesToStore = ((Field_blob*)field)->get_length();
+ bytesToPad = maxDisplayLength - bytesToStore;
+ ((Field_blob*)field)->get_ptr((uchar**)&dataToStore);
+ }
+ else
+ {
+ // Key lens are stored little-endian
+ bytesToStore = *(uint8*)data + ((*(uint8*)(data+1)) << 8);
+ dataToStore = data + 2;
+ }
+ }
+ break;
+ }
+
+ int32 rc;
+ uint16 db2FieldType = db2Field.getType();
+ switch(db2FieldType)
+ {
+ case QMY_CHAR:
+ if (maxDisplayLength == 0)
+ bytesToPad = 1;
+ case QMY_VARCHAR:
+ if (db2FieldType == QMY_VARCHAR)
+ {
+ db2Buf += sizeof(uint16);
+ bytesToPad = 0;
+ }
+
+ if (bytesToStore > db2Field.getDataLengthInRecord())
+ {
+ bytesToStore = db2Field.getDataLengthInRecord();
+ field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1);
+ }
+
+ if (fieldCharSet == &my_charset_bin) // If binary
+ {
+ if (bytesToStore)
+ memcpy(db2Buf, dataToStore, bytesToStore);
+ if (bytesToPad)
+ memset(db2Buf + bytesToStore, 0x00, bytesToPad);
+ }
+ else if (db2Field.getCCSID() == 1208) // utf8
+ {
+ if (bytesToStore)
+ memcpy(db2Buf, dataToStore, bytesToStore);
+ if (bytesToPad)
+ memset(db2Buf + bytesToStore, ' ', bytesToPad);
+ }
+ else // single-byte ASCII to EBCDIC
+ {
+ DBUG_ASSERT(fieldCharSet->mbmaxlen == 1);
+ if (bytesToStore)
+ {
+ rc = convertFieldChars(toDB2, field->field_index, (char*)dataToStore, db2Buf, bytesToStore, bytesToStore, NULL);
+ if (rc)
+ return rc;
+ }
+ if (bytesToPad)
+ memset(db2Buf + bytesToStore, 0x40, bytesToPad);
+ }
+
+ if (db2FieldType == QMY_VARCHAR)
+ *(uint16*)(db2Buf - sizeof(uint16)) = bytesToStore;
+ break;
+ case QMY_VARGRAPHIC:
+ db2Buf += sizeof(uint16);
+ bytesToPad = 0;
+ case QMY_GRAPHIC:
+ if (maxDisplayLength == 0 && db2FieldType == QMY_GRAPHIC)
+ bytesToPad = 2;
+
+ if (db2Field.getCCSID() == 13488)
+ {
+ if (bytesToStore)
+ memcpy(db2Buf, dataToStore, bytesToStore);
+ if (bytesToPad)
+ wmemset((wchar_t*)(db2Buf + bytesToStore), 0x0020, bytesToPad/2);
+ }
+ else
+ {
+ size_t db2BytesToStore;
+ size_t maxDb2BytesToStore;
+
+ if (maxDisplayLength == 0 && db2FieldType == QMY_GRAPHIC)
+ maxDb2BytesToStore = 2;
+ else
+ maxDb2BytesToStore = min(((bytesToStore * 2) / fieldCharSet->mbminlen),
+ ((maxDisplayLength * 2) / fieldCharSet->mbmaxlen));
+
+ if (bytesToStore == 0)
+ db2BytesToStore = 0;
+ else
+ {
+ rc = convertFieldChars(toDB2, field->field_index, (char*)dataToStore, db2Buf, bytesToStore, maxDb2BytesToStore, &db2BytesToStore);
+ if (rc)
+ return rc;
+ bytesToStore = db2BytesToStore;
+ }
+ if (db2BytesToStore < maxDb2BytesToStore) // If need to pad
+ wmemset((wchar_t*)(db2Buf + db2BytesToStore), 0x0020, (maxDb2BytesToStore - db2BytesToStore)/2);
+ }
+
+ if (db2FieldType == QMY_VARGRAPHIC)
+ *(uint16*)(db2Buf-sizeof(uint16)) = bytesToStore/2;
+ break;
+ case QMY_BLOBCLOB:
+ case QMY_DBCLOB:
+ {
+ DBUG_ASSERT(data == NULL);
+ DB2LobField* lobField = (DB2LobField*)(db2Buf + db2Field.calcBlobPad());
+
+ if ((fieldCharSet == &my_charset_bin) || // binary or
+ (db2Field.getCCSID()==13488) ||
+ (db2Field.getCCSID()==1208)) // binary UTF8
+ {
+ }
+ else
+ {
+ char* temp;
+ int32 rc;
+ size_t db2BytesToStore;
+ if (fieldCharSet->mbmaxlen == 1) // single-byte ASCII to EBCDIC
+ {
+ temp = getCharacterConversionBuffer(field->field_index, bytesToStore);
+ rc = convertFieldChars(toDB2, field->field_index, (char*)dataToStore,temp,bytesToStore, bytesToStore, NULL);
+ if (rc)
+ return (rc);
+ }
+ else // Else Far East, special UTF8 or non-special UTF8/UCS2
+ {
+ size_t maxDb2BytesToStore;
+ maxDb2BytesToStore = min(((bytesToStore * 2) / fieldCharSet->mbminlen),
+ ((maxDisplayLength * 2) / fieldCharSet->mbmaxlen));
+ temp = getCharacterConversionBuffer(field->field_index, maxDb2BytesToStore);
+ rc = convertFieldChars(toDB2, field->field_index, (char*)dataToStore,temp,bytesToStore, maxDb2BytesToStore, &db2BytesToStore);
+ if (rc)
+ return (rc);
+ bytesToStore = db2BytesToStore;
+ }
+ dataToStore = (uchar*)temp;
+ }
+
+ uint16 blobID = db2Table->getBlobIdFromField(field->field_index);
+ if (blobWriteBuffers[blobID] != (char*)dataToStore)
+ blobWriteBuffers[blobID].reassign((char*)dataToStore);
+ if ((void*)blobWriteBuffers[blobID])
+ lobField->dataHandle = (ILEMemHandle)blobWriteBuffers[blobID];
+ else
+ lobField->dataHandle = 0;
+ lobField->length = bytesToStore / (db2FieldType == QMY_DBCLOB ? 2 : 1);
+ }
+ break;
+ }
+ }
+ }
+ break;
+ default:
+ DBUG_ASSERT(0);
+ break;
+ }
+
+ return (ha_thd()->is_error());
+}
+
+
+/**
+ Convert DB2 field data into the equivalent MySQL format
+
+ @param db2Field The DB2 field definition
+ @param field The MySQL field to receive the converted data
+ @param buf The DB2 data to be converted
+*/
+int32 ha_ibmdb2i::convertDB2toMySQL(const DB2Field& db2Field, Field* field, const char* buf)
+{
+ int32 storeRC = 0; // Result of the field->store() operation
+
+ const char* bufPtr = buf + db2Field.getBufferOffset();
+
+ switch (field->type())
+ {
+ case MYSQL_TYPE_NEWDECIMAL:
+ {
+ uint precision= ((Field_new_decimal*)field)->precision;
+ uint scale= field->decimals();
+ uint db2Precision = min(precision, MAX_DEC_PRECISION);
+ uint decimalPlace = precision-scale+1;
+ char temp[80];
+
+ if (precision <= MAX_DEC_PRECISION ||
+ scale > precision - MAX_DEC_PRECISION)
+ {
+ uint numNibbles = db2Precision + (db2Precision % 2 ? 0 : 1);
+
+ temp[0] = (bcdGet(bufPtr, numNibbles) == 0xD ? '-' : ' ');
+ int strPos=1;
+ int bcdPos=(db2Precision % 2 ? 0 : 1);
+
+ for (;bcdPos < numNibbles; bcdPos++, strPos++)
+ {
+ if (strPos == decimalPlace)
+ {
+ temp[strPos] = '.';
+ strPos++;
+ }
+
+ temp[strPos] = bcdGet(bufPtr, bcdPos) + '0';
+ }
+
+ temp[strPos] = 0;
+
+ storeRC = field->store(temp, strPos, &my_charset_latin1);
+ }
+ }
+ break;
+ case MYSQL_TYPE_TINY:
+ {
+ storeRC = field->store(*(int16*)bufPtr, ((Field_num*)field)->unsigned_flag);
+ }
+ break;
+ case MYSQL_TYPE_SHORT:
+ {
+ if (((Field_num*)field)->unsigned_flag)
+ {
+ storeRC = field->store(*(int32*)bufPtr, TRUE);
+ }
+ else
+ {
+ storeRC = field->store(*(int16*)bufPtr, FALSE);
+ }
+ }
+ break;
+ case MYSQL_TYPE_LONG:
+ {
+ if (((Field_num*)field)->unsigned_flag)
+ {
+ storeRC = field->store(*(int64*)bufPtr, TRUE);
+ }
+ else
+ {
+ storeRC = field->store(*(int32*)bufPtr, FALSE);
+ }
+ }
+ break;
+ case MYSQL_TYPE_FLOAT:
+ {
+ storeRC = field->store(*(float*)bufPtr);
+ }
+ break;
+ case MYSQL_TYPE_DOUBLE:
+ {
+ storeRC = field->store(*(double*)bufPtr);
+ }
+ break;
+ case MYSQL_TYPE_LONGLONG:
+ {
+ char temp[23];
+ if (((Field_num*)field)->unsigned_flag)
+ {
+ temp[0] = (bcdGet(bufPtr, 21) == 0xD ? '-' : ' ');
+ int strPos=1;
+ int bcdPos=0;
+
+ for (;bcdPos <= 20; bcdPos++, strPos++)
+ {
+ temp[strPos] = bcdGet(bufPtr, bcdPos) + '0';
+ }
+
+ temp[strPos] = 0;
+
+ storeRC = field->store(temp, strPos, &my_charset_latin1);
+ }
+ else
+ {
+ storeRC = field->store(*(int64*)bufPtr, FALSE);
+ }
+ }
+ break;
+ case MYSQL_TYPE_INT24:
+ {
+ storeRC = field->store(*(int32*)bufPtr, ((Field_num*)field)->unsigned_flag);
+ }
+ break;
+ case MYSQL_TYPE_DATE:
+ case MYSQL_TYPE_NEWDATE:
+ {
+ longlong value= a4toi_ebcdic((uchar*)bufPtr) * 10000 +
+ a2toi_ebcdic((uchar*)bufPtr+5) * 100 +
+ a2toi_ebcdic((uchar*)bufPtr+8);
+
+ if (cachedZeroDateOption == SUBSTITUTE_0001_01_01 &&
+ value == (10000 + 100 + 1))
+ value = 0;
+
+ storeRC = field->store(value);
+ }
+ break;
+ case MYSQL_TYPE_TIME:
+ {
+ if (db2Field.getType() == QMY_TIME)
+ {
+ longlong value= a2toi_ebcdic((uchar*)bufPtr) * 10000 +
+ a2toi_ebcdic((uchar*)bufPtr+3) * 100 +
+ a2toi_ebcdic((uchar*)bufPtr+6);
+
+ storeRC = field->store(value);
+ }
+ else
+ storeRC = field->store(*((int32*)bufPtr));
+ }
+ break;
+ case MYSQL_TYPE_TIMESTAMP:
+ case MYSQL_TYPE_DATETIME:
+ {
+ longlong value= (a4toi_ebcdic((uchar*)bufPtr) * 10000 +
+ a2toi_ebcdic((uchar*)bufPtr+5) * 100 +
+ a2toi_ebcdic((uchar*)bufPtr+8)) * 1000000LL +
+ (a2toi_ebcdic((uchar*)bufPtr+11) * 10000 +
+ a2toi_ebcdic((uchar*)bufPtr+14) * 100 +
+ a2toi_ebcdic((uchar*)bufPtr+17));
+
+ if (cachedZeroDateOption == SUBSTITUTE_0001_01_01 &&
+ value == (10000 + 100 + 1) * 1000000LL)
+ value = 0;
+
+ storeRC = field->store(value);
+ }
+ break;
+ case MYSQL_TYPE_YEAR:
+ {
+ if (db2Field.getType() == QMY_CHAR)
+ {
+ storeRC = field->store(bufPtr, 4, &my_charset_bin);
+ }
+ else
+ {
+ storeRC = field->store(*((uint16*)bufPtr));
+ }
+ }
+ break;
+ case MYSQL_TYPE_BIT:
+ {
+ uint64 temp= 0;
+ int bytesToCopy= db2Field.getByteLengthInRecord();
+ memcpy(((char*)&temp) + (sizeof(temp) - bytesToCopy), bufPtr, bytesToCopy);
+ storeRC = field->store(temp, TRUE);
+ }
+ break;
+ case MYSQL_TYPE_VARCHAR:
+ case MYSQL_TYPE_STRING:
+ case MYSQL_TYPE_BLOB:
+ {
+ if (field->real_type() == MYSQL_TYPE_ENUM ||
+ field->real_type() == MYSQL_TYPE_SET)
+ {
+ storeRC = field->store(*(int64*)bufPtr);
+ }
+ else
+ {
+
+ const char* dataToStore = NULL;
+ uint32 bytesToStore = 0;
+ CHARSET_INFO* fieldCharSet = field->charset();
+ switch(db2Field.getType())
+ {
+ case QMY_CHAR:
+ case QMY_GRAPHIC:
+ {
+ bytesToStore = db2Field.getByteLengthInRecord();
+ if (bytesToStore == 0)
+ bytesToStore = 1;
+ dataToStore = bufPtr;
+ }
+ break;
+ case QMY_VARCHAR:
+ {
+ bytesToStore = *(uint16*)bufPtr;
+ dataToStore = bufPtr+sizeof(uint16);
+ }
+ break;
+ case QMY_VARGRAPHIC:
+ {
+ /* For VARGRAPHIC, convert the number of double-byte characters
+ to the number of bytes. */
+ bytesToStore = (*(uint16*)bufPtr)*2;
+ dataToStore = bufPtr+sizeof(uint16);
+ }
+ break;
+ case QMY_DBCLOB:
+ case QMY_BLOBCLOB:
+ {
+ DB2LobField* lobField = (DB2LobField* )(bufPtr + db2Field.calcBlobPad());
+ bytesToStore = lobField->length * (db2Field.getType() == QMY_DBCLOB ? 2 : 1);
+ dataToStore = (char*)blobReadBuffers->getBufferPtr(field->field_index);
+ }
+ break;
+
+ }
+
+ if ((fieldCharSet != &my_charset_bin) && // not binary &
+ (db2Field.getCCSID() != 13488) && // not UCS2 &
+ (db2Field.getCCSID() != 1208))
+ {
+ char* temp;
+ size_t db2BytesToStore;
+ int rc;
+ if (fieldCharSet->mbmaxlen > 1)
+ {
+ size_t maxDb2BytesToStore = ((bytesToStore / 2) * fieldCharSet->mbmaxlen); // Worst case for number of bytes
+ temp = getCharacterConversionBuffer(field->field_index, maxDb2BytesToStore);
+ rc = convertFieldChars(toMySQL, field->field_index, dataToStore, temp, bytesToStore, maxDb2BytesToStore, &db2BytesToStore);
+ bytesToStore = db2BytesToStore;
+ }
+ else // single-byte ASCII to EBCDIC
+ {
+ temp = getCharacterConversionBuffer(field->field_index, bytesToStore);
+ rc = convertFieldChars(toMySQL, field->field_index, dataToStore, temp, bytesToStore, bytesToStore, NULL);
+ }
+ if (rc)
+ return (rc);
+ dataToStore = temp;
+ }
+
+ if ((field)->flags & BLOB_FLAG)
+ ((Field_blob*)(field))->set_ptr(bytesToStore, (uchar*)dataToStore);
+ else
+ storeRC = field->store(dataToStore, bytesToStore, &my_charset_bin);
+ }
+ }
+ break;
+ default:
+ DBUG_ASSERT(0);
+ break;
+
+ }
+
+ if (storeRC)
+ {
+ invalidDataFound = true;
+ }
+
+ return 0;
+}
diff --git a/storage/ibmdb2i/db2i_errors.cc b/storage/ibmdb2i/db2i_errors.cc
new file mode 100644
index 00000000000..43dd539447f
--- /dev/null
+++ b/storage/ibmdb2i/db2i_errors.cc
@@ -0,0 +1,297 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+
+#include "db2i_errors.h"
+#include "db2i_ileBridge.h"
+#include "db2i_charsetSupport.h"
+#include "mysql_priv.h"
+#include "stdarg.h"
+
+#define MAX_MSGSTRING 109
+
+/*
+ The following strings are associated with errors that can be produced
+ within the storage engine proper.
+*/
+static const char* engineErrors[MAX_MSGSTRING] =
+{
+ {""},
+ {"Error opening codeset conversion from %.64s to %.64s (errno = %d)"},
+ {"Invalid %-.10s name '%-.128s'"},
+ {"Unsupported move from '%-.128s' to '%-.128s' on RENAME TABLE statement"},
+ {"Unsupported schema '%-.128s' specified on RENAME TABLE statement"},
+ {"Auto_increment is not allowed for a partitioned table"},
+ {"Character set conversion error due to unknown encoding scheme %d"},
+ {""},
+ {"Table '%-.128s' was not found by the storage engine"},
+ {"Could not resolve to %-.128s in library %-.10s type %-.10s (errno = %d)"},
+ {"Error on _PGMCALL for program %-.10s in library %-.10s (error = %d)"},
+ {"Error on _ILECALL for API '%.128s' (error = %d)"},
+ {"Error in iconv() function during character set conversion (errno = %d)"},
+ {"Error from Get Encoding Scheme (QTQGESP) API: %d, %d, %d"},
+ {"Error from Get Related Default CCSID (QTQGRDC) API: %d, %d, %d"},
+ {"Data out of range for column '%.192s'"},
+ {"Schema name '%.128s' exceeds maximum length of %d characters"},
+ {"Multiple collations not supported in a single index or constraint"},
+ {"Sort sequence was not found"},
+ {"One or more characters in column %.128s were substituted during conversion"},
+ {"A decimal column exceeded the maximum precision. Data may be truncated."},
+ {"Some data returned by DB2 for table %s could not be converted for MySQL"},
+ {""},
+ {"Column %.128s contains characters that cannot be converted"},
+ {"An invalid name was specified for ibmdb2i_rdb_name."},
+ {"A duplicate key was encountered for index '%.128s'"},
+ {"A table with the same name exists but has incompatible column definitions."},
+ {"The created table was discovered as an existing DB2 object."},
+ {"Some attribute(s) defined for column '%.128s' may not be honored by accesses from DB2."},
+};
+
+/*
+ The following strings are associated with errors that can be returned
+ by the operating system via the QMY_* APIs. Most are very uncommon and
+ indicate a bug somewhere.
+*/
+static const char* systemErrors[MAX_MSGSTRING] =
+{
+ {"Thread ID is too long"},
+ {"Error creating a SPACE memory object"},
+ {"Error creating a FILE memory object"},
+ {"Error creating a SPACE synchronization token"},
+ {"Error creating a FILE synchronization token"},
+ {"See message %-.7s in joblog for job %-.6s/%-.10s/%-.10s."},
+ {"Error unlocking a synchronization token when closing a connection"},
+ {"Invalid action specified for an 'object lock' request"},
+ {"Invalid action specified for a savepoint request"},
+ {"Partial keys are not supported with an ICU sort sequence"},
+ {"Error retrieving an ICU sort key"},
+ {"Error converting single-byte sort sequence to UCS-2"},
+ {"An unsupported collation was specified"},
+ {"Validation failed for referenced table of foreign key constraint"},
+ {"Error extracting table for constraint information"},
+ {"Error extracting referenced table for constraint information"},
+ {"Invalid action specified for a 'commitment control' request"},
+ {"Invalid commitment control isolation level specified on 'open' request"},
+ {"Invalid file handle"},
+ {" "},
+ {"Invalid option specified for returning data on 'read' request"},
+ {"Invalid orientation specified for 'read' request"},
+ {"Invalid option type specified for 'read' request"},
+ {"Invalid isolation level for starting commitment control"},
+ {"Error unlocking a synchronization token in module QMYALC"},
+ {"Length of space for returned format is not long enough"},
+ {"SQL XA transactions are currently unsupported by this interface"},
+ {"The associated QSQSRVR job was killed or ended unexpectedly."},
+ {"Error unlocking a synchronization token in module QMYSEI"},
+ {"Error unlocking a synchronization token in module QMYSPO"},
+ {"Error converting input CCSID from short form to long form"},
+ {" "},
+ {"Error getting associated CCSID for CCSID conversion"},
+ {"Error converting a string from one CCSID to another"},
+ {"Error unlocking a synchronization token"},
+ {"Error destroying a synchronization token"},
+ {"Error locking a synchronization token"},
+ {"Error recreating a synchronization token"},
+ {"A space handle was not specified for a constraint request"},
+ {"An SQL cursor was specified for a delete request"},
+ {" "},
+ {"Error on delete request because current UFCB for connection is not open"},
+ {"An SQL cursor was specified for an object initialization request"},
+ {"An SQL cursor was specified for an object override request"},
+ {"A space handle was not specified for an object override request"},
+ {"An SQL cursor was specified for an information request"},
+ {"An SQL cursor was specified for an object lock request"},
+ {"An SQL cursor was specified for an optimize request"},
+ {"A data handle was not specified for a read request"},
+ {"A row number handle was not specified for a read request"},
+ {"A key handle was not specified for a read request"},
+ {"An SQL cursor was specified for an row estimation request"},
+ {"A space handle was not specified for a row estimation request"},
+ {"An SQL cursor was specified for a release record request"},
+ {"A statement handle was not specified for an 'execute immediate' request"},
+ {"A statement handle was not specified for a 'prepare open' request"},
+ {"An SQL cursor was specified for an update request"},
+ {"The UFCB was not open for read"},
+ {"Error on update request because current UFCB for connection is not open"},
+ {"A data handle was not specified for an update request"},
+ {"An SQL cursor was specified for a write request"},
+ {"A data handle was not specified for a write request"},
+ {"An unknown function was specified on a process request"},
+ {"A share definition was not specified for an 'allocate share' request"},
+ {"A share handle was not specified for an 'allocate share' request"},
+ {"A use count handle was not specified for an 'allocate share' request"},
+ {"A 'records per key' handle was not specified for an information request"},
+ {"Error resolving LOB addresss"},
+ {"Length of a LOB space is too small"},
+ {"An unknown function was specified for a server request"},
+ {"Object authorization failed. See message %-.7s in joblog for job %-.6s/%-.10s/%-.10s. for more information."},
+ {" "},
+ {"Error locking mutex on server"},
+ {"Error unlocking mutex on server"},
+ {"Error checking for RDB name in RDB Directory"},
+ {"Error creating mutex on server"},
+ {"A table with that name already exists"},
+ {" "},
+ {"Error unlocking mutex"},
+ {"Error connecting to server job"},
+ {"Error connecting to server job"},
+ {" "},
+ {"Function check occurred while registering parameter spaces. See joblog."},
+ {" "},
+ {" "},
+ {"End of block"},
+ {"The file has changed and might not be compatible with the MySQL table definition"},
+ {"Error giving pipe to server job"},
+ {"There are open object locks when attempting to deallocate"},
+ {"There is no open lock"},
+ {" "},
+ {" "},
+ {"The maximum value for the auto_increment data type was exceeded"},
+ {"Error occurred closing the pipe "},
+ {"Error occurred taking a descriptor for the pipe"},
+ {"Error writing to pipe "},
+ {"Server was interrupted "},
+ {"No pipe descriptor exists for reuse "},
+ {"Error occurred during an SQL prepare statement "},
+ {"Error occurred during an SQL open "},
+ {" "},
+ {" "},
+ {" "},
+ {" "},
+ {" "},
+ {" "},
+ {"An unspecified error was returned from the system."},
+ {" "}
+};
+
+/**
+ This function builds the text string for an error code, and substitutes
+ a variable number of replacement variables into the string.
+*/
+void getErrTxt(int errCode, ...)
+{
+ va_list args;
+ va_start(args,errCode);
+ char* buffer = db2i_ileBridge::getBridgeForThread()->getErrorStorage();
+ const char* msg;
+
+ if (errCode >= QMY_ERR_MIN && errCode <= QMY_ERR_SQ_OPEN)
+ msg = systemErrors[errCode - QMY_ERR_MIN];
+ else
+ {
+ DBUG_ASSERT(errCode >= DB2I_FIRST_ERR && errCode <= DB2I_LAST_ERR);
+ msg = engineErrors[errCode - DB2I_FIRST_ERR];
+ }
+
+ (void) my_vsnprintf (buffer, MYSQL_ERRMSG_SIZE, msg, args);
+ va_end(args);
+ fprintf(stderr,"ibmdb2i error %d: %s\n",errCode,buffer);
+ DBUG_PRINT("error", ("ibmdb2i error %d: %s",errCode,buffer));
+}
+
+static inline void trimSpace(char* str)
+{
+ char* end = strchr(str, ' ');
+ if (end) *end = 0;
+}
+
+
+/**
+ Generate the error text specific to an API error returned by a QMY_* API.
+
+ @parm errCode The error value
+ @parm errInfo The structure containing the message and job identifiers.
+*/
+void reportSystemAPIError(int errCode, const Qmy_Error_output *errInfo)
+{
+ if (errCode >= QMY_ERR_MIN && errCode <= QMY_ERR_SQ_OPEN)
+ {
+ switch(errCode)
+ {
+ case QMY_ERR_MSGID:
+ case QMY_ERR_NOT_AUTH:
+ {
+ DBUG_ASSERT(errInfo);
+ char jMsg[8]; // Error message ID
+ char jName[11]; // Job name
+ char jUser[11]; // Job user
+ char jNbr[7]; // Job number
+ memset(jMsg, 0, sizeof(jMsg));
+ memset(jName, 0, sizeof(jMsg));
+ memset(jUser, 0, sizeof(jMsg));
+ memset(jMsg, 0, sizeof(jMsg));
+
+ convFromEbcdic(errInfo->MsgId,jMsg,sizeof(jMsg)-1);
+ convFromEbcdic(errInfo->JobName,jName,sizeof(jName)-1);
+ trimSpace(jName);
+ convFromEbcdic(errInfo->JobUser,jUser,sizeof(jUser)-1);
+ trimSpace(jUser);
+ convFromEbcdic(errInfo->JobNbr,jNbr,sizeof(jNbr)-1);
+ getErrTxt(errCode,jMsg,jNbr,jUser,jName);
+ }
+ break;
+ case QMY_ERR_RTNFMT:
+ {
+ getErrTxt(QMY_ERR_LVLID_MISMATCH);
+ }
+ break;
+ default:
+ getErrTxt(errCode);
+ break;
+ }
+ }
+}
+
+
+/**
+ Generate a warning for the specified error.
+*/
+void warning(THD *thd, int errCode, ...)
+{
+ va_list args;
+ va_start(args,errCode);
+ char buffer[MYSQL_ERRMSG_SIZE];
+ const char* msg;
+
+ DBUG_ASSERT(errCode >= DB2I_FIRST_ERR && errCode <= DB2I_LAST_ERR);
+ msg = engineErrors[errCode - DB2I_FIRST_ERR];
+
+ (void) my_vsnprintf (buffer, MYSQL_ERRMSG_SIZE, msg, args);
+ va_end(args);
+ DBUG_PRINT("warning", ("ibmdb2i warning %d: %s",errCode,buffer));
+ push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, errCode, buffer);
+}
+
+
diff --git a/storage/ibmdb2i/db2i_errors.h b/storage/ibmdb2i/db2i_errors.h
new file mode 100644
index 00000000000..0f6fbef33f6
--- /dev/null
+++ b/storage/ibmdb2i/db2i_errors.h
@@ -0,0 +1,93 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+
+#ifndef DB2I_ERRORS_H
+#define DB2I_ERRORS_H
+
+#include "qmyse.h"
+class THD;
+
+/**
+ @enum DB2I_errors
+
+ @brief These are the errors that can be returned by the storage engine proper
+ and that are specific to the engine. Refer to db2i_errors.cc for text
+ descriptions of the errors.
+*/
+
+enum DB2I_errors
+{
+ DB2I_FIRST_ERR = 2500,
+ DB2I_ERR_ICONV_OPEN,
+ DB2I_ERR_INVALID_NAME,
+ DB2I_ERR_RENAME_MOVE,
+ DB2I_ERR_RENAME_QTEMP,
+ DB2I_ERR_PART_AUTOINC,
+ DB2I_ERR_UNKNOWN_ENCODING,
+ DB2I_ERR_RESERVED,
+ DB2I_ERR_TABLE_NOT_FOUND,
+ DB2I_ERR_RESOLVE_OBJ,
+ DB2I_ERR_PGMCALL,
+ DB2I_ERR_ILECALL,
+ DB2I_ERR_ICONV,
+ DB2I_ERR_QTQGESP,
+ DB2I_ERR_QTQGRDC,
+ DB2I_ERR_INVALID_COL_VALUE,
+ DB2I_ERR_TOO_LONG_SCHEMA,
+ DB2I_ERR_MIXED_COLLATIONS,
+ DB2I_ERR_SRTSEQ,
+ DB2I_ERR_SUB_CHARS,
+ DB2I_ERR_PRECISION,
+ DB2I_ERR_INVALID_DATA,
+ DB2I_ERR_RESERVED2,
+ DB2I_ERR_ILL_CHAR,
+ DB2I_ERR_BAD_RDB_NAME,
+ DB2I_ERR_UNKNOWN_IDX,
+ DB2I_ERR_DISCOVERY_MISMATCH,
+ DB2I_ERR_WARN_CREATE_DISCOVER,
+ DB2I_ERR_WARN_COL_ATTRS,
+ DB2I_LAST_ERR = DB2I_ERR_WARN_COL_ATTRS
+};
+
+void getErrTxt(int errcode, ...);
+void reportSystemAPIError(int errCode, const Qmy_Error_output *errInfo);
+void warning(THD *thd, int errCode, ...);
+
+const char* DB2I_SQL0350 = "\xE2\xD8\xD3\xF0\xF3\xF5\xF0"; // SQL0350 in EBCDIC
+const char* DB2I_CPF503A = "\xC3\xD7\xC6\xF5\xF0\xF3\xC1"; // CPF503A in EBCDIC
+const char* DB2I_SQL0538 = "\xE2\xD8\xD3\xF0\xF5\xF3\xF8"; // SQL0538 in EBCDIC
+
+#endif
diff --git a/storage/ibmdb2i/db2i_file.cc b/storage/ibmdb2i/db2i_file.cc
new file mode 100644
index 00000000000..a16aa927527
--- /dev/null
+++ b/storage/ibmdb2i/db2i_file.cc
@@ -0,0 +1,556 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+
+
+#include "db2i_file.h"
+#include "db2i_charsetSupport.h"
+#include "db2i_collationSupport.h"
+#include "db2i_misc.h"
+#include "db2i_errors.h"
+#include "my_dir.h"
+
+db2i_table::db2i_table(const TABLE_SHARE* myTable, const char* path) :
+ mysqlTable(myTable),
+ db2StartId(0),
+ blobFieldCount(0),
+ blobFields(NULL),
+ blobFieldActualSizes(NULL),
+ logicalFiles(NULL),
+ physicalFile(NULL),
+ db2TableNameSQLAscii(NULL),
+ db2LibNameSQLAscii(NULL)
+{
+ char asciiLibName[MAX_DB2_SCHEMANAME_LENGTH + 1];
+ getDB2LibNameFromPath(path, asciiLibName, ASCII_NATIVE);
+
+ char asciiFileName[MAX_DB2_FILENAME_LENGTH + 1];
+ getDB2FileNameFromPath(path, asciiFileName, ASCII_NATIVE);
+
+ size_t libNameLen = strlen(asciiLibName);
+ size_t fileNameLen = strlen(asciiFileName);
+
+ db2LibNameEbcdic=(char *)
+ my_multi_malloc(MYF(MY_WME | MY_ZEROFILL),
+ &db2LibNameEbcdic, libNameLen+1,
+ &db2LibNameAscii, libNameLen+1,
+ &db2LibNameSQLAscii, libNameLen*2 + 1,
+ &db2TableNameEbcdic, fileNameLen+1,
+ &db2TableNameAscii, fileNameLen+1,
+ &db2TableNameSQLAscii, fileNameLen*2 + 1,
+ NullS);
+
+ if (likely(db2LibNameEbcdic))
+ {
+ memcpy(db2LibNameAscii, asciiLibName, libNameLen);
+ convertNativeToSQLName(db2LibNameAscii, db2LibNameSQLAscii);
+ convToEbcdic(db2LibNameAscii, db2LibNameEbcdic, libNameLen);
+ memcpy(db2TableNameAscii, asciiFileName, fileNameLen);
+ convertNativeToSQLName(db2TableNameAscii, db2TableNameSQLAscii);
+ convToEbcdic(db2TableNameAscii, db2TableNameEbcdic, fileNameLen);
+ }
+
+ conversionDefinitions[toMySQL] = NULL;
+ conversionDefinitions[toDB2] = NULL;
+
+ isTemporaryTable = (strstr(mysqlTable->path.str, mysql_tmpdir) == mysqlTable->path.str);
+}
+
+
+int32 db2i_table::initDB2Objects(const char* path)
+{
+ uint fileObjects = 1 + mysqlTable->keys;
+ ValidatedPointer<ShrDef> fileDefnSpace(sizeof(ShrDef) * fileObjects);
+
+ physicalFile = new db2i_file(this);
+ physicalFile->fillILEDefn(&fileDefnSpace[0], true);
+
+ logicalFileCount = mysqlTable->keys;
+ if (logicalFileCount > 0)
+ {
+ logicalFiles = new db2i_file*[logicalFileCount];
+ for (int k = 0; k < logicalFileCount; k++)
+ {
+ logicalFiles[k] = new db2i_file(this, k);
+ logicalFiles[k]->fillILEDefn(&fileDefnSpace[k+1], false);
+ }
+ }
+
+ ValidatedPointer<FILE_HANDLE> fileDefnHandles(sizeof(FILE_HANDLE) * fileObjects);
+ size_t formatSpaceLen = sizeof(format_hdr_t) + mysqlTable->fields * sizeof(DB2Field);
+ formatSpace.alloc(formatSpaceLen);
+
+ int rc = db2i_ileBridge::getBridgeForThread()->
+ expectErrors(QMY_ERR_RTNFMT)->
+ allocateFileDefn(fileDefnSpace,
+ fileDefnHandles,
+ fileObjects,
+ db2LibNameEbcdic,
+ strlen(db2LibNameEbcdic),
+ formatSpace,
+ formatSpaceLen);
+
+ if (rc)
+ {
+ // We have to handle a format space error as a special case of a FID
+ // mismatch. We should only get the space error if columns have been added
+ // to the DB2 table without MySQL's knowledge, which is effectively a
+ // FID problem.
+ if (rc == QMY_ERR_RTNFMT)
+ {
+ rc = QMY_ERR_LVLID_MISMATCH;
+ getErrTxt(rc);
+ }
+ return rc;
+ }
+
+ convFromEbcdic(((format_hdr_t*)formatSpace)->FilLvlId, fileLevelID, sizeof(fileLevelID));
+
+ if (!doFileIDsMatch(path))
+ {
+ getErrTxt(QMY_ERR_LVLID_MISMATCH);
+ return QMY_ERR_LVLID_MISMATCH;
+ }
+
+ physicalFile->setMasterDefnHandle(fileDefnHandles[0]);
+ for (int k = 0; k < mysqlTable->keys; k++)
+ {
+ logicalFiles[k]->setMasterDefnHandle(fileDefnHandles[k+1]);
+ }
+
+ db2StartId = (uint64)(((format_hdr_t*)formatSpace)->StartIdVal);
+ db2Fields = (DB2Field*)((char*)(void*)formatSpace + ((format_hdr_t*)formatSpace)->ColDefOff);
+
+ uint fields = mysqlTable->fields;
+ for (int i = 0; i < fields; ++i)
+ {
+ if (db2Field(i).isBlob())
+ {
+ blobFieldCount++;
+ }
+ }
+
+ if (blobFieldCount)
+ {
+ blobFieldActualSizes = (uint*)my_multi_malloc(MYF(MY_WME | MY_ZEROFILL),
+ &blobFieldActualSizes, blobFieldCount * sizeof(uint),
+ &blobFields, blobFieldCount * sizeof(uint16),
+ NullS);
+
+ int b = 0;
+ for (int i = 0; i < fields; ++i)
+ {
+ if (db2Field(i).isBlob())
+ {
+ blobFields[b++] = i;
+ }
+ }
+ }
+
+ my_multi_malloc(MYF(MY_WME),
+ &conversionDefinitions[toMySQL], fields * sizeof(iconv_t),
+ &conversionDefinitions[toDB2], fields * sizeof(iconv_t),
+ NullS);
+ for (int i = 0; i < fields; ++i)
+ {
+ conversionDefinitions[toMySQL][i] = (iconv_t)(-1);
+ conversionDefinitions[toDB2][i] = (iconv_t)(-1);
+ }
+
+ return 0;
+}
+
+int db2i_table::fastInitForCreate(const char* path)
+{
+ ValidatedPointer<ShrDef> fileDefnSpace(sizeof(ShrDef));
+
+ physicalFile = new db2i_file(this);
+ physicalFile->fillILEDefn(fileDefnSpace, true);
+
+ ValidatedPointer<FILE_HANDLE> fileDefnHandles(sizeof(FILE_HANDLE));
+
+ size_t formatSpaceLen = sizeof(format_hdr_t) +
+ mysqlTable->fields * sizeof(DB2Field);
+ formatSpace.alloc(formatSpaceLen);
+
+ int rc = db2i_ileBridge::getBridgeForThread()->allocateFileDefn(fileDefnSpace,
+ fileDefnHandles,
+ 1,
+ db2LibNameEbcdic,
+ strlen(db2LibNameEbcdic),
+ formatSpace,
+ formatSpaceLen);
+
+ if (rc)
+ return rc;
+
+ convFromEbcdic(((format_hdr_t*)formatSpace)->FilLvlId, fileLevelID, sizeof(fileLevelID));
+ doFileIDsMatch(path);
+
+ return 0;
+}
+
+bool db2i_table::doFileIDsMatch(const char* path)
+{
+ char name_buff[FN_REFLEN];
+
+ fn_format(name_buff, path, "", FID_EXT, (MY_REPLACE_EXT | MY_UNPACK_FILENAME));
+
+ File fd = my_open(name_buff, O_RDONLY, MYF(0));
+
+ if (fd == -1)
+ {
+ if (errno == ENOENT)
+ {
+ fd = my_create(name_buff, 0, O_WRONLY, MYF(MY_WME));
+
+ if (fd == -1)
+ {
+ // TODO: Report errno here
+ return false;
+ }
+ my_write(fd, (uchar*)fileLevelID, sizeof(fileLevelID), MYF(MY_WME));
+ my_close(fd, MYF(0));
+ return true;
+ }
+ else
+ {
+ // TODO: Report errno here
+ return false;
+ }
+ }
+
+ char diskFID[sizeof(fileLevelID)];
+
+ bool match = false;
+
+ if (my_read(fd, (uchar*)diskFID, sizeof(diskFID), MYF(MY_WME)) == sizeof(diskFID) &&
+ (memcmp(diskFID, fileLevelID, sizeof(diskFID)) == 0))
+ match = true;
+
+ my_close(fd, MYF(0));
+
+ return match;
+}
+
+void db2i_table::deleteAssocFiles(const char* name)
+{
+ char name_buff[FN_REFLEN];
+ fn_format(name_buff, name, "", FID_EXT, (MY_REPLACE_EXT | MY_UNPACK_FILENAME));
+ my_delete(name_buff, MYF(0));
+}
+
+void db2i_table::renameAssocFiles(const char* from, const char* to)
+{
+ rename_file_ext(from, to, FID_EXT);
+}
+
+
+db2i_table::~db2i_table()
+{
+ if (blobFieldActualSizes)
+ my_free(blobFieldActualSizes, MYF(0));
+
+ if (conversionDefinitions[toMySQL])
+ my_free(conversionDefinitions[toMySQL], MYF(0));
+
+ if (logicalFiles)
+ {
+ for (int k = 0; k < logicalFileCount; ++k)
+ {
+ delete logicalFiles[k];
+ }
+
+ delete[] logicalFiles;
+ }
+ delete physicalFile;
+
+ my_free(db2LibNameEbcdic, 0);
+}
+
+void db2i_table::getDB2QualifiedName(char* to)
+{
+ strcat(to, getDB2LibName(ASCII_SQL));
+ strcat(to, ".");
+ strcat(to, getDB2TableName(ASCII_SQL));
+}
+
+
+void db2i_table::getDB2QualifiedNameFromPath(const char* path, char* to)
+{
+ getDB2LibNameFromPath(path, to);
+ strcat(to, ".");
+ getDB2FileNameFromPath(path, strend(to));
+}
+
+
+size_t db2i_table::smartFilenameToTableName(const char *in, char* out, size_t outlen)
+{
+ if (strchr(in, '@') == NULL)
+ {
+ return filename_to_tablename(in, out, outlen);
+ }
+
+ char* test = (char*) my_malloc(outlen, MYF(MY_WME));
+
+ filename_to_tablename(in, test, outlen);
+
+ char* cur = test;
+
+ while (*cur)
+ {
+ if ((*cur <= 0x20) || (*cur >= 0x80))
+ {
+ strncpy(out, in, outlen);
+ my_free(test, MYF(0));
+ return min(outlen, strlen(out));
+ }
+ ++cur;
+ }
+
+ strncpy(out, test, outlen);
+ my_free(test, MYF(0));
+ return min(outlen, strlen(out));
+}
+
+void db2i_table::filenameToTablename(const char* in, char* out, size_t outlen)
+{
+ if (strchr(in, '#') == NULL)
+ {
+ smartFilenameToTableName(in, out, outlen);
+ return;
+ }
+
+ char* temp = (char*)sql_alloc(outlen);
+
+ const char* part1, *part2, *part3, *part4;
+ part1 = in;
+ part2 = strstr(part1, "#P#");
+ if (part2);
+ {
+ part3 = part2 + 3;
+ part4 = strchr(part3, '#');
+ if (!part4)
+ part4 = strend(in);
+ }
+
+ memcpy(temp, part1, min(outlen, part2 - part1));
+ temp[min(outlen-1, part2-part1)] = 0;
+
+ int32 accumLen = smartFilenameToTableName(temp, out, outlen);
+
+ if (part2 && (accumLen + 4 < outlen))
+ {
+ strcat(out, "#P#");
+ accumLen += 4;
+
+ memset(temp, 0, min(outlen, part2-part1));
+ memcpy(temp, part3, min(outlen, part4-part3));
+ temp[min(outlen-1, part4-part3)] = 0;
+
+ accumLen += smartFilenameToTableName(temp, strend(out), outlen-accumLen);
+
+ if (part4 && (accumLen + (strend(in) - part4 + 1) < outlen))
+ {
+ strcat(out, part4);
+ }
+ }
+}
+
+void db2i_table::getDB2LibNameFromPath(const char* path, char* lib, NameFormatFlags format)
+{
+ if (strstr(path, mysql_tmpdir) == path)
+ {
+ strcpy(lib, DB2I_TEMP_TABLE_SCHEMA);
+ }
+ else
+ {
+ const char* c = strend(path) - 1;
+ while (c > path && *c != '\\' && *c != '/')
+ --c;
+
+ if (c != path)
+ {
+ const char* dbEnd = c;
+ do {
+ --c;
+ } while (c >= path && *c != '\\' && *c != '/');
+
+ if (c >= path)
+ {
+ const char* dbStart = c+1;
+ char fileName[FN_REFLEN];
+ memcpy(fileName, dbStart, dbEnd - dbStart);
+ fileName[dbEnd-dbStart] = 0;
+
+ char dbName[MAX_DB2_SCHEMANAME_LENGTH+1];
+ filenameToTablename(fileName, dbName , sizeof(dbName));
+
+ convertMySQLNameToDB2Name(dbName, lib, sizeof(dbName), true, (format==ASCII_SQL) );
+ }
+ else
+ DBUG_ASSERT(0); // This should never happen!
+ }
+ }
+}
+
+void db2i_table::getDB2FileNameFromPath(const char* path, char* file, NameFormatFlags format)
+{
+ const char* fileEnd = strend(path);
+ const char* c = fileEnd;
+ while (c > path && *c != '\\' && *c != '/')
+ --c;
+
+ if (c != path)
+ {
+ const char* fileStart = c+1;
+ char fileName[FN_REFLEN];
+ memcpy(fileName, fileStart, fileEnd - fileStart);
+ fileName[fileEnd - fileStart] = 0;
+ char db2Name[MAX_DB2_FILENAME_LENGTH+1];
+ filenameToTablename(fileName, db2Name, sizeof(db2Name));
+ convertMySQLNameToDB2Name(db2Name, file, sizeof(db2Name), true, (format==ASCII_SQL) );
+ }
+}
+
+// Generates the DB2 index name when given the MySQL index and table names.
+int32 db2i_table::appendQualifiedIndexFileName(const char* indexName,
+ const char* tableName,
+ String& to,
+ NameFormatFlags format,
+ enum_DB2I_INDEX_TYPE type)
+{
+ char generatedName[MAX_DB2_FILENAME_LENGTH+1];
+ strncpy(generatedName, indexName, DB2I_INDEX_NAME_LENGTH_TO_PRESERVE);
+ generatedName[DB2I_INDEX_NAME_LENGTH_TO_PRESERVE] = 0;
+ char* endOfGeneratedName;
+
+ if (type == typeDefault)
+ {
+ strcat(generatedName, DB2I_DEFAULT_INDEX_NAME_DELIMITER);
+ endOfGeneratedName = strend(generatedName);
+ }
+ else if (type != typeNone)
+ {
+ strcat(generatedName, DB2I_ADDL_INDEX_NAME_DELIMITER);
+ endOfGeneratedName = strend(generatedName);
+ *(endOfGeneratedName-2) = char(type);
+ }
+
+ uint lenWithoutFile = endOfGeneratedName - generatedName;
+
+ char strippedTableName[MAX_DB2_FILENAME_LENGTH+1];
+ if (format == ASCII_SQL)
+ {
+ strcpy(strippedTableName, tableName);
+ stripExtraQuotes(strippedTableName+1, sizeof(strippedTableName));
+ tableName = strippedTableName;
+ }
+
+ if (strlen(tableName) > (MAX_DB2_FILENAME_LENGTH-lenWithoutFile))
+ return -1;
+
+ strncat(generatedName,
+ tableName+1,
+ min(strlen(tableName), (MAX_DB2_FILENAME_LENGTH-lenWithoutFile))-2 );
+
+ char finalName[MAX_DB2_FILENAME_LENGTH+1];
+ convertMySQLNameToDB2Name(generatedName, finalName, sizeof(finalName), true, (format==ASCII_SQL));
+ to.append(finalName);
+
+ return 0;
+}
+
+
+void db2i_table::findConversionDefinition(enum_conversionDirection direction, uint16 fieldID)
+{
+ getConversion(direction,
+ mysqlTable->field[fieldID]->charset(),
+ db2Field(fieldID).getCCSID(),
+ conversionDefinitions[direction][fieldID]);
+}
+
+
+db2i_file::db2i_file(db2i_table* table) : db2Table(table)
+{
+ commonCtorInit();
+
+ DBUG_ASSERT(table->getMySQLTable()->table_name.length <= MAX_DB2_FILENAME_LENGTH-2);
+
+ db2FileName = (char*)table->getDB2TableName(db2i_table::EBCDIC_NATIVE);
+}
+
+db2i_file::db2i_file(db2i_table* table, int index) : db2Table(table)
+{
+ commonCtorInit();
+
+ if ((index == table->getMySQLTable()->primary_key) && !table->isTemporary())
+ {
+ db2FileName = (char*)table->getDB2TableName(db2i_table::EBCDIC_NATIVE);
+ }
+ else
+ {
+ // Generate the index name (in index___table form); quote and EBCDICize it.
+ String qualifiedPath;
+ qualifiedPath.length(0);
+
+ const char* asciiFileName = table->getDB2TableName(db2i_table::ASCII_NATIVE);
+
+ db2i_table::appendQualifiedIndexFileName(table->getMySQLTable()->key_info[index].name,
+ asciiFileName,
+ qualifiedPath,
+ db2i_table::ASCII_NATIVE,
+ typeDefault);
+
+ db2FileName = (char*)my_malloc(qualifiedPath.length()+1, MYF(MY_WME | MY_ZEROFILL));
+ convToEbcdic(qualifiedPath.ptr(), db2FileName, qualifiedPath.length());
+ }
+}
+
+void db2i_file::commonCtorInit()
+{
+ masterDefn = 0;
+ memset(&formats, 0, maxRowFormats*sizeof(RowFormat));
+}
+
+
+void db2i_file::fillILEDefn(ShrDef* defn, bool readInArrivalSeq)
+{
+ defn->ObjNamLen = strlen(db2FileName);
+ DBUG_ASSERT(defn->ObjNamLen <= sizeof(defn->ObjNam));
+ memcpy(defn->ObjNam, db2FileName, defn->ObjNamLen);
+ defn->ArrSeq[0] = (readInArrivalSeq ? QMY_YES : QMY_NO);
+}
+
diff --git a/storage/ibmdb2i/db2i_file.h b/storage/ibmdb2i/db2i_file.h
new file mode 100644
index 00000000000..ff35a473b05
--- /dev/null
+++ b/storage/ibmdb2i/db2i_file.h
@@ -0,0 +1,446 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+
+#ifndef DB2I_FILE_H
+#define DB2I_FILE_H
+
+#include "db2i_global.h"
+#include "db2i_ileBridge.h"
+#include "db2i_validatedPointer.h"
+#include "my_atomic.h"
+#include "db2i_iconv.h"
+#include "db2i_charsetSupport.h"
+
+const char FID_EXT[] = ".FID";
+
+class db2i_file;
+
+#pragma pack(1)
+struct DB2LobField
+{
+ char reserved1;
+ uint32 length;
+ char reserved2[4];
+ uint32 ordinal;
+ ILEMemHandle dataHandle;
+ char reserved3[8];
+};
+#pragma pack(pop)
+
+class DB2Field
+{
+ public:
+ uint16 getType() const { return *(uint16*)(&definition.ColType); }
+ uint16 getByteLengthInRecord() const { return definition.ColLen; }
+ uint16 getDataLengthInRecord() const
+ {
+ return (getType() == QMY_VARCHAR || getType() == QMY_VARGRAPHIC ? definition.ColLen - 2 : definition.ColLen);
+ }
+ uint16 getCCSID() const { return *(uint16*)(&definition.ColCCSID); }
+ bool isBlob() const
+ {
+ uint16 type = getType();
+ return (type == QMY_BLOBCLOB || type == QMY_DBCLOB);
+ }
+ uint16 getBufferOffset() const { return definition.ColBufOff; }
+ uint16 calcBlobPad() const
+ {
+ DBUG_ASSERT(isBlob());
+ return getByteLengthInRecord() - sizeof (DB2LobField);
+ }
+ DB2LobField* asBlobField(char* buf) const
+ {
+ DBUG_ASSERT(isBlob());
+ return (DB2LobField*)(buf + getBufferOffset() + calcBlobPad());
+ }
+ private:
+ col_def_t definition;
+};
+
+
+/**
+ @class db2i_table
+
+ @details
+ This class describes the logical SQL table provided by DB2.
+ It stores "table-scoped" information such as the name of the
+ DB2 schema, BLOB descriptions, and the corresponding MySQL table definition.
+ Only one instance exists per SQL table.
+*/
+class db2i_table
+{
+ public:
+ enum NameFormatFlags
+ {
+ ASCII_SQL,
+ ASCII_NATIVE,
+ EBCDIC_NATIVE
+ };
+
+ db2i_table(const TABLE_SHARE* myTable, const char* path = NULL);
+
+ ~db2i_table();
+
+ int32 initDB2Objects(const char* path);
+
+ const TABLE_SHARE* getMySQLTable() const
+ {
+ return mysqlTable;
+ }
+
+ uint64 getStartId() const
+ {
+ return db2StartId;
+ }
+
+ void updateStartId(uint64 newStartId)
+ {
+ db2StartId = newStartId;
+ }
+
+ bool hasBlobs() const
+ {
+ return (blobFieldCount > 0);
+ }
+
+ uint16 getBlobCount() const
+ {
+ return blobFieldCount;
+ }
+
+ uint getBlobFieldActualSize(uint fieldIndex) const
+ {
+ return blobFieldActualSizes[getBlobIdFromField(fieldIndex)];
+ }
+
+ void updateBlobFieldActualSize(uint fieldIndex, uint32 newSize)
+ {
+ // It's OK that this isn't threadsafe, since this is just an advisory
+ // value. If a race condition causes the lesser of two values to be stored,
+ // that's OK.
+ uint16 blobID = getBlobIdFromField(fieldIndex);
+ DBUG_ASSERT(blobID < blobFieldCount);
+
+ if (blobFieldActualSizes[blobID] < newSize)
+ {
+ blobFieldActualSizes[blobID] = newSize;
+ }
+ }
+
+
+
+ const char* getDB2LibName(NameFormatFlags format = EBCDIC_NATIVE)
+ {
+ switch (format)
+ {
+ case EBCDIC_NATIVE:
+ return db2LibNameEbcdic; break;
+ case ASCII_NATIVE:
+ return db2LibNameAscii; break;
+ case ASCII_SQL:
+ return db2LibNameSQLAscii; break;
+ default:
+ DBUG_ASSERT(0);
+ }
+ return NULL;
+ }
+
+ const char* getDB2TableName(NameFormatFlags format = EBCDIC_NATIVE) const
+ {
+ switch (format)
+ {
+ case EBCDIC_NATIVE:
+ return db2TableNameEbcdic; break;
+ case ASCII_NATIVE:
+ return db2TableNameAscii; break;
+ case ASCII_SQL:
+ return db2TableNameAscii; break;
+ break;
+ default:
+ DBUG_ASSERT(0);
+ }
+ return NULL;
+ }
+
+ DB2Field& db2Field(int fieldID) const { return db2Fields[fieldID]; }
+ DB2Field& db2Field(const Field* field) const { return db2Field(field->field_index); }
+
+ void processFormatSpace();
+
+ void* getFormatSpace(size_t& spaceNeeded)
+ {
+ DBUG_ASSERT(formatSpace == NULL);
+ spaceNeeded = sizeof(format_hdr_t) + mysqlTable->fields * sizeof(DB2Field);
+ formatSpace.alloc(spaceNeeded);
+ return (void*)formatSpace;
+ }
+
+ bool isTemporary() const
+ {
+ return isTemporaryTable;
+ }
+
+ void getDB2QualifiedName(char* to);
+ static void getDB2LibNameFromPath(const char* path, char* lib, NameFormatFlags format=ASCII_SQL);
+ static void getDB2FileNameFromPath(const char* path, char* file, NameFormatFlags format=ASCII_SQL);
+ static void getDB2QualifiedNameFromPath(const char* path, char* to);
+ static int32 appendQualifiedIndexFileName(const char* indexName,
+ const char* tableName,
+ String& to,
+ NameFormatFlags format=ASCII_SQL,
+ enum_DB2I_INDEX_TYPE type=typeDefault);
+
+ uint16 getBlobIdFromField(uint16 fieldID) const
+ {
+ for (int i = 0; i < blobFieldCount; ++i)
+ {
+ if (blobFields[i] == fieldID)
+ return i;
+ }
+ DBUG_ASSERT(0);
+ return 0;
+ }
+
+ iconv_t& getConversionDefinition(enum_conversionDirection direction,
+ uint16 fieldID)
+ {
+ if (conversionDefinitions[direction][fieldID] == (iconv_t)(-1))
+ findConversionDefinition(direction, fieldID);
+
+ return conversionDefinitions[direction][fieldID];
+ }
+
+ const db2i_file* dataFile() const
+ {
+ return physicalFile;
+ }
+
+ const db2i_file* indexFile(uint idx) const
+ {
+ return logicalFiles[idx];
+ }
+
+ const char* getFileLevelID() const
+ {
+ return fileLevelID;
+ }
+
+ static void deleteAssocFiles(const char* name);
+ static void renameAssocFiles(const char* from, const char* to);
+
+ int fastInitForCreate(const char* path);
+ int initDiscoveredTable(const char* path);
+
+ uint16* blobFields;
+
+private:
+
+ void findConversionDefinition(enum_conversionDirection direction, uint16 fieldID);
+ static void filenameToTablename(const char* in, char* out, size_t outlen);
+ static size_t smartFilenameToTableName(const char *in, char* out, size_t outlen);
+ void convertNativeToSQLName(const char* input,
+ char* output)
+ {
+
+ output[0] = input[0];
+
+ uint o = 1;
+ uint i = 1;
+ do
+ {
+ output[o++] = input[i];
+ if (input[i] == '"' && input[i+1])
+ output[o++] = '"';
+ } while (input[++i]);
+
+ output[o] = 0; // This isn't the most user-friendly way to handle overflows,
+ // but at least its safe.
+ }
+
+ bool doFileIDsMatch(const char* path);
+
+ ValidatedPointer<format_hdr_t> formatSpace;
+ DB2Field* db2Fields;
+ uint64 db2StartId; // Starting value for identity column
+ uint16 blobFieldCount; // Count of LOB fields in the DB2 table
+ uint* blobFieldActualSizes; // Array of LOB field lengths (actual vs. allocated).
+ // This is updated as LOBs are read and will contain
+ // the length of the longest known LOB in that field.
+ iconv_t* conversionDefinitions[2];
+
+ const TABLE_SHARE* mysqlTable;
+ uint16 logicalFileCount;
+ char* db2LibNameEbcdic; // Quoted and in EBCDIC
+ char* db2LibNameAscii;
+ char* db2TableNameEbcdic;
+ char* db2TableNameAscii;
+ char* db2TableNameSQLAscii;
+ char* db2LibNameSQLAscii;
+
+ db2i_file* physicalFile;
+ db2i_file** logicalFiles;
+
+ bool isTemporaryTable;
+ char fileLevelID[13];
+};
+
+/**
+ @class db2i_file
+
+ @details This class describes a file object underlaying a particular SQL
+ table. Both "physical files" (data) and "logical files" (indices) are
+ described by this class. Only one instance of the class exists per DB2 file
+ object. The single instance is responsible for de/allocating the multiple
+ handles used by the handlers.
+*/
+class db2i_file
+{
+
+public:
+ struct RowFormat
+ {
+ uint16 readRowLen;
+ uint16 readRowNullOffset;
+ uint16 writeRowLen;
+ uint16 writeRowNullOffset;
+ char inited;
+ };
+
+public:
+
+ // Construct an instance for a physical file.
+ db2i_file(db2i_table* table);
+
+ // Construct an instance for a logical file.
+ db2i_file(db2i_table* table, int index);
+
+ ~db2i_file()
+ {
+ if (masterDefn)
+ db2i_ileBridge::getBridgeForThread()->deallocateFile(masterDefn);
+
+ if (db2FileName != (char*)db2Table->getDB2TableName(db2i_table::EBCDIC_NATIVE))
+ my_free(db2FileName, MYF(0));
+ }
+
+ // This is roughly equivalent to an "open". It tells ILE to allocate a descriptor
+ // for the file. The associated handle is returned to the caller.
+ int allocateNewInstance(FILE_HANDLE* newHandle, ILEMemHandle inuseSpace) const
+ {
+ int rc;
+
+ rc = db2i_ileBridge::getBridgeForThread()->allocateFileInstance(masterDefn,
+ inuseSpace,
+ newHandle);
+
+ if (rc) *newHandle = 0;
+
+ return rc;
+ }
+
+ // This obtains the row layout associated with a particular access intent for
+ // an open instance of the file.
+ int obtainRowFormat(FILE_HANDLE instanceHandle,
+ char intent,
+ char commitLevel,
+ const RowFormat** activeFormat) const
+ {
+ DBUG_ENTER("db2i_file::obtainRowFormat");
+ RowFormat* rowFormat;
+
+ if (intent == QMY_UPDATABLE)
+ rowFormat = &(formats[readWrite]);
+ else if (intent == QMY_READ_ONLY)
+ rowFormat = &(formats[readOnly]);
+
+ if (unlikely(!rowFormat->inited))
+ {
+ int rc = db2i_ileBridge::getBridgeForThread()->
+ initFileForIO(instanceHandle,
+ intent,
+ commitLevel,
+ &(rowFormat->writeRowLen),
+ &(rowFormat->writeRowNullOffset),
+ &(rowFormat->readRowLen),
+ &(rowFormat->readRowNullOffset));
+ if (rc) DBUG_RETURN(rc);
+ rowFormat->inited = 1;
+ }
+
+ *activeFormat = rowFormat;
+ DBUG_RETURN(0);
+ }
+
+ const char* getDB2FileName() const
+ {
+ return db2FileName;
+ }
+
+ void fillILEDefn(ShrDef* defn, bool readInArrivalSeq);
+
+ void setMasterDefnHandle(FILE_HANDLE handle)
+ {
+ masterDefn = handle;
+ }
+
+ FILE_HANDLE getMasterDefnHandle() const
+ {
+ return masterDefn;
+ }
+
+private:
+ enum RowFormats
+ {
+ readOnly = 0,
+ readWrite,
+ maxRowFormats
+ };
+
+ mutable RowFormat formats[maxRowFormats];
+
+ void commonCtorInit();
+
+ char* db2FileName; // Quoted and in EBCDIC
+
+ db2i_table* db2Table; // The logical SQL table contained by this file.
+
+ bool db2CanSort;
+
+ FILE_HANDLE masterDefn;
+};
+
+
+#endif
diff --git a/storage/ibmdb2i/db2i_global.h b/storage/ibmdb2i/db2i_global.h
new file mode 100644
index 00000000000..d201fbd8124
--- /dev/null
+++ b/storage/ibmdb2i/db2i_global.h
@@ -0,0 +1,138 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+
+#ifndef DB2I_GLOBAL_H
+#define DB2I_GLOBAL_H
+
+#define MYSQL_SERVER 1
+
+#include "my_global.h"
+#include "my_sys.h"
+
+const uint MAX_DB2_KEY_PARTS=120;
+const int MAX_DB2_V5R4_LIBNAME_LENGTH = 10;
+const int MAX_DB2_V6R1_LIBNAME_LENGTH = 30;
+const int MAX_DB2_SCHEMANAME_LENGTH=258;
+const int MAX_DB2_FILENAME_LENGTH=258;
+const int MAX_DB2_COLNAME_LENGTH=128;
+const int MAX_DB2_SAVEPOINTNAME_LENGTH=128;
+const int MAX_DB2_QUALIFIEDNAME_LENGTH=MAX_DB2_V6R1_LIBNAME_LENGTH + 1 + MAX_DB2_FILENAME_LENGTH;
+const uint32 MAX_CHAR_LENGTH = 32765;
+const uint32 MAX_VARCHAR_LENGTH = 32739;
+const uint32 MAX_DEC_PRECISION = 63;
+const uint32 MAX_BLOB_LENGTH = 2147483646;
+const uint32 MAX_BINARY_LENGTH = MAX_CHAR_LENGTH;
+const uint32 MAX_VARBINARY_LENGTH = MAX_VARCHAR_LENGTH;
+const uint32 MAX_FULL_ALLOCATE_BLOB_LENGTH = 65536;
+const uint32 MAX_FOREIGN_LEN = 64000;
+const char* DB2I_TEMP_TABLE_SCHEMA = "QTEMP";
+const char DB2I_ADDL_INDEX_NAME_DELIMITER[5] = {'_','_','_','_','_'};
+const char DB2I_DEFAULT_INDEX_NAME_DELIMITER[3] = {'_','_','_'};
+const int DB2I_INDEX_NAME_LENGTH_TO_PRESERVE = 110;
+
+enum enum_DB2I_INDEX_TYPE
+{
+ typeNone = 0,
+ typeDefault = 'D',
+ typeHex = 'H',
+ typeAscii = 'A'
+};
+
+void* roundToQuadWordBdy(void* ptr)
+{
+ return (void*)(((uint64)(ptr)+0xf) & ~0xf);
+}
+
+typedef uint64_t ILEMemHandle;
+
+struct OSVersion
+{
+ uint8 v;
+ uint8 r;
+};
+extern OSVersion osVersion;
+
+
+/**
+ Allocate 16-byte aligned space using the MySQL heap allocator
+
+ @details Many of the spaces used by the QMY_* APIS are required to be
+ aligned on 16 byte boundaries. The standard system malloc will do this
+ alignment by default. However, in order to use the heap debug and tracking
+ features of the mysql allocator, we chose to implement an aligning wrapper
+ around my_malloc. Essentially, we overallocate the storage space, find the
+ first aligned address in the space, store a pointer to the true malloc
+ allocation in the bytes immediately preceding the aligned address, and return
+ the aligned address to the caller.
+
+ @parm size The size of heap storage needed
+
+ @return A 16-byte aligned pointer to the storage requested.
+*/
+void* malloc_aligned(size_t size)
+{
+ char* p;
+ char* base;
+ base = (char*)my_malloc(size + sizeof(void*) + 15, MYF(MY_WME));
+ if (likely(base))
+ {
+ p = (char*)roundToQuadWordBdy(base + sizeof(void*));
+ char** p2 = (char**)(p - sizeof(void*));
+ *p2 = base;
+ }
+ else
+ p = NULL;
+
+ return p;
+}
+
+/**
+ Free a 16-byte aligned space alloced by malloc_aligned
+
+ @details We know that a pointer to the true malloced storage immediately
+ precedes the aligned address, so we pull that out and call my_free().
+
+ @parm p A 16-byte aligned pointer generated by malloc_aligned
+*/
+void free_aligned(void* p)
+{
+ if (likely(p))
+ {
+ my_free(*(char**)((char*)p-sizeof(void*)), MYF(0));
+ }
+}
+
+#endif
diff --git a/storage/ibmdb2i/db2i_iconv.h b/storage/ibmdb2i/db2i_iconv.h
new file mode 100644
index 00000000000..9fc6e4ed636
--- /dev/null
+++ b/storage/ibmdb2i/db2i_iconv.h
@@ -0,0 +1,51 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+/**
+ @file
+
+ @brief Used to redefine iconv symbols to the optimized "myconv" ones
+*/
+
+#ifndef DB2I_ICONV_H
+#define DB2I_ICONV_H
+
+#include "db2i_myconv.h"
+#define iconv_open(A, B) myconv_open(A, B, CONVERTER_DMAP)
+#define iconv_close myconv_close
+#define iconv myconv_dmap
+#define iconv_t myconv_t
+
+#endif
diff --git a/storage/ibmdb2i/db2i_ileBridge.cc b/storage/ibmdb2i/db2i_ileBridge.cc
new file mode 100644
index 00000000000..68ae2c2bb72
--- /dev/null
+++ b/storage/ibmdb2i/db2i_ileBridge.cc
@@ -0,0 +1,1342 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+
+
+#include "db2i_ileBridge.h"
+#include "my_dbug.h"
+#include "db2i_global.h"
+#include "db2i_charsetSupport.h"
+#include "db2i_errors.h"
+
+
+// static class member data
+ILEpointer* db2i_ileBridge::functionSymbols;
+db2i_ileBridge* db2i_ileBridge::globalBridge;
+#ifndef DBUG_OFF
+uint32 db2i_ileBridge::registeredPtrs;
+#endif
+
+pthread_key(IleParms*, THR_ILEPARMS);
+
+static void ileParmsDtor(void* parmsToFree)
+{
+ if (parmsToFree)
+ {
+ free_aligned(parmsToFree);
+ DBUG_PRINT("db2i_ileBridge", ("Freeing space for parms"));
+ }
+}
+
+
+/**
+ Convert a timestamp in ILE time format into a unix time_t
+*/
+static inline time_t convertILEtime(const ILE_time_t& input)
+{
+ tm temp;
+
+ temp.tm_sec = input.Second;
+ temp.tm_min = input.Minute;
+ temp.tm_hour = input.Hour;
+ temp.tm_mday = input.Day;
+ temp.tm_mon = input.Month-1;
+ temp.tm_year = input.Year - 1900;
+ temp.tm_isdst = -1;
+
+ return mktime(&temp);
+}
+
+/**
+ Allocate and intialize a new bridge structure
+*/
+db2i_ileBridge* db2i_ileBridge::createNewBridge(CONNECTION_HANDLE connID)
+{
+ DBUG_PRINT("db2i_ileBridge::createNewBridge",("Building new bridge..."));
+ db2i_ileBridge* newBridge = (db2i_ileBridge*)my_malloc(sizeof(db2i_ileBridge), MYF(MY_WME));
+
+ if (unlikely(newBridge == NULL))
+ return NULL;
+
+ newBridge->stmtTxActive = false;
+ newBridge->connErrText = NULL;
+ newBridge->pendingLockedHandles.head = NULL;
+ newBridge->cachedConnectionID = connID;
+
+ return newBridge;
+}
+
+
+void db2i_ileBridge::destroyBridge(db2i_ileBridge* bridge)
+{
+ bridge->freeErrorStorage();
+ my_free(bridge, MYF(0));
+}
+
+
+void db2i_ileBridge::destroyBridgeForThread(const THD* thd)
+{
+ void* thdData = *thd_ha_data(thd, ibmdb2i_hton);
+ if (thdData != NULL)
+ {
+ destroyBridge((db2i_ileBridge*)thdData);
+ }
+}
+
+
+void db2i_ileBridge::registerPtr(const void* ptr, ILEMemHandle* receiver)
+{
+ static const arg_type_t ileSignature[] = { ARG_MEMPTR, ARG_END };
+
+ if (unlikely(ptr == NULL))
+ {
+ *receiver = 0;
+ return;
+ }
+
+ struct ArgList
+ {
+ ILEarglist_base base;
+ ILEpointer ptr;
+ } *arguments;
+
+ char argBuf[sizeof(ArgList)+15];
+ arguments = (ArgList*)roundToQuadWordBdy(argBuf);
+
+ arguments->ptr.s.addr = (address64_t)(ptr);
+
+ _ILECALL(&functionSymbols[funcRegisterSpace],
+ &arguments->base,
+ ileSignature,
+ RESULT_INT64);
+
+#ifndef DBUG_OFF
+ uint32 truncHandle = arguments->base.result.r_uint64;
+ DBUG_PRINT("db2i_ileBridge::registerPtr",("Register 0x%p with handle %d", ptr, truncHandle));
+ getBridgeForThread()->registeredPtrs++;
+#endif
+
+ *receiver = arguments->base.result.r_uint64;
+ return;
+}
+
+void db2i_ileBridge::unregisterPtr(ILEMemHandle handle)
+{
+ static const arg_type_t ileSignature[] = { ARG_UINT64, ARG_END };
+
+ if (unlikely(handle == NULL))
+ return;
+
+ struct ArgList
+ {
+ ILEarglist_base base;
+ uint64 handle;
+ } *arguments;
+
+ char argBuf[sizeof(ArgList)+15];
+ arguments = (ArgList*)roundToQuadWordBdy(argBuf);
+
+ arguments->handle = (uint64)(handle);
+
+ _ILECALL(&functionSymbols[funcUnregisterSpace],
+ &arguments->base,
+ ileSignature,
+ RESULT_VOID);
+
+#ifndef DBUG_OFF
+ DBUG_PRINT("db2i_ileBridge::unregisterPtr",("Unregister handle %d", (uint32)handle));
+ getBridgeForThread()->registeredPtrs--;
+#endif
+}
+
+
+
+/**
+ Initialize the bridge component
+
+ @details Resolves srvpgm and function names of the APIs. If this fails,
+ the approrpiate operating system support (PTFs) is probably not installed.
+
+ WARNING:
+ Must be called before any other functions in this class are used!!!!
+ Can only be called by a single thread!
+*/
+int db2i_ileBridge::setup()
+{
+ static const char funcNames[db2i_ileBridge::funcListEnd][32] =
+ {
+ {"QmyRegisterParameterSpaces"},
+ {"QmyRegisterSpace"},
+ {"QmyUnregisterSpace"},
+ {"QmyProcessRequest"}
+ };
+
+ DBUG_ENTER("db2i_ileBridge::setup");
+
+ int actmark = _ILELOAD("QSYS/QMYSE", ILELOAD_LIBOBJ);
+ if ( actmark == -1 )
+ {
+ DBUG_PRINT("db2i_ileBridge::setup", ("srvpgm activation failed"));
+ DBUG_RETURN(1);
+ }
+
+ functionSymbols = (ILEpointer*)malloc_aligned(sizeof(ILEpointer) * db2i_ileBridge::funcListEnd);
+
+ for (int i = 0; i < db2i_ileBridge::funcListEnd; i++)
+ {
+ if (_ILESYM(&functionSymbols[i], actmark, funcNames[i]) == -1)
+ {
+ DBUG_PRINT("db2i_ileBridge::setup",
+ ("resolve of %s failed", funcNames[i]));
+ DBUG_RETURN(errno);
+ }
+ }
+
+ pthread_key_create(&THR_ILEPARMS, &ileParmsDtor);
+
+#ifndef DBUG_OFF
+ registeredPtrs = 0;
+#endif
+
+ globalBridge = createNewBridge(0);
+
+ DBUG_RETURN(0);
+}
+
+/**
+ Cleanup any resources before shutting down plug-in
+*/
+void db2i_ileBridge::takedown()
+{
+ if (globalBridge)
+ destroyBridge(globalBridge);
+ free_aligned(functionSymbols);
+}
+
+/**
+ Call off to QmyProcessRequest to perform the API that the caller prepared
+*/
+inline int32 db2i_ileBridge::doIt()
+{
+ static const arg_type_t ileSignature[] = {ARG_END};
+
+ struct ArgList
+ {
+ ILEarglist_base base;
+ } *arguments;
+
+ char argBuf[sizeof(ArgList)+15];
+ arguments = (ArgList*)roundToQuadWordBdy(argBuf);
+
+ _ILECALL(&functionSymbols[funcProcessRequest],
+ &arguments->base,
+ ileSignature,
+ RESULT_INT32);
+
+ return translateErrorCode(arguments->base.result.s_int32.r_int32);
+}
+
+/**
+ Call off to QmyProcessRequest to perform the API that the caller prepared and
+ log any errors that may occur.
+*/
+inline int32 db2i_ileBridge::doItWithLog()
+{
+ int32 rc = doIt();
+
+ if (unlikely(rc))
+ {
+ // Only report errors that we weren't expecting
+ if (rc != tacitErrors[0] &&
+ rc != tacitErrors[1] &&
+ rc != QMY_ERR_END_OF_BLOCK)
+ reportSystemAPIError(rc, (Qmy_Error_output_t*)parms()->outParms);
+ }
+ memset(tacitErrors, 0, sizeof(tacitErrors));
+
+ return rc;
+}
+
+
+/**
+ Interface to QMY_ALLOCATE_SHARE API
+
+ See QMY_ALLOCATE_SHARE documentation for more information about
+ parameters and return codes.
+*/
+int32 db2i_ileBridge::allocateFileDefn(ILEMemHandle definitionSpace,
+ ILEMemHandle handleSpace,
+ uint16 fileCount,
+ const char* schemaName,
+ uint16 schemaNameLength,
+ ILEMemHandle formatSpace,
+ uint32 formatSpaceLen)
+{
+ DBUG_ASSERT(cachedStateIsCoherent());
+
+ IleParms* parmBlock = parms();
+ Qmy_MAOS0100 *input = (Qmy_MAOS0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_ALLOCATE_SHARE;
+ input->ShrDefSpcHnd = definitionSpace;
+ input->ShrHndSpcHnd = handleSpace;
+ input->ShrDefCnt = fileCount;
+ input->FmtSpcHnd = formatSpace;
+ input->FmtSpcLen = formatSpaceLen;
+
+ if (schemaNameLength > sizeof(input->SchNam))
+ {
+ // This should never happen!
+ DBUG_ASSERT(0);
+ return HA_ERR_GENERIC;
+ }
+
+ memcpy(input->SchNam, schemaName, schemaNameLength);
+ input->SchNamLen = schemaNameLength;
+
+ input->CnnHnd = cachedConnectionID;
+
+ int32 rc = doItWithLog();
+
+ return rc;
+}
+
+
+/**
+ Interface to QMY_ALLOCATE_INSTANCE API
+
+ See QMY_ALLOCATE_INSTANCE documentation for more information about
+ parameters and return codes.
+*/
+int32 db2i_ileBridge::allocateFileInstance(FILE_HANDLE defnHandle,
+ ILEMemHandle inuseSpace,
+ FILE_HANDLE* instance)
+{
+ DBUG_ASSERT(cachedStateIsCoherent());
+
+ IleParms* parmBlock = parms();
+ Qmy_MAOI0100 *input = (Qmy_MAOI0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_ALLOCATE_INSTANCE;
+ input->ShrHnd = defnHandle;
+ input->CnnHnd = cachedConnectionID;
+ input->UseSpcHnd = inuseSpace;
+
+ int32 rc = doItWithLog();
+
+ if (likely(rc == 0))
+ {
+ Qmy_MAOI0100_output* output = (Qmy_MAOI0100_output*)parmBlock->outParms;
+ DBUG_ASSERT(instance);
+ *instance = output->ObjHnd;
+ }
+
+ return rc;
+}
+
+
+/**
+ Interface to QMY_DEALLOCATE_OBJECT API
+
+ See QMY_DEALLOCATE_OBJECT documentation for more information about
+ parameters and return codes.
+*/
+int32 db2i_ileBridge::deallocateFile(FILE_HANDLE rfileHandle,
+ bool postDropTable)
+{
+ IleParms* parmBlock = parms();
+ Qmy_MDLC0100 *input = (Qmy_MDLC0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_DEALLOCATE_OBJECT;
+ input->ObjHnd = rfileHandle;
+ input->ObjDrp[0] = (postDropTable ? QMY_YES : QMY_NO);
+
+ DBUG_PRINT("db2i_ileBridge::deallocateFile", ("Deallocating %d", (uint32)rfileHandle));
+
+ int32 rc = doItWithLog();
+
+ return rc;
+}
+
+
+/**
+ Interface to QMY_OBJECT_INITIALIZATION API
+
+ See QMY_OBJECT_INITIALIZATION documentation for more information about
+ parameters and return codes.
+*/
+int32 db2i_ileBridge::initFileForIO(FILE_HANDLE rfileHandle,
+ char accessIntent,
+ char commitLevel,
+ uint16* inRecSize,
+ uint16* inRecNullOffset,
+ uint16* outRecSize,
+ uint16* outRecNullOffset)
+{
+ DBUG_ASSERT(cachedStateIsCoherent());
+ IleParms* parmBlock = parms();
+ Qmy_MOIX0100 *input = (Qmy_MOIX0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_OBJECT_INITIALIZATION;
+ input->CmtLvl[0] = commitLevel;
+ input->Intent[0] = accessIntent;
+ input->ObjHnd = rfileHandle;
+ input->CnnHnd = cachedConnectionID;
+
+ int32 rc = doItWithLog();
+
+ if (likely(rc == 0))
+ {
+ Qmy_MOIX0100_output* output = (Qmy_MOIX0100_output*)parmBlock->outParms;
+ *inRecSize = output->InNxtRowOff;
+ *inRecNullOffset = output->InNullMapOff;
+ *outRecSize = output->OutNxtRowOff;
+ *outRecNullOffset = output->OutNullMapOff;
+ }
+
+ return rc;
+}
+
+
+/**
+ Interface to QMY_READ_ROWS API for reading a row with a specific RRN.
+
+ See QMY_READ_ROWS documentation for more information about
+ parameters and return codes.
+*/
+int32 db2i_ileBridge::readByRRN(FILE_HANDLE rfileHandle,
+ ILEMemHandle buf,
+ uint32 inRRN,
+ char accessIntent,
+ char commitLevel)
+{
+ DBUG_ASSERT(cachedStateIsCoherent());
+ IleParms* parmBlock = parms();
+ Qmy_MRDX0100 *input = (Qmy_MRDX0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_READ_ROWS;
+ input->CmtLvl[0] = commitLevel;
+ input->ObjHnd = rfileHandle;
+ input->Intent[0] = accessIntent;
+ input->OutSpcHnd = (uint64)buf;
+ input->RelRowNbr = inRRN;
+ input->CnnHnd = cachedConnectionID;
+
+ int32 rc = doItWithLog();
+
+ if (rc == QMY_ERR_END_OF_BLOCK)
+ {
+ rc = 0;
+ DBUG_PRINT("db2i_ileBridge::readByRRN", ("End of block signalled"));
+ }
+
+ return rc;
+}
+
+
+/**
+ Interface to QMY_WRITE_ROWS API.
+
+ See QMY_WRITE_ROWS documentation for more information about
+ parameters and return codes.
+*/
+int32 db2i_ileBridge::writeRows(FILE_HANDLE rfileHandle,
+ ILEMemHandle buf,
+ char commitLevel,
+ int64* outIdVal,
+ bool* outIdGen,
+ uint32* dupKeyRRN,
+ char** dupKeyName,
+ uint32* dupKeyNameLen,
+ uint32* outIdIncrement)
+{
+ DBUG_ASSERT(cachedStateIsCoherent());
+ IleParms* parmBlock = parms();
+ Qmy_MWRT0100 *input = (Qmy_MWRT0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_WRITE_ROWS;
+ input->CmtLvl[0] = commitLevel;
+
+ input->ObjHnd = rfileHandle;
+ input->InSpcHnd = (uint64_t) buf;
+ input->CnnHnd = cachedConnectionID;
+
+ int32 rc = doItWithLog();
+
+ Qmy_MWRT0100_output_t* output = (Qmy_MWRT0100_output_t*)parmBlock->outParms;
+ if (likely(rc == 0 || rc == HA_ERR_FOUND_DUPP_KEY))
+ {
+ DBUG_ASSERT(dupKeyRRN && dupKeyName && dupKeyNameLen && outIdGen && outIdIncrement && outIdVal);
+ *dupKeyRRN = output->DupRRN;
+ *dupKeyName = (char*)parmBlock->outParms + output->DupObjNamOff;
+ *dupKeyNameLen = output->DupObjNamLen;
+ *outIdGen = (output->NewIdGen[0] == QMY_YES ? TRUE : FALSE);
+ if (*outIdGen == TRUE)
+ {
+ *outIdIncrement = output->IdIncrement;
+ *outIdVal = output->NewIdVal;
+ }
+ }
+
+ return rc;
+
+}
+
+/**
+ Interface to QMY_EXECUTE_IMMEDIATE API.
+
+ See QMY_EXECUTE_IMMEDIATE documentation for more information about
+ parameters and return codes.
+*/
+uint32 db2i_ileBridge::execSQL(const char* statement,
+ uint32 statementCount,
+ uint8 commitLevel,
+ bool autoCreateSchema,
+ bool dropSchema,
+ bool noCommit,
+ FILE_HANDLE fileHandle)
+
+{
+ IleParms* parmBlock = parms();
+ Qmy_MSEI0100 *input = (Qmy_MSEI0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_EXECUTE_IMMEDIATE;
+
+ registerPtr(statement, &input->StmtsSpcHnd);
+
+ input->NbrStmts = statementCount;
+ *(uint16*)(&input->StmtCCSID) = 850;
+ input->AutoCrtSchema[0] = (autoCreateSchema == TRUE ? QMY_YES : QMY_NO);
+ input->DropSchema[0] = (dropSchema == TRUE ? QMY_YES : QMY_NO);
+ input->CmtLvl[0] = commitLevel;
+ if ((commitLevel == QMY_NONE && statementCount == 1) || noCommit)
+ {
+ input->CmtBefore[0] = QMY_NO;
+ input->CmtAfter[0] = QMY_NO;
+ }
+ else
+ {
+ input->CmtBefore[0] = QMY_YES;
+ input->CmtAfter[0] = QMY_YES;
+ }
+ input->CnnHnd = current_thd->thread_id;
+ input->ObjHnd = fileHandle;
+
+ int32 rc = doItWithLog();
+
+ unregisterPtr(input->StmtsSpcHnd);
+
+ return rc;
+}
+
+/**
+ Interface to QMY_PREPARE_OPEN_CURSOR API.
+
+ See QMY_PREPARE_OPEN_CURSOR documentation for more information about
+ parameters and return codes.
+*/
+int32 db2i_ileBridge::prepOpen(const char* statement,
+ FILE_HANDLE* rfileHandle,
+ uint32* recLength)
+{
+ IleParms* parmBlock = parms();
+ Qmy_MSPO0100 *input = (Qmy_MSPO0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_PREPARE_OPEN_CURSOR;
+
+ registerPtr(statement, &input->StmtsSpcHnd );
+ *(uint16*)(&input->StmtCCSID) = 850;
+ input->CnnHnd = current_thd->thread_id;
+
+ int32 rc = doItWithLog();
+
+ if (likely(rc == 0))
+ {
+ Qmy_MSPO0100_output* output = (Qmy_MSPO0100_output*)parmBlock->outParms;
+ *rfileHandle = output->ObjHnd;
+ *recLength = max(output->InNxtRowOff, output->OutNxtRowOff);
+ }
+
+
+ unregisterPtr(input->StmtsSpcHnd);
+
+ return rc;
+}
+
+
+/**
+ Interface to QMY_DELETE_ROW API.
+
+ See QMY_DELETE_ROW documentation for more information about
+ parameters and return codes.
+*/
+int32 db2i_ileBridge::deleteRow(FILE_HANDLE rfileHandle,
+ uint32 rrn)
+{
+ DBUG_ASSERT(cachedStateIsCoherent());
+ IleParms* parmBlock = parms();
+ Qmy_MDLT0100 *input = (Qmy_MDLT0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_DELETE_ROW;
+ input->ObjHnd = rfileHandle;
+ input->RelRowNbr = rrn;
+ input->CnnHnd = cachedConnectionID;
+
+ int32 rc = doItWithLog();
+
+ return rc;
+}
+
+
+/**
+ Interface to QMY_UPDATE_ROW API.
+
+ See QMY_UPDATE_ROW documentation for more information about
+ parameters and return codes.
+*/
+int32 db2i_ileBridge::updateRow(FILE_HANDLE rfileHandle,
+ uint32 rrn,
+ ILEMemHandle buf,
+ uint32* dupKeyRRN,
+ char** dupKeyName,
+ uint32* dupKeyNameLen)
+{
+ DBUG_ASSERT(cachedStateIsCoherent());
+ IleParms* parmBlock = parms();
+ Qmy_MUPD0100 *input = (Qmy_MUPD0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_UPDATE_ROW;
+ input->ObjHnd = rfileHandle;
+ input->InSpcHnd = (uint64)buf;
+ input->RelRowNbr = rrn;
+ input->CnnHnd = cachedConnectionID;
+
+ int32 rc = doItWithLog();
+
+ if (rc == HA_ERR_FOUND_DUPP_KEY)
+ {
+ Qmy_MUPD0100_output* output = (Qmy_MUPD0100_output*)parmBlock->outParms;
+ DBUG_ASSERT(dupKeyRRN && dupKeyName && dupKeyNameLen);
+ *dupKeyRRN = output->DupRRN;
+ *dupKeyName = (char*)parmBlock->outParms + output->DupObjNamOff;
+ *dupKeyNameLen = output->DupObjNamLen;
+ }
+
+ return rc;
+}
+
+/**
+ Interface to QMY_DESCRIBE_RANGE API.
+
+ See QMY_DESCRIBE_RANGE documentation for more information about
+ parameters and return codes.
+*/
+int32 db2i_ileBridge::recordsInRange(FILE_HANDLE defnHandle,
+ ILEMemHandle inSpc,
+ uint32 inKeyCnt,
+ uint32 inLiteralCnt,
+ uint32 inBoundsOff,
+ uint32 inLitDefOff,
+ uint32 inLiteralsOff,
+ uint32 inCutoff,
+ uint32 inSpcLen,
+ uint16 inEndByte,
+ uint64* outRecCnt,
+ uint16* outRtnCode)
+{
+ DBUG_ASSERT(cachedStateIsCoherent());
+
+ IleParms* parmBlock = parms();
+ Qmy_MDRG0100 *input = (Qmy_MDRG0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_DESCRIBE_RANGE;
+ input->ShrHnd = defnHandle;
+ input->SpcHnd = (uint64)inSpc;
+ input->KeyCnt = inKeyCnt;
+ input->LiteralCnt = inLiteralCnt;
+ input->BoundsOff = inBoundsOff;
+ input->LitDefOff = inLitDefOff;
+ input->LiteralsOff = inLiteralsOff;
+ input->Cutoff = inCutoff;
+ input->SpcLen = inSpcLen;
+ input->EndByte = inEndByte;
+ input->CnnHnd = cachedConnectionID;
+
+ int rc = doItWithLog();
+
+ if (likely(rc == 0))
+ {
+ Qmy_MDRG0100_output* output = (Qmy_MDRG0100_output*)parmBlock->outParms;
+ DBUG_ASSERT(outRecCnt && outRtnCode);
+ *outRecCnt = output->RecCnt;
+ *outRtnCode = output->RtnCode;
+ }
+
+ return rc;
+}
+
+
+/**
+ Interface to QMY_RELEASE_ROW API.
+
+ See QMY_RELEASE_ROW documentation for more information about
+ parameters and return codes.
+*/
+int32 db2i_ileBridge::rrlslck(FILE_HANDLE rfileHandle, char accessIntent)
+{
+ DBUG_ASSERT(cachedStateIsCoherent());
+
+ IleParms* parmBlock = parms();
+ Qmy_MRRX0100 *input = (Qmy_MRRX0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_RELEASE_ROW;
+
+ input->ObjHnd = rfileHandle;
+ input->CnnHnd = cachedConnectionID;
+ input->Intent[0] = accessIntent;
+
+ int32 rc = doItWithLog();
+
+ return rc;
+}
+
+/**
+ Interface to QMY_LOCK_OBJECT API.
+
+ See QMY_LOCK_OBJECT documentation for more information about
+ parameters and return codes.
+*/
+int32 db2i_ileBridge::lockObj(FILE_HANDLE defnHandle,
+ uint64 lockVal,
+ char lockAction,
+ char lockType,
+ char lockTimeout)
+{
+ DBUG_ASSERT(cachedStateIsCoherent());
+ IleParms* parmBlock = parms();
+ Qmy_MOLX0100 *input = (Qmy_MOLX0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_LOCK_OBJECT;
+ input->ShrHnd = defnHandle;
+ input->LckTimeoutVal = lockVal;
+ input->Action[0] = lockAction;
+ input->LckTyp[0] = lockType;
+ input->LckTimeout[0] = lockTimeout;
+ input->CnnHnd = cachedConnectionID;
+
+ int32 rc = doItWithLog();
+
+ return rc;
+}
+
+/**
+ Interface to QMY_DESCRIBE_CONSTRAINTS API.
+
+ See QMY_DESCRIBE_CONSTRAINTS documentation for more information about
+ parameters and return codes.
+*/
+int32 db2i_ileBridge::constraints(FILE_HANDLE defnHandle,
+ ILEMemHandle inSpc,
+ uint32 inSpcLen,
+ uint32* outLen,
+ uint32* outCnt)
+{
+ DBUG_ASSERT(cachedStateIsCoherent());
+ IleParms* parmBlock = parms();
+ Qmy_MDCT0100 *input = (Qmy_MDCT0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_DESCRIBE_CONSTRAINTS;
+ input->ShrHnd = defnHandle;
+ input->CstSpcHnd = (uint64)inSpc;
+ input->CstSpcLen = inSpcLen;
+ input->CnnHnd = cachedConnectionID;
+
+ int32 rc = doItWithLog();
+
+ if (likely(rc == 0))
+ {
+ Qmy_MDCT0100_output* output = (Qmy_MDCT0100_output*)parmBlock->outParms;
+ DBUG_ASSERT(outLen && outCnt);
+ *outLen = output->NeededLen;
+ *outCnt = output->CstCnt;
+ }
+
+ return rc;
+}
+
+
+/**
+ Interface to QMY_REORGANIZE_TABLE API.
+
+ See QMY_REORGANIZE_TABLE documentation for more information about
+ parameters and return codes.
+*/
+int32 db2i_ileBridge::optimizeTable(FILE_HANDLE defnHandle)
+{
+ DBUG_ASSERT(cachedStateIsCoherent());
+ IleParms* parmBlock = parms();
+ Qmy_MRGX0100 *input = (Qmy_MRGX0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_REORGANIZE_TABLE;
+ input->ShrHnd = defnHandle;
+ input->CnnHnd = cachedConnectionID;
+
+ int32 rc = doItWithLog();
+
+ return rc;
+}
+
+
+/**
+ Interface to QMY_PROCESS_COMMITMENT_CONTROL API.
+
+ See QMY_PROCESS_COMMITMENT_CONTROL documentation for more information about
+ parameters and return codes.
+*/
+int32 db2i_ileBridge::commitmentControl(uint8 function)
+{
+ DBUG_ASSERT(cachedStateIsCoherent());
+ IleParms* parmBlock = parms();
+ Qmy_MCCX0100 *input = (Qmy_MCCX0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_PROCESS_COMMITMENT_CONTROL;
+ input->Function[0] = function;
+ input->CnnHnd = cachedConnectionID;
+
+ int32 rc = doItWithLog();
+
+ return rc;
+}
+
+
+/**
+ Interface to QMY_PROCESS_SAVEPOINT API.
+
+ See QMY_PROCESS_SAVEPOINT documentation for more information about parameters and
+ return codes.
+*/
+int32 db2i_ileBridge::savepoint(uint8 function,
+ const char* savepointName)
+{
+ DBUG_ASSERT(cachedStateIsCoherent());
+ DBUG_PRINT("db2i_ileBridge::savepoint",("%d %s", (uint32)function, savepointName));
+
+ IleParms* parmBlock = parms();
+ Qmy_MSPX0100 *input = (Qmy_MSPX0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ char* savPtNam = (char*)(input+1);
+
+ input->Format = QMY_PROCESS_SAVEPOINT;
+
+ if (strlen(savepointName) > MAX_DB2_SAVEPOINTNAME_LENGTH)
+ {
+ DBUG_ASSERT(0);
+ return HA_ERR_GENERIC;
+ }
+ strcpy(savPtNam, savepointName);
+
+ input->Function[0] = function;
+ input->SavPtNamOff = savPtNam - (char*)(input);
+ input->SavPtNamLen = strlen(savepointName);
+ input->CnnHnd = cachedConnectionID;
+
+ int32 rc = doItWithLog();
+
+ return rc;
+}
+
+static ILEMemHandle traceSpcHandle;
+/**
+ Do initialization for the QMY_* APIs.
+
+ @parm aspName The name of the relational database to use for all
+ connections.
+
+ @return 0 if successful; error otherwise
+*/
+int32 db2i_ileBridge::initILE(const char* aspName,
+ uint16* traceCtlPtr)
+{
+ // We forego the typical thread-based parms space because MySQL doesn't
+ // allow us to clean it up before checking for memory leaks. As a result
+ // we get a complaint about leaked memory on server shutdown.
+ int32 rc;
+ char inParms[db2i_ileBridge_MAX_INPARM_SIZE];
+ char outParms[db2i_ileBridge_MAX_OUTPARM_SIZE];
+ if (rc = registerParmSpace(inParms, outParms))
+ {
+ reportSystemAPIError(rc, NULL);
+ return rc;
+ }
+
+ registerPtr(traceCtlPtr, &traceSpcHandle);
+
+ struct ParmBlock
+ {
+ Qmy_MINI0100 parms;
+ } *parmBlock = (ParmBlock*)inParms;
+
+ memset(inParms, 0, sizeof(ParmBlock));
+
+ parmBlock->parms.Format = QMY_INITIALIZATION;
+
+ char paddedName[18];
+ if (strlen(aspName) > sizeof(paddedName))
+ {
+ getErrTxt(DB2I_ERR_BAD_RDB_NAME);
+ return DB2I_ERR_BAD_RDB_NAME;
+ }
+
+ memset(paddedName, ' ', sizeof(paddedName));
+ memcpy(paddedName, aspName, strlen(aspName));
+ convToEbcdic(paddedName, parmBlock->parms.RDBName, strlen(paddedName));
+
+ parmBlock->parms.RDBNamLen = strlen(paddedName);
+ parmBlock->parms.TrcSpcHnd = traceSpcHandle;
+
+ rc = doIt();
+
+ if (rc)
+ {
+ reportSystemAPIError(rc, (Qmy_Error_output_t*)outParms);
+ }
+
+ return rc;
+}
+
+/**
+ Signal to the QMY_ APIs to perform any cleanup they need to do.
+*/
+int32 db2i_ileBridge::exitILE()
+{
+ IleParms* parmBlock = parms();
+ Qmy_MCLN0100 *input = (Qmy_MCLN0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_CLEANUP;
+
+ int32 rc = doIt();
+
+ if (rc)
+ {
+ reportSystemAPIError(rc, (Qmy_Error_output_t*)parmBlock->outParms);
+ }
+
+ unregisterPtr(traceSpcHandle);
+
+ DBUG_PRINT("db2i_ileBridge::exitILE", ("Registered ptrs remaining: %d", registeredPtrs));
+#ifndef DBUG_OFF
+ if (registeredPtrs != 0)
+ printf("Oh no! IBMDB2I left some pointers registered. Count was %d.\n", registeredPtrs);
+#endif
+
+ // This is needed to prevent SAFE_MALLOC from complaining at process termination.
+ my_pthread_setspecific_ptr(THR_ILEPARMS, NULL);
+ free_aligned(parmBlock);
+
+ return rc;
+
+}
+
+
+/**
+ Designate the specified addresses as parameter passing buffers.
+
+ @parm in Input to the API will go here; format is defined by the individual API
+ @parm out Output from the API will be; format is defined by the individual API
+
+ @return 0 if success; error otherwise
+*/
+int db2i_ileBridge::registerParmSpace(char* in, char* out)
+{
+ static const arg_type_t ileSignature[] = { ARG_MEMPTR, ARG_MEMPTR, ARG_END };
+
+ struct ArgList
+ {
+ ILEarglist_base base;
+ ILEpointer input;
+ ILEpointer output;
+ } *arguments;
+
+ char argBuf[sizeof(ArgList)+15];
+ arguments = (ArgList*)roundToQuadWordBdy(argBuf);
+
+ arguments->input.s.addr = (address64_t)(in);
+ arguments->output.s.addr = (address64_t)(out);
+
+ _ILECALL(&functionSymbols[funcRegisterParameterSpaces],
+ &arguments->base,
+ ileSignature,
+ RESULT_INT32);
+
+ return arguments->base.result.s_int32.r_int32;
+}
+
+
+/**
+ Interface to QMY_OBJECT_OVERRIDE API.
+
+ See QMY_OBJECT_OVERRIDE documentation for more information about parameters and
+ return codes.
+*/
+int32 db2i_ileBridge::objectOverride(FILE_HANDLE rfileHandle,
+ ILEMemHandle buf,
+ uint32 recordWidth)
+{
+ DBUG_ASSERT(cachedStateIsCoherent());
+ IleParms* parmBlock = parms();
+ Qmy_MOOX0100 *input = (Qmy_MOOX0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_OBJECT_OVERRIDE;
+ input->ObjHnd = rfileHandle;
+ input->OutSpcHnd = (uint64)buf;
+ input->NxtRowOff = recordWidth;
+ input->CnnHnd = cachedConnectionID;
+
+ int32 rc = doItWithLog();
+
+ return rc;
+}
+
+/**
+ Interface to QMY_DESCRIBE_OBJECT API for obtaining table stats.
+
+ See QMY_DESCRIBE_OBJECT documentation for more information about parameters and
+ return codes.
+*/
+int32 db2i_ileBridge::retrieveTableInfo(FILE_HANDLE defnHandle,
+ uint16 dataRequested,
+ ha_statistics& stats,
+ ILEMemHandle inSpc)
+{
+ DBUG_ASSERT(cachedStateIsCoherent());
+ IleParms* parmBlock = parms();
+ Qmy_MDSO0100 *input = (Qmy_MDSO0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_DESCRIBE_OBJECT;
+ input->ShrHnd = defnHandle;
+ input->CnnHnd = cachedConnectionID;
+
+ if (dataRequested & objLength)
+ input->RtnObjLen[0] = QMY_YES;
+ if (dataRequested & rowCount)
+ input->RtnRowCnt[0] = QMY_YES;
+ if (dataRequested & deletedRowCount)
+ input->RtnDltRowCnt[0] = QMY_YES;
+ if (dataRequested & rowsPerKey)
+ {
+ input->RowKeyHnd = (uint64)inSpc;
+ input->RtnRowKey[0] = QMY_YES;
+ }
+ if (dataRequested & meanRowLen)
+ input->RtnMeanRowLen[0] = QMY_YES;
+ if (dataRequested & lastModTime)
+ input->RtnModTim[0] = QMY_YES;
+ if (dataRequested & createTime)
+ input->RtnCrtTim[0] = QMY_YES;
+ if (dataRequested & ioCount)
+ input->RtnEstIoCnt[0] = QMY_YES;
+
+ int32 rc = doItWithLog();
+
+ if (likely(rc == 0))
+ {
+ Qmy_MDSO0100_output* output = (Qmy_MDSO0100_output*)parmBlock->outParms;
+ if (dataRequested & objLength)
+ stats.data_file_length = output->ObjLen;
+ if (dataRequested & rowCount)
+ stats.records= output->RowCnt;
+ if (dataRequested & deletedRowCount)
+ stats.deleted = output->DltRowCnt;
+ if (dataRequested & meanRowLen)
+ stats.mean_rec_length = output->MeanRowLen;
+ if (dataRequested & lastModTime)
+ stats.update_time = convertILEtime(output->ModTim);
+ if (dataRequested & createTime)
+ stats.create_time = convertILEtime(output->CrtTim);
+ if (dataRequested & ioCount)
+ stats.data_file_length = output->EstIoCnt;
+ }
+
+ return rc;
+}
+
+/**
+ Interface to QMY_DESCRIBE_OBJECT API for finding index size.
+
+ See QMY_DESCRIBE_OBJECT documentation for more information about parameters and
+ return codes.
+*/
+int32 db2i_ileBridge::retrieveIndexInfo(FILE_HANDLE defnHandle,
+ uint64* outPageCnt)
+{
+ DBUG_ASSERT(cachedStateIsCoherent());
+ IleParms* parmBlock = parms();
+ Qmy_MDSO0100 *input = (Qmy_MDSO0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_DESCRIBE_OBJECT;
+ input->ShrHnd = defnHandle;
+ input->CnnHnd = cachedConnectionID;
+ input->RtnPageCnt[0] = QMY_YES;
+
+ int32 rc = doItWithLog();
+
+ if (likely(rc == 0))
+ {
+ Qmy_MDSO0100_output* output = (Qmy_MDSO0100_output*)parmBlock->outParms;
+ *outPageCnt = output->PageCnt;
+ }
+
+ return rc;
+}
+
+
+/**
+ Interface to QMY_CLOSE_CONNECTION API
+
+ See QMY_CLOSE_CONNECTION documentation for more information about parameters and
+ return codes.
+*/
+int32 db2i_ileBridge::closeConnection(CONNECTION_HANDLE conn)
+{
+ IleParms* parmBlock = parms();
+ Qmy_MCCN0100 *input = (Qmy_MCCN0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_CLOSE_CONNECTION;
+ input->CnnHnd = conn;
+
+ int32 rc = doItWithLog();
+
+ return rc;
+}
+
+
+/**
+ Interface to QMY_INTERRUPT API
+
+ See QMY_INTERRUPT documentation for more information about parameters and
+ return codes.
+*/
+int32 db2i_ileBridge::readInterrupt(FILE_HANDLE fileHandle)
+{
+ DBUG_ASSERT(cachedStateIsCoherent());
+ IleParms* parmBlock = parms();
+ Qmy_MINT0100 *input = (Qmy_MINT0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_INTERRUPT;
+ input->CnnHnd = cachedConnectionID;
+ input->ObjHnd = fileHandle;
+
+ int32 rc = doItWithLog();
+
+ if (rc == QMY_ERR_END_OF_BLOCK)
+ {
+ rc = 0;
+ DBUG_PRINT("db2i_ileBridge::readInterrupt", ("End of block signalled"));
+ }
+
+ return rc;
+}
+
+/**
+ Interface to QMY_READ_ROWS API
+
+ See QMY_READ_ROWS documentation for more information about parameters and
+ return codes.
+*/
+int32 db2i_ileBridge::read(FILE_HANDLE rfileHandle,
+ ILEMemHandle buf,
+ char accessIntent,
+ char commitLevel,
+ char orientation,
+ bool asyncRead,
+ ILEMemHandle rrn,
+ ILEMemHandle key,
+ uint32 keylen,
+ uint16 keyParts,
+ int pipeFD)
+{
+ DBUG_ASSERT(cachedStateIsCoherent());
+ IleParms* parmBlock = parms();
+ Qmy_MRDX0100 *input = (Qmy_MRDX0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_READ_ROWS;
+ input->CmtLvl[0] = commitLevel;
+
+ input->ObjHnd = rfileHandle;
+ input->Intent[0] = accessIntent;
+ input->OutSpcHnd = (uint64)buf;
+ input->OutRRNSpcHnd = (uint64)rrn;
+ input->RtnData[0] = QMY_RETURN_DATA;
+
+ if (key)
+ {
+ input->KeySpcHnd = (uint64)key;
+ input->KeyColsLen = keylen;
+ input->KeyColsNbr = keyParts;
+ }
+
+ input->Async[0] = (asyncRead ? QMY_YES : QMY_NO);
+ input->PipeDesc = pipeFD;
+ input->Orientation[0] = orientation;
+ input->CnnHnd = cachedConnectionID;
+
+ int32 rc = doItWithLog();
+
+ // QMY_ERR_END_OF_BLOCK is informational only, so we ignore it.
+ if (rc == QMY_ERR_END_OF_BLOCK)
+ {
+ rc = 0;
+ DBUG_PRINT("db2i_ileBridge::read", ("End of block signalled"));
+ }
+
+ return rc;
+}
+
+
+/**
+ Interface to QMY_QUIESCE_OBJECT API
+
+ See QMY_QUIESCE_OBJECT documentation for more information about parameters and
+ return codes.
+*/
+int32 db2i_ileBridge::quiesceFileInstance(FILE_HANDLE rfileHandle)
+{
+ IleParms* parmBlock = parms();
+ Qmy_MQSC0100 *input = (Qmy_MQSC0100*)&(parmBlock->inParms);
+ memset(input, 0, sizeof(*input));
+
+ input->Format = QMY_QUIESCE_OBJECT;
+ input->ObjHnd = rfileHandle;
+
+ int32 rc = doItWithLog();
+
+#ifndef DBUG_OFF
+ if (unlikely(rc))
+ {
+ DBUG_ASSERT(0);
+ }
+#endif
+
+ return rc;
+}
+
+void db2i_ileBridge::PreservedHandleList::add(const char* newname, FILE_HANDLE newhandle, IBMDB2I_SHARE* share)
+{
+ NameHandlePair *newPair = (NameHandlePair*)my_malloc(sizeof(NameHandlePair), MYF(MY_WME));
+
+ newPair->next = head;
+ head = newPair;
+
+ strcpy(newPair->name, newname);
+ newPair->handle = newhandle;
+ newPair->share = share;
+ DBUG_PRINT("db2i_ileBridge", ("Added handle %d for %s", uint32(newhandle), newname));
+}
+
+
+FILE_HANDLE db2i_ileBridge::PreservedHandleList::findAndRemove(const char* fileName, IBMDB2I_SHARE** share)
+{
+ NameHandlePair* current = head;
+ NameHandlePair* prev = NULL;
+
+ while (current)
+ {
+ NameHandlePair* next = current->next;
+ if (strcmp(fileName, current->name) == 0)
+ {
+ FILE_HANDLE tmp = current->handle;
+ *share = current->share;
+ if (prev)
+ prev->next = next;
+ if (current == head)
+ head = next;
+ my_free(current, MYF(0));
+ DBUG_PRINT("db2i_ileBridge", ("Found handle %d for %s", uint32(tmp), fileName));
+ return tmp;
+ }
+ prev = current;
+ current = next;
+ }
+
+ return 0;
+}
+
+
+IleParms* db2i_ileBridge::initParmsForThread()
+{
+
+ IleParms* p = (IleParms*)malloc_aligned(sizeof(IleParms));
+ DBUG_ASSERT((uint64)(&(p->outParms))% 16 == 0); // Guarantee that outParms are aligned correctly
+
+ if (likely(p))
+ {
+ int32 rc = registerParmSpace((p->inParms), (p->outParms));
+ if (likely(rc == 0))
+ {
+ my_pthread_setspecific_ptr(THR_ILEPARMS, p);
+ DBUG_PRINT("db2i_ileBridge", ("Inited space for parms"));
+ return p;
+ }
+ else
+ reportSystemAPIError(rc, NULL);
+ }
+
+ return NULL;
+}
+
diff --git a/storage/ibmdb2i/db2i_ileBridge.h b/storage/ibmdb2i/db2i_ileBridge.h
new file mode 100644
index 00000000000..10b9820d983
--- /dev/null
+++ b/storage/ibmdb2i/db2i_ileBridge.h
@@ -0,0 +1,499 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+
+#ifndef DB2I_ILEBRIDGE_H
+#define DB2I_ILEBRIDGE_H
+
+#include "db2i_global.h"
+#include "mysql_priv.h"
+#include "as400_types.h"
+#include "as400_protos.h"
+#include "qmyse.h"
+#include "db2i_errors.h"
+
+typedef uint64_t FILE_HANDLE;
+typedef my_thread_id CONNECTION_HANDLE;
+const char SAVEPOINT_NAME[] = {0xD4,0xE2,0xD7,0xC9,0xD5,0xE3,0xC5,0xD9,0xD5,0x0};
+const uint32 TACIT_ERRORS_SIZE=2;
+
+enum db2i_InfoRequestSpec
+{
+ objLength = 1,
+ rowCount = 2,
+ deletedRowCount = 4,
+ rowsPerKey = 8,
+ meanRowLen = 16,
+ lastModTime = 32,
+ createTime = 64,
+ ioCount = 128
+};
+
+extern handlerton *ibmdb2i_hton;
+struct IBMDB2I_SHARE;
+
+const uint32 db2i_ileBridge_MAX_INPARM_SIZE = 512;
+const uint32 db2i_ileBridge_MAX_OUTPARM_SIZE = 512;
+
+extern pthread_key(IleParms*, THR_ILEPARMS);
+struct IleParms
+{
+ char inParms[db2i_ileBridge_MAX_INPARM_SIZE];
+ char outParms[db2i_ileBridge_MAX_OUTPARM_SIZE];
+};
+
+/**
+ @class db2i_ileBridge
+
+ Implements a connection-based interface to the QMY_* APIs
+
+ @details Each client connection that touches an IBMDB2I table has a "bridge"
+ associated with it. This bridge is constructed on first use and provides a
+ more C-like interface to the APIs. As well, it is reponsible for tracking
+ connection scoped information such as statement transaction state and error
+ message text. The bridge is destroyed when the connection ends.
+*/
+class db2i_ileBridge
+{
+ enum ileFuncs
+ {
+ funcRegisterParameterSpaces,
+ funcRegisterSpace,
+ funcUnregisterSpace,
+ funcProcessRequest,
+ funcListEnd
+ };
+
+ static db2i_ileBridge* globalBridge;
+public:
+
+
+ static int setup();
+ static void takedown();
+
+ /**
+ Obtain a pointer to the bridge for the current connection.
+
+ If a MySQL client connection is on the stack, we get the associated brideg.
+ Otherwise, we use the globalBridge.
+ */
+ static db2i_ileBridge* getBridgeForThread()
+ {
+ THD* thd = current_thd;
+ if (likely(thd))
+ return getBridgeForThread(thd);
+
+ return globalBridge;
+ }
+
+ /**
+ Obtain a pointer to the bridge for the specified connection.
+
+ If a bridge exists already, we return it immediately. Otherwise, prepare
+ a new bridge for the connection.
+ */
+ static db2i_ileBridge* getBridgeForThread(const THD* thd)
+ {
+ void* thdData = *thd_ha_data(thd, ibmdb2i_hton);
+ if (likely(thdData != NULL))
+ return (db2i_ileBridge*)(thdData);
+
+ db2i_ileBridge* newBridge = createNewBridge(thd->thread_id);
+ *thd_ha_data(thd, ibmdb2i_hton) = (void*)newBridge;
+ return newBridge;
+ }
+
+ static void destroyBridgeForThread(const THD* thd);
+ static void registerPtr(const void* ptr, ILEMemHandle* receiver);
+ static void unregisterPtr(ILEMemHandle handle);
+ int32 allocateFileDefn(ILEMemHandle definitionSpace,
+ ILEMemHandle handleSpace,
+ uint16 fileCount,
+ const char* schemaName,
+ uint16 schemaNameLength,
+ ILEMemHandle formatSpace,
+ uint32 formatSpaceLen);
+ int32 allocateFileInstance(FILE_HANDLE defnHandle,
+ ILEMemHandle inuseSpace,
+ FILE_HANDLE* instance);
+ int32 deallocateFile(FILE_HANDLE fileHandle,
+ bool postDropTable=FALSE);
+ int32 read(FILE_HANDLE rfileHandle,
+ ILEMemHandle buf,
+ char accessIntent,
+ char commitLevel,
+ char orientation,
+ bool asyncRead = FALSE,
+ ILEMemHandle rrn = 0,
+ ILEMemHandle key = 0,
+ uint32 keylen = 0,
+ uint16 keyParts = 0,
+ int pipeFD = -1);
+ int32 readByRRN(FILE_HANDLE rfileHandle,
+ ILEMemHandle buf,
+ uint32 inRRN,
+ char accessIntent,
+ char commitLevel);
+ int32 writeRows(FILE_HANDLE rfileHandle,
+ ILEMemHandle buf,
+ char commitLevel,
+ int64* outIdVal,
+ bool* outIdGen,
+ uint32* dupKeyRRN,
+ char** dupKeyName,
+ uint32* dupKeyNameLen,
+ uint32* outIdIncrement);
+ uint32 execSQL(const char* statement,
+ uint32 statementCount,
+ uint8 commitLevel,
+ bool autoCreateSchema = FALSE,
+ bool dropSchema = FALSE,
+ bool noCommit = FALSE,
+ FILE_HANDLE fileHandle = 0);
+ int32 prepOpen(const char* statement,
+ FILE_HANDLE* rfileHandle,
+ uint32* recLength);
+ int32 deleteRow(FILE_HANDLE rfileHandle,
+ uint32 rrn);
+ int32 updateRow(FILE_HANDLE rfileHandle,
+ uint32 rrn,
+ ILEMemHandle buf,
+ uint32* dupKeyRRN,
+ char** dupKeyName,
+ uint32* dupKeyNameLen);
+ int32 commitmentControl(uint8 function);
+ int32 savepoint(uint8 function,
+ const char* savepointName);
+ int32 recordsInRange(FILE_HANDLE rfileHandle,
+ ILEMemHandle inSpc,
+ uint32 inKeyCnt,
+ uint32 inLiteralCnt,
+ uint32 inBoundsOff,
+ uint32 inLitDefOff,
+ uint32 inLiteralsOff,
+ uint32 inCutoff,
+ uint32 inSpcLen,
+ uint16 inEndByte,
+ uint64* outRecCnt,
+ uint16* outRtnCode);
+ int32 rrlslck(FILE_HANDLE rfileHandle,
+ char accessIntent);
+ int32 lockObj(FILE_HANDLE rfileHandle,
+ uint64 inTimeoutVal,
+ char inAction,
+ char inLockType,
+ char inTimeout);
+ int32 constraints(FILE_HANDLE rfileHandle,
+ ILEMemHandle inSpc,
+ uint32 inSpcLen,
+ uint32* outLen,
+ uint32* outCnt);
+ int32 optimizeTable(FILE_HANDLE rfileHandle);
+ static int32 initILE(const char* aspName,
+ uint16* traceCtlPtr);
+ int32 initFileForIO(FILE_HANDLE rfileHandle,
+ char accessIntent,
+ char commitLevel,
+ uint16* inRecSize,
+ uint16* inRecNullOffset,
+ uint16* outRecSize,
+ uint16* outRecNullOffset);
+ int32 readInterrupt(FILE_HANDLE fileHandle);
+ static int32 exitILE();
+
+ int32 objectOverride(FILE_HANDLE rfileHandle,
+ ILEMemHandle buf,
+ uint32 recordWidth = 0);
+
+ int32 retrieveTableInfo(FILE_HANDLE rfileHandle,
+ uint16 dataRequested,
+ ha_statistics& stats,
+ ILEMemHandle inSpc = NULL);
+
+ int32 retrieveIndexInfo(FILE_HANDLE rfileHandle,
+ uint64* outPageCnt);
+
+ int32 closeConnection(CONNECTION_HANDLE conn);
+ int32 quiesceFileInstance(FILE_HANDLE rfileHandle);
+
+ /**
+ Mark the beginning of a "statement transaction"
+
+ @detail MySQL "statement transactions" (see sql/handler.cc) are implemented
+ as DB2 savepoints having a predefined name.
+
+ @return 0 if successful; error otherwise
+ */
+ uint32 beginStmtTx()
+ {
+ DBUG_ENTER("db2i_ileBridge::beginStmtTx");
+ if (stmtTxActive)
+ DBUG_RETURN(0);
+
+ stmtTxActive = true;
+
+ DBUG_RETURN(savepoint(QMY_SET_SAVEPOINT, SAVEPOINT_NAME));
+ }
+
+ /**
+ Commit a "statement transaction"
+
+ @return 0 if successful; error otherwise
+ */
+ uint32 commitStmtTx()
+ {
+ DBUG_ENTER("db2i_ileBridge::commitStmtTx");
+ DBUG_ASSERT(stmtTxActive);
+ stmtTxActive = false;
+ DBUG_RETURN(savepoint(QMY_RELEASE_SAVEPOINT, SAVEPOINT_NAME));
+ }
+
+ /**
+ Roll back a "statement transaction"
+
+ @return 0 if successful; error otherwise
+ */
+ uint32 rollbackStmtTx()
+ {
+ DBUG_ENTER("db2i_ileBridge::rollbackStmtTx");
+ DBUG_ASSERT(stmtTxActive);
+ stmtTxActive = false;
+ DBUG_RETURN(savepoint(QMY_ROLLBACK_SAVEPOINT, SAVEPOINT_NAME));
+ }
+
+
+ /**
+ Provide storage for generating error messages.
+
+ This storage must persist until the error message is retrieved from the
+ handler instance. It is for this reason that we associate it with the bridge.
+
+ @return Pointer to heap storage of MYSQL_ERRMSG_SIZE bytes
+ */
+ char* getErrorStorage()
+ {
+ if (!connErrText)
+ {
+ connErrText = (char*)my_malloc(MYSQL_ERRMSG_SIZE, MYF(MY_WME));
+ if (connErrText) connErrText[0] = 0;
+ }
+
+ return connErrText;
+ }
+
+ /**
+ Free storage for generating error messages.
+ */
+ void freeErrorStorage()
+ {
+ if (likely(connErrText))
+ {
+ my_free(connErrText, MYF(0));
+ connErrText = NULL;
+ }
+ }
+
+
+ /**
+ Store a file handle for later retrieval.
+
+ If deallocateFile encounters a lock when trying to perform its operation,
+ the file remains allocated but must be deallocated later. This function
+ provides a way for the connection to "remember" that this deallocation is
+ still needed.
+
+ @param newname The name of the file to be added
+ @param newhandle The handle associated with newname
+
+ */
+ void preserveHandle(const char* newname, FILE_HANDLE newhandle, IBMDB2I_SHARE* share)
+ {
+ pendingLockedHandles.add(newname, newhandle, share);
+ }
+
+ /**
+ Retrieve a file handle stored by preserveHandle().
+
+ @param name The name of the file to be retrieved.
+
+ @return The handle associated with name
+ */
+ FILE_HANDLE findAndRemovePreservedHandle(const char* name, IBMDB2I_SHARE** share)
+ {
+ FILE_HANDLE hdl = pendingLockedHandles.findAndRemove(name, share);
+ return hdl;
+ }
+
+ /**
+ Indicate which error messages should be suppressed on the next API call
+
+ These functions are useful for ensuring that the provided error numbers
+ are returned if a failure occurs but do not cause a spurious error message
+ to be returned.
+
+ @return A pointer to this instance
+ */
+ db2i_ileBridge* expectErrors(int32 er1)
+ {
+ tacitErrors[0]=er1;
+ return this;
+ }
+
+ db2i_ileBridge* expectErrors(int32 er1, int32 er2)
+ {
+ tacitErrors[0]=er1;
+ tacitErrors[1]=er2;
+ return this;
+ }
+
+ /**
+ Obtain the IBM i system message that accompanied the last API failure.
+
+ @return A pointer to the 7 character message ID.
+ */
+ static const char* getErrorMsgID()
+ {
+ return ((Qmy_Error_output_t*)parms()->outParms)->MsgId;
+ }
+
+ /**
+ Convert an API error code into the equivalent MySQL error code (if any)
+
+ @param rc The QMYSE API error code
+
+ @return If an equivalent exists, the MySQL error code; else rc
+ */
+ static int32 translateErrorCode(int32 rc)
+ {
+ if (likely(rc == 0))
+ return 0;
+
+ switch (rc)
+ {
+ case QMY_ERR_KEY_NOT_FOUND:
+ return HA_ERR_KEY_NOT_FOUND;
+ case QMY_ERR_DUP_KEY:
+ return HA_ERR_FOUND_DUPP_KEY;
+ case QMY_ERR_END_OF_FILE:
+ return HA_ERR_END_OF_FILE;
+ case QMY_ERR_LOCK_TIMEOUT:
+ return HA_ERR_LOCK_WAIT_TIMEOUT;
+ case QMY_ERR_CST_VIOLATION:
+ return HA_ERR_NO_REFERENCED_ROW;
+ case QMY_ERR_TABLE_NOT_FOUND:
+ return HA_ERR_NO_SUCH_TABLE;
+ case QMY_ERR_NON_UNIQUE_KEY:
+ return ER_DUP_ENTRY;
+ case QMY_ERR_MSGID:
+ {
+ if (memcmp(getErrorMsgID(), DB2I_CPF503A, 7) == 0)
+ return HA_ERR_ROW_IS_REFERENCED;
+ if (memcmp(getErrorMsgID(), DB2I_SQL0538, 7) == 0)
+ return HA_ERR_CANNOT_ADD_FOREIGN;
+ }
+ }
+ return rc;
+ }
+
+private:
+
+ static db2i_ileBridge* createNewBridge(CONNECTION_HANDLE connID);
+ static void destroyBridge(db2i_ileBridge* bridge);
+ static int registerParmSpace(char* in, char* out);
+ static int32 doIt();
+ int32 doItWithLog();
+
+ static _ILEpointer *functionSymbols; ///< Array of ILE function pointers
+ CONNECTION_HANDLE cachedConnectionID; ///< The associated connection
+ bool stmtTxActive; ///< Inside statement transaction
+ char *connErrText; ///< Storage for error message
+ int32 tacitErrors[TACIT_ERRORS_SIZE]; ///< List of errors to be suppressed
+
+ static IleParms* initParmsForThread();
+
+ /**
+ Get space for passing parameters to the QMY_* APIs
+
+ @details A fixed-length parameter passing space is associated with each
+ pthread. This space is allocated and registered by initParmsForThread()
+ the first time a pthread works with a bridge. The space is cached away
+ and remains available until the pthread ends. It became necessary to
+ disassociate the parameter space from the bridge in order to support
+ future enhancements to MySQL that sever the one-to-one relationship between
+ pthreads and user connections. The QMY_* APIs scope a registered parameter
+ space to the thread that executes the register operation.
+ */
+ static IleParms* parms()
+ {
+ IleParms* p = my_pthread_getspecific_ptr(IleParms*, THR_ILEPARMS);
+ if (likely(p))
+ return p;
+
+ return initParmsForThread();
+ }
+
+ class PreservedHandleList
+ {
+ friend db2i_ileBridge* db2i_ileBridge::createNewBridge(CONNECTION_HANDLE);
+ public:
+ void add(const char* newname, FILE_HANDLE newhandle, IBMDB2I_SHARE* share);
+ FILE_HANDLE findAndRemove(const char* fileName, IBMDB2I_SHARE** share);
+
+ private:
+ struct NameHandlePair
+ {
+ char name[FN_REFLEN];
+ FILE_HANDLE handle;
+ IBMDB2I_SHARE* share;
+ NameHandlePair* next;
+ }* head;
+ } pendingLockedHandles;
+
+
+#ifndef DBUG_OFF
+ bool cachedStateIsCoherent()
+ {
+ return (current_thd->thread_id == cachedConnectionID);
+ }
+
+ friend void db2i_ileBridge::unregisterPtr(ILEMemHandle);
+ friend void db2i_ileBridge::registerPtr(const void*, ILEMemHandle*);
+ static uint32 registeredPtrs;
+#endif
+};
+
+
+
+#endif
diff --git a/storage/ibmdb2i/db2i_ioBuffers.cc b/storage/ibmdb2i/db2i_ioBuffers.cc
new file mode 100644
index 00000000000..9525a6e34b5
--- /dev/null
+++ b/storage/ibmdb2i/db2i_ioBuffers.cc
@@ -0,0 +1,332 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+
+#include "db2i_ioBuffers.h"
+
+/**
+ Request another block of rows
+
+ Request the next set of rows from DB2. This must only be called after
+ newReadRequest().
+
+ @param orientation The direction to use when reading through the table.
+*/
+void IOAsyncReadBuffer::loadNewRows(char orientation)
+{
+ rewind();
+ maxRows() = rowsToBlock;
+
+ DBUG_PRINT("db2i_ioBuffers::loadNewRows", ("Requesting %d rows, async = %d", rowsToBlock, readIsAsync));
+
+ rc = getBridge()->expectErrors(QMY_ERR_END_OF_BLOCK, QMY_ERR_LOB_SPACE_TOO_SMALL)
+ ->read(file,
+ ptr(),
+ accessIntent,
+ commitLevel,
+ orientation,
+ readIsAsync,
+ rrnList,
+ 0,
+ 0,
+ 0);
+
+ DBUG_PRINT("db2i_ioBuffers::loadNewRows", ("recordsRead: %d, rc: %d", (uint32)rowCount(), rc));
+
+
+ *releaseRowNeeded = true;
+
+ if (rc == QMY_ERR_END_OF_BLOCK)
+ {
+ // This is really just an informational error, so we ignore it.
+ rc = 0;
+ DBUG_PRINT("db2i_ioBuffers::loadNewRows", ("End of block signalled"));
+ }
+ else if (rc == QMY_ERR_END_OF_FILE)
+ {
+ // If we reach EOF or end-of-key, DB2 guarantees that no rows will be locked.
+ rc = HA_ERR_END_OF_FILE;
+ *releaseRowNeeded = false;
+ }
+ else if (rc == QMY_ERR_KEY_NOT_FOUND)
+ {
+ rc = HA_ERR_KEY_NOT_FOUND;
+ *releaseRowNeeded = false;
+ }
+
+ if (rc) closePipe();
+}
+
+
+/**
+ Empty the message pipe to prepare for another read.
+*/
+void IOAsyncReadBuffer::drainPipe()
+{
+ DBUG_ASSERT(pipeState == PendingFullBufferMsg);
+ PipeRpy_t msg[32];
+ int bytes;
+ PipeRpy_t* lastMsg;
+ while ((bytes = read(msgPipe, msg, sizeof(msg))) > 0)
+ {
+ DBUG_PRINT("db2i_ioBuffers::drainPipe",("Pipe returned %d bytes", bytes));
+ lastMsg = &msg[bytes / (sizeof(msg[0]))-1];
+ if (lastMsg->CumRowCnt == maxRows() ||
+ lastMsg->RtnCod != 0)
+ {
+ pipeState = ConsumedFullBufferMsg;
+ break;
+ }
+
+ }
+ DBUG_PRINT("db2i_ioBuffers::drainPipe",("rc = %d, rows = %d, max = %d", lastMsg->RtnCod, lastMsg->CumRowCnt, (uint32)maxRows()));
+}
+
+
+/**
+ Poll the message pipe for async read messages
+
+ Only valid in async
+
+ @param orientation The direction to use when reading through the table.
+*/
+void IOAsyncReadBuffer::pollNextRow(char orientation)
+{
+ DBUG_ASSERT(readIsAsync);
+
+ // Handle the case in which the buffer is full.
+ if (rowCount() == maxRows())
+ {
+ // If we haven't read to the end, exit here.
+ if (readCursor < rowCount())
+ return;
+
+ if (pipeState == PendingFullBufferMsg)
+ drainPipe();
+ if (pipeState == ConsumedFullBufferMsg)
+ loadNewRows(orientation);
+ }
+
+ if (!rc)
+ {
+ PipeRpy_t* lastMsg = NULL;
+ while (true)
+ {
+ PipeRpy_t msg[32];
+ int bytes = read(msgPipe, msg, sizeof(msg));
+ DBUG_PRINT("db2i_ioBuffers::pollNextRow",("Pipe returned %d bytes", bytes));
+
+ if (unlikely(bytes < 0))
+ {
+ DBUG_PRINT("db2i_ioBuffers::pollNextRow", ("Error"));
+ rc = errno;
+ break;
+ }
+ else if (bytes == 0)
+ break;
+
+ DBUG_ASSERT(bytes % sizeof(msg[0]) == 0);
+ lastMsg = &msg[bytes / (sizeof(msg[0]))-1];
+
+ if (lastMsg->RtnCod || (lastMsg->CumRowCnt == usedRows()))
+ {
+ rc = lastMsg->RtnCod;
+ break;
+ }
+ }
+
+ *releaseRowNeeded = true;
+
+ if (rc == QMY_ERR_END_OF_BLOCK)
+ rc = 0;
+ else if (rc == QMY_ERR_END_OF_FILE)
+ {
+ // If we reach EOF or end-of-key, DB2 guarantees that no rows will be locked.
+ rc = HA_ERR_END_OF_FILE;
+ *releaseRowNeeded = false;
+ }
+ else if (rc == QMY_ERR_KEY_NOT_FOUND)
+ {
+ rc = HA_ERR_KEY_NOT_FOUND;
+ *releaseRowNeeded = false;
+ }
+
+ if (lastMsg)
+ DBUG_PRINT("db2i_ioBuffers::pollNextRow", ("Good data: rc=%d; rows=%d; usedRows=%d", lastMsg->RtnCod, lastMsg->CumRowCnt, (uint32)usedRows()));
+ if (lastMsg && likely(!rc))
+ {
+ if (lastMsg->CumRowCnt < maxRows())
+ pipeState = PendingFullBufferMsg;
+ else
+ pipeState = ConsumedFullBufferMsg;
+
+ DBUG_ASSERT(lastMsg->CumRowCnt <= usedRows());
+
+ }
+ DBUG_ASSERT(rowCount() <= getRowCapacity());
+ }
+ DBUG_PRINT("db2i_ioBuffers::pollNextRow", ("filledRows: %d, rc: %d", rowCount(), rc));
+ if (rc) closePipe();
+}
+
+
+/**
+ Prepare for the destruction of the row buffer storage.
+*/
+void IOAsyncReadBuffer::prepForFree()
+{
+ interruptRead();
+ rewind();
+ IORowBuffer::prepForFree();
+}
+
+
+/**
+ Initialize the newly allocated storage.
+
+ @param sizeChanged Indicates whether the storage capacity is being changed.
+*/
+void IOAsyncReadBuffer::initAfterAllocate(bool sizeChanged)
+{
+ rewind();
+
+ if (sizeChanged || ((void*)rrnList == NULL))
+ rrnList.realloc(getRowCapacity() * sizeof(uint32));
+}
+
+
+/**
+ Send an initial read request
+
+ @param infile The file (table/index) being read from
+ @param orientation The orientation to use for this read request
+ @param rowsToBuffer The number of rows to request each time
+ @param useAsync Whether reads should be performed asynchronously.
+ @param key The key to use (if any)
+ @param keyLength The length of key (if any)
+ @param keyParts The number of columns in the key (if any)
+
+*/
+void IOAsyncReadBuffer::newReadRequest(FILE_HANDLE infile,
+ char orientation,
+ uint32 rowsToBuffer,
+ bool useAsync,
+ ILEMemHandle key,
+ int keyLength,
+ int keyParts)
+{
+ DBUG_ENTER("db2i_ioBuffers::newReadRequest");
+ DBUG_ASSERT(rowsToBuffer <= getRowCapacity());
+#ifndef DBUG_OFF
+ if (readCursor < rowCount())
+ DBUG_PRINT("PERF:",("Wasting %d buffered rows!\n", rowCount() - readCursor));
+#endif
+
+ int fildes[2];
+ int ileDescriptor = QMY_REUSE;
+
+ interruptRead();
+
+ if (likely(useAsync))
+ {
+ if (rowsToBuffer == 1)
+ {
+ // Async provides little or no benefit for single row reads, so we turn it off
+ DBUG_PRINT("db2i_ioBuffers::newReadRequest", ("Disabling async"));
+ useAsync = false;
+ }
+ else
+ {
+ rc = pipe(fildes);
+ if (rc) DBUG_VOID_RETURN;
+
+ // Translate the pipe write descriptor into the equivalent ILE descriptor
+ rc = fstatx(fildes[1], (struct stat*)&ileDescriptor, sizeof(ileDescriptor), STX_XPFFD_PASE);
+ if (rc)
+ {
+ close(fildes[0]);
+ close(fildes[1]);
+ DBUG_VOID_RETURN;
+ }
+ pipeState = Untouched;
+ msgPipe = fildes[0];
+
+ DBUG_PRINT("db2i_ioBuffers::newReadRequest", ("Opened pipe %d", fildes[0]));
+ }
+ }
+
+ file = infile;
+ readIsAsync = useAsync;
+ rowsToBlock = rowsToBuffer;
+
+ rewind();
+ maxRows() = 1;
+ rc = getBridge()->expectErrors(QMY_ERR_END_OF_BLOCK, QMY_ERR_LOB_SPACE_TOO_SMALL)
+ ->read(file,
+ ptr(),
+ accessIntent,
+ commitLevel,
+ orientation,
+ useAsync,
+ rrnList,
+ key,
+ keyLength,
+ keyParts,
+ ileDescriptor);
+
+ // Having shared the pipe with ILE, we relinquish our claim on the write end
+ // of the pipe.
+ if (useAsync)
+ close(fildes[1]);
+
+ // If we reach EOF or end-of-key, DB2 guarantees that no rows will be locked.
+ if (rc == QMY_ERR_END_OF_FILE)
+ {
+ rc = HA_ERR_END_OF_FILE;
+ *releaseRowNeeded = false;
+ }
+ else if (rc == QMY_ERR_KEY_NOT_FOUND)
+ {
+ if (rowCount())
+ rc = HA_ERR_END_OF_FILE;
+ else
+ rc = HA_ERR_KEY_NOT_FOUND;
+ *releaseRowNeeded = false;
+ }
+ else
+ *releaseRowNeeded = true;
+
+ DBUG_VOID_RETURN;
+}
diff --git a/storage/ibmdb2i/db2i_ioBuffers.h b/storage/ibmdb2i/db2i_ioBuffers.h
new file mode 100644
index 00000000000..350d854f055
--- /dev/null
+++ b/storage/ibmdb2i/db2i_ioBuffers.h
@@ -0,0 +1,416 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+
+/**
+ @file db2i_ioBuffers.h
+
+ @brief Buffer classes used for interacting with QMYSE read/write buffers.
+
+*/
+
+
+#include "db2i_validatedPointer.h"
+#include "mysql_priv.h"
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <as400_types.h>
+
+// Needed for compilers which do not include fstatx in standard headers.
+extern "C" int fstatx(int, struct stat *, int, int);
+
+/**
+ Basic row buffer
+
+ Provides the basic structure and methods needed for communicating
+ with QMYSE I/O APIs.
+
+ @details All QMYSE I/O apis use a buffer that is structured as two integer
+ row counts (max and used) and storage for some number of rows. The row counts
+ are both input and output for the API, and their usage depends on the
+ particular API invoked. This class encapsulates that buffer definition.
+*/
+class IORowBuffer
+{
+ public:
+ IORowBuffer() : allocSize(0), rowLength(0) {;}
+ ~IORowBuffer() { freeBuf(); }
+ ValidatedPointer<char>& ptr() { return data; }
+
+ /**
+ Sets up the buffer to hold the size indicated.
+
+ @param rowLen length of the rows that will be stored in this buffer
+ @param nullMapOffset position of null map within each row
+ @param size buffer size requested
+ */
+ void allocBuf(uint32 rowLen, uint16 nullMapOffset, uint32 size)
+ {
+ nullOffset = nullMapOffset;
+ uint32 newSize = size + sizeof(BufferHdr_t);
+ // If the internal structure of the row is changing, we need to
+ // remember this and notify the subclasses via initAfterAllocate();
+ bool formatChanged = ((size/rowLen) != rowCapacity);
+
+ if (newSize > allocSize)
+ {
+ this->freeBuf();
+ data.alloc(newSize);
+ if (likely((void*)data))
+ allocSize = newSize;
+ }
+
+ if (likely((void*)data))
+ {
+ DBUG_ASSERT((uint64)(void*)data % 16 == 0);
+ rowLength = rowLen;
+ rowCapacity = size / rowLength;
+ initAfterAllocate(formatChanged);
+ }
+ else
+ {
+ allocSize = 0;
+ rowCapacity = 0;
+ }
+
+ DBUG_PRINT("db2i_ioBuffers::allocBuf",("rowCapacity = %d", rowCapacity));
+ }
+
+ void zeroBuf()
+ {
+ memset(data, 0, allocSize);
+ }
+
+ void freeBuf()
+ {
+ if (likely(allocSize))
+ {
+ prepForFree();
+ DBUG_PRINT("IORowBuffer::freeBuf",("Freeing 0x%p", (char*)data));
+ data.dealloc();
+ }
+ }
+
+ char* getRowN(uint32 n)
+ {
+ if (unlikely(n >= getRowCapacity()))
+ return NULL;
+ return (char*)data + sizeof(BufferHdr_t) + (rowLength * n);
+ };
+
+ uint32 getRowCapacity() const {return rowCapacity;}
+ uint32 getRowNullOffset() const {return nullOffset;}
+ uint32 getRowLength() const {return rowLength;}
+
+ protected:
+ /**
+ Called prior to freeing buffer storage so that subclasses can do
+ any required cleanup
+ */
+ virtual void prepForFree()
+ {
+ allocSize = 0;
+ rowCapacity = 0;
+ }
+
+ /**
+ Called after buffer storage so that subclasses can do any required setup.
+ */
+ virtual void initAfterAllocate(bool sizeChanged) { return;}
+
+ ValidatedPointer<char> data;
+ uint32 allocSize;
+ uint32 rowCapacity;
+ uint32 rowLength;
+ uint16 nullOffset;
+ uint32& usedRows() const { return ((BufferHdr_t*)(char*)data)->UsedRowCnt; }
+ uint32& maxRows() const {return ((BufferHdr_t*)(char*)data)->MaxRowCnt; }
+};
+
+
+/**
+ Write buffer
+
+ Implements methods for inserting data into a row buffer for use with the
+ QMY_WRITE and QMY_UPDATE APIs.
+
+ @details The max row count defines how many rows are in the buffer. The used
+ row count is updated by QMYSE to indicate how many rows have been
+ successfully written.
+*/
+class IOWriteBuffer : public IORowBuffer
+{
+ public:
+ bool endOfBuffer() const {return (maxRows() == getRowCapacity());}
+
+ char* addRow()
+ {
+ return getRowN(maxRows()++);
+ }
+
+ void resetAfterWrite()
+ {
+ maxRows() = 0;
+ }
+
+ void deleteRow()
+ {
+ --maxRows();
+ }
+
+ uint32 rowCount() const {return maxRows();}
+
+ uint32 rowsWritten() const {return usedRows()-1;}
+
+ private:
+ void initAfterAllocate(bool sizeChanged) {maxRows() = 0; usedRows() = 0;}
+};
+
+
+/**
+ Read buffer
+
+ Implements methods for reading data from and managing a row buffer for use
+ with the QMY_READ APIs. This is primarily for use with metainformation queries.
+*/
+class IOReadBuffer : public IORowBuffer
+{
+ public:
+
+ IOReadBuffer() {;}
+ IOReadBuffer(uint32 rows, uint32 rowLength)
+ {
+ allocBuf(rows, 0, rows * rowLength);
+ maxRows() = rows;
+ }
+
+ uint32 rowCount() {return usedRows();}
+ void setRowsToProcess(uint32 rows) { maxRows() = rows; }
+};
+
+
+/**
+ Read buffer
+
+ Implements methods for reading data from and managing a row buffer for use
+ with the QMY_READ APIs.
+
+ @details This class supports both sync and async read modes. The max row
+ count defines the number of rows that are requested to be read. The used row
+ count defines how many rows have been read. Sync mode is reasonably
+ straightforward, but async mode has a complex system of communicating with
+ QMYSE that is optimized for low latency. In async mode, the used row count is
+ updated continuously by QMYSE as rows are read. At the same time, messages are
+ sent to the associated pipe indicating that a row has been read. As long as
+ the internal read cursor lags behind the used row count, the pipe is never
+ consulted. But if the internal read cursor "catches up to" the used row count,
+ then we block on the pipe until we find a message indicating that a new row
+ has been read or that an error has occurred.
+*/
+class IOAsyncReadBuffer : public IOReadBuffer
+{
+ public:
+ IOAsyncReadBuffer() :
+ file(0), readIsAsync(false), msgPipe(QMY_REUSE), bridge(NULL)
+ {
+ }
+
+ ~IOAsyncReadBuffer()
+ {
+ interruptRead();
+ rrnList.dealloc();
+ }
+
+
+ /**
+ Signal read operation complete
+
+ Indicates that the storage engine requires no more data from the table.
+ Must be called between calls to newReadRequest().
+ */
+ void endRead()
+ {
+#ifndef DBUG_OFF
+ if (readCursor < rowCount())
+ DBUG_PRINT("PERF:",("Wasting %d buffered rows!\n", rowCount() - readCursor));
+#endif
+ interruptRead();
+
+ file = 0;
+ bridge = NULL;
+ }
+
+ /**
+ Update data that may change on each read operation
+ */
+ void update(char newAccessIntent,
+ bool* newReleaseRowNeeded,
+ char commitLvl)
+ {
+ accessIntent = newAccessIntent;
+ releaseRowNeeded = newReleaseRowNeeded;
+ commitLevel = commitLvl;
+ }
+
+ /**
+ Read the next row in the table.
+
+ Return a pointer to the next row in the table, where "next" is defined
+ by the orientation.
+
+ @param orientaton
+ @param[out] rrn The relative record number of the row returned. Not reliable
+ if NULL is returned by this function.
+
+ @return Pointer to the row. Null if no more rows are available or an error
+ occurred.
+ */
+ char* readNextRow(char orientation, uint32& rrn)
+ {
+ DBUG_PRINT("db2i_ioBuffers::readNextRow", ("readCursor: %d, filledRows: %d, rc: %d", readCursor, rowCount(), rc));
+
+ while (readCursor >= rowCount() && !rc)
+ {
+ if (!readIsAsync)
+ loadNewRows(orientation);
+ else
+ pollNextRow(orientation);
+ }
+
+ if (readCursor >= rowCount())
+ return NULL;
+
+ rrn = rrnList[readCursor];
+ return getRowN(readCursor++);
+ }
+
+ /**
+ Retrieve the return code generated by the last operation.
+
+ @return The return code, translated to the appropriate HA_ERR_*
+ value if possible.
+ */
+ int32 lastrc()
+ {
+ return db2i_ileBridge::translateErrorCode(rc);
+ }
+
+ void rewind()
+ {
+ readCursor = 0;
+ rc = 0;
+ usedRows() = 0;
+ }
+
+ bool reachedEOD() { return EOD; }
+
+ void newReadRequest(FILE_HANDLE infile,
+ char orientation,
+ uint32 rowsToBuffer,
+ bool useAsync,
+ ILEMemHandle key,
+ int keyLength,
+ int keyParts);
+
+ private:
+
+ /**
+ End any running async read operation.
+ */
+ void interruptRead()
+ {
+ closePipe();
+ if (file && readIsAsync && (rc == 0) && (rowCount() < getRowCapacity()))
+ {
+ DBUG_PRINT("IOReadBuffer::interruptRead", ("PERF: Interrupting %d", (uint32)file));
+ getBridge()->readInterrupt(file);
+ }
+ }
+
+ void closePipe()
+ {
+ if (msgPipe != QMY_REUSE)
+ {
+ DBUG_PRINT("db2i_ioBuffers::closePipe", ("Closing pipe %d", msgPipe));
+ close(msgPipe);
+ msgPipe = QMY_REUSE;
+ }
+ }
+
+ /**
+ Get a pointer to the active ILE bridge.
+
+ Getting the bridge pointer is (relatively) expensive, so we cache
+ it off for each operation.
+ */
+ db2i_ileBridge* getBridge()
+ {
+ if (unlikely(bridge == NULL))
+ {
+ bridge = db2i_ileBridge::getBridgeForThread();
+ }
+ return bridge;
+ }
+
+ void drainPipe();
+ void pollNextRow(char orientation);
+ void prepForFree();
+ void initAfterAllocate(bool sizeChanged);
+ void loadNewRows(char orientation);
+
+
+ uint32 readCursor; // Read position within buffer
+ int32 rc; // Last return code received
+ ValidatedPointer<uint32> rrnList; // Receiver for list of rrns
+ char accessIntent; // The access intent for this read
+ char commitLevel; // What isolation level should be used
+ char EOD; // Whether end-of-data was hit
+ char readIsAsync; // Are reads to be done asynchronously?
+ bool* releaseRowNeeded;
+ /* Does the caller need to release the current row when finished reading */
+ FILE_HANDLE file; // The file to be read
+ int msgPipe;
+ /* The read descriptor of the pipe used to pass messages during async reads */
+ db2i_ileBridge* bridge; // Cached pointer to bridge
+ uint32 rowsToBlock; // Number of rows to request
+ enum
+ {
+ ConsumedFullBufferMsg,
+ PendingFullBufferMsg,
+ Untouched
+ } pipeState;
+ /* The state of the async read message pipe */
+};
+
diff --git a/storage/ibmdb2i/db2i_misc.h b/storage/ibmdb2i/db2i_misc.h
new file mode 100644
index 00000000000..1cc3f962cfc
--- /dev/null
+++ b/storage/ibmdb2i/db2i_misc.h
@@ -0,0 +1,107 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+#ifndef DB2I_MISC_H
+#define DB2I_MISC_H
+
+/**
+ Undelimit quote-delimited DB2 names in-place
+*/
+void stripExtraQuotes(char* name, uint maxLen)
+{
+ char* oldName = (char*)sql_strdup(name);
+ uint i = 0;
+ uint j = 0;
+ do
+ {
+ name[j] = oldName[i];
+ if (oldName[i] == '"' && oldName[i+1] == '"')
+ ++i;
+ } while (++j < maxLen && oldName[++i]);
+
+ if (j == maxLen)
+ --j;
+ name[j] = 0;
+}
+
+/**
+ Convert a MySQL identifier name into a DB2 compatible format
+
+ @parm input The MySQL name
+ @parm output The DB2 name
+ @parm outlen The amount of space allocated for output
+ @parm delimit Should delimiting quotes be placed around the converted name?
+ @parm delimitQuotes Should quotes in the MySQL be delimited with additional quotes?
+
+ @return FALSE if output was too small and name was truncated; TRUE otherwise
+*/
+bool convertMySQLNameToDB2Name(const char* input,
+ char* output,
+ size_t outlen,
+ bool delimit = true,
+ bool delimitQuotes = true)
+{
+ uint o = 0;
+ if (delimit)
+ output[o++] = '"';
+
+ uint i = 0;
+ do
+ {
+ output[o] = input[i];
+ if (delimitQuotes && input[i] == '"')
+ output[++o] = '"';
+ } while (++o < outlen-2 && input[++i]);
+
+ if (delimit)
+ output[o++] = '"';
+ output[min(o, outlen-1)] = 0; // This isn't the most user-friendly way to handle overflows,
+ // but at least its safe.
+ return (o <= outlen-1);
+}
+
+bool isUpperOrQuote(const CHARSET_INFO* cs, const char* s)
+{
+ while (*s)
+ {
+ if (my_isupper(cs, *s) || (*s == '"'))
+ ++s;
+ else
+ return false;
+ }
+ return true;
+}
+
+#endif
diff --git a/storage/ibmdb2i/db2i_myconv.cc b/storage/ibmdb2i/db2i_myconv.cc
new file mode 100644
index 00000000000..7be6e1236cd
--- /dev/null
+++ b/storage/ibmdb2i/db2i_myconv.cc
@@ -0,0 +1,1498 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+/**
+ @file
+
+ @brief A direct map optimization of iconv and related functions
+ This was show to significantly reduce character conversion cost
+ for short strings when compared to calling iconv system code.
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <wchar.h>
+#include <errno.h>
+#include <iconv.h>
+#include <ctype.h>
+#include <stdarg.h>
+#include <string.h>
+#include <as400_protos.h>
+
+#include "db2i_myconv.h"
+#include "db2i_global.h"
+
+int32_t myconvDebug=0;
+
+static char szGetTimeString[20];
+static char * GetTimeString(time_t now)
+{
+ struct tm * tm;
+
+ now = time(&now);
+ tm = (struct tm *) localtime(&now);
+ sprintf(szGetTimeString, "%04d/%02d/%02d %02d:%02d:%02d",
+ tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
+ tm->tm_hour, tm->tm_min, tm->tm_sec);
+
+ return szGetTimeString;
+}
+
+static MEM_ROOT dmapMemRoot;
+
+void initMyconv()
+{
+ init_alloc_root(&dmapMemRoot, 0x200, 0);
+}
+
+void cleanupMyconv()
+{
+ free_root(&dmapMemRoot,0);
+}
+
+
+#ifdef DEBUG
+/* type: */
+#define STDOUT_WITH_TIME -1 /* to stdout with time */
+#define STDERR_WITH_TIME -2 /* to stderr with time */
+#define STDOUT_WO_TIME 1 /* : to stdout */
+#define STDERR_WO_TIME 2 /* : to stderr */
+
+
+static void MyPrintf(long type,
+ char * fmt, ...)
+{
+ char StdoutFN[256];
+ va_list ap;
+ char * p;
+ time_t now;
+ FILE * fd=stderr;
+
+ if (type < 0)
+ {
+ now = time(&now);
+ fprintf(fd, "%s ", GetTimeString(now));
+ }
+ va_start(ap, fmt);
+ vfprintf(fd, fmt, ap);
+ va_end(ap);
+}
+#endif
+
+
+
+
+#define MAX_CONVERTER 128
+
+mycstoccsid(const char* pname)
+{
+ if (strcmp(pname, "UTF-16")==0)
+ return 1200;
+ else if (strcmp(pname, "big5")==0)
+ return 950;
+ else
+ return cstoccsid(pname);
+}
+#define cstoccsid mycstoccsid
+
+static struct __myconv_rec myconv_rec [MAX_CONVERTER];
+static struct __dmap_rec dmap_rec [MAX_CONVERTER];
+
+static int dmap_open(const char * to,
+ const char * from,
+ const int32_t idx)
+{
+ if (myconvIsSBCS(from) && myconvIsSBCS(to)) {
+ dmap_rec[idx].codingSchema = DMAP_S2S;
+ if ((dmap_rec[idx].dmapS2S = (uchar *) alloc_root(&dmapMemRoot, 0x100)) == NULL) {
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d), CS=%d failed with malloc(), errno = %d in %s at %d\n",
+ to, from, idx, DMAP_S2S, errno, __FILE__,__LINE__);
+#endif
+ return -1;
+ }
+ memset(dmap_rec[idx].dmapS2S, 0x00, 0x100);
+ myconv_rec[idx].allocatedSize=0x100;
+
+ {
+ char dmapSrc[0x100];
+ iconv_t cd;
+ int32_t i;
+ size_t inBytesLeft=0x100;
+ size_t outBytesLeft=0x100;
+ size_t len;
+ char * inBuf=dmapSrc;
+ char * outBuf=(char *) dmap_rec[idx].dmapS2S;
+
+ if ((cd = iconv_open(to, from)) == (iconv_t) -1) {
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d) failed with iconv_open(), errno = %d in %s at %d\n",
+ to, from, idx, errno, __FILE__,__LINE__);
+#endif
+ return -1;
+ }
+
+ inBytesLeft = 0x100;
+ for (i = 0; i < inBytesLeft; ++i)
+ dmapSrc[i]=i;
+
+ do {
+ if ((len = iconv(cd, &inBuf, &inBytesLeft, &outBuf, &outBytesLeft)) != (size_t) 0) {
+#ifdef DEBUG
+ if (myconvDebug) {
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d), CS=%d: iconv() returns %d, errno = %d in %s at %d\n",
+ to, from, idx, DMAP_S2S, len, errno, __FILE__,__LINE__);
+ MyPrintf(STDERR_WITH_TIME,
+ "inBytesLeft = %d, inBuf - dmapSrc = %d\n", inBytesLeft, inBuf-dmapSrc);
+ MyPrintf(STDERR_WITH_TIME,
+ "outBytesLeft = %d, outBuf - dmapS2S = %d\n", outBytesLeft, outBuf-(char *) dmap_rec[idx].dmapS2S);
+ }
+ if ((inBytesLeft == 86 || inBytesLeft == 64 || inBytesLeft == 1) &&
+ memcmp(from, "IBM-1256", 9) == 0 &&
+ memcmp(to, "IBM-420", 8) == 0) {
+ /* Known problem for IBM-1256_IBM-420 */
+ --inBytesLeft;
+ ++inBuf;
+ *outBuf=0x00;
+ ++outBuf;
+ --outBytesLeft;
+ continue;
+ } else if ((inBytesLeft == 173 || inBytesLeft == 172 ||
+ inBytesLeft == 74 || inBytesLeft == 73 ||
+ inBytesLeft == 52 || inBytesLeft == 50 ||
+ inBytesLeft == 31 || inBytesLeft == 20 ||
+ inBytesLeft == 6) &&
+ memcmp(to, "IBM-1256", 9) == 0 &&
+ memcmp(from, "IBM-420", 8) == 0) {
+ /* Known problem for IBM-420_IBM-1256 */
+ --inBytesLeft;
+ ++inBuf;
+ *outBuf=0x00;
+ ++outBuf;
+ --outBytesLeft;
+ continue;
+ } else if ((128 >= inBytesLeft) &&
+ memcmp(to, "IBM-037", 8) == 0 &&
+ memcmp(from, "IBM-367", 8) == 0) {
+ /* Known problem for IBM-367_IBM-037 */
+ --inBytesLeft;
+ ++inBuf;
+ *outBuf=0x00;
+ ++outBuf;
+ --outBytesLeft;
+ continue;
+ } else if (((1 <= inBytesLeft && inBytesLeft <= 4) || (97 <= inBytesLeft && inBytesLeft <= 128)) &&
+ memcmp(to, "IBM-838", 8) == 0 &&
+ memcmp(from, "TIS-620", 8) == 0) {
+ /* Known problem for TIS-620_IBM-838 */
+ --inBytesLeft;
+ ++inBuf;
+ *outBuf=0x00;
+ ++outBuf;
+ --outBytesLeft;
+ continue;
+ }
+ iconv_close(cd);
+ return -1;
+#else
+ /* Tolerant to undefined conversions for any converter */
+ --inBytesLeft;
+ ++inBuf;
+ *outBuf=0x00;
+ ++outBuf;
+ --outBytesLeft;
+ continue;
+#endif
+ }
+ } while (inBytesLeft > 0);
+
+ if (myconvIsISO(to))
+ myconv_rec[idx].subS=0x1A;
+ else if (myconvIsASCII(to))
+ myconv_rec[idx].subS=0x7F;
+ else if (myconvIsEBCDIC(to))
+ myconv_rec[idx].subS=0x3F;
+
+ if (myconvIsISO(from))
+ myconv_rec[idx].srcSubS=0x1A;
+ else if (myconvIsASCII(from))
+ myconv_rec[idx].srcSubS=0x7F;
+ else if (myconvIsEBCDIC(from))
+ myconv_rec[idx].srcSubS=0x3F;
+
+ iconv_close(cd);
+ }
+ } else if (((myconvIsSBCS(from) && myconvIsUnicode2(to)) && (dmap_rec[idx].codingSchema = DMAP_S2U)) ||
+ ((myconvIsSBCS(from) && myconvIsUTF8(to)) && (dmap_rec[idx].codingSchema = DMAP_S28))) {
+ int i;
+
+ /* single byte mapping */
+ if ((dmap_rec[idx].dmapD12U = (UniChar *) alloc_root(&dmapMemRoot, 0x100 * 2)) == NULL) {
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d), CS=%d failed with malloc(), errno = %d in %s at %d\n",
+ to, from, idx, DMAP_S2U, errno, __FILE__,__LINE__);
+#endif
+ return -1;
+ }
+ memset(dmap_rec[idx].dmapD12U, 0x00, 0x100 * 2);
+ myconv_rec[idx].allocatedSize=0x100 * 2;
+
+
+ {
+ char dmapSrc[2];
+ iconv_t cd;
+ int32_t i;
+ size_t inBytesLeft;
+ size_t outBytesLeft;
+ size_t len;
+ char * inBuf;
+ char * outBuf;
+ char SS=0x1A;
+#ifdef support_surrogate
+ if ((cd = iconv_open("UTF-16", from)) == (iconv_t) -1) {
+#else
+ if ((cd = iconv_open("UCS-2", from)) == (iconv_t) -1) {
+#endif
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d) failed with iconv_open(), errno = %d in %s at %d\n",
+ to, from, idx, errno, __FILE__,__LINE__);
+#endif
+ return -1;
+ }
+
+ for (i = 0; i < 0x100; ++i) {
+ dmapSrc[0]=i;
+ inBuf=dmapSrc;
+ inBytesLeft=1;
+ outBuf=(char *) &(dmap_rec[idx].dmapD12U[i]);
+ outBytesLeft=2;
+ if ((len = iconv(cd, &inBuf, &inBytesLeft, &outBuf, &outBytesLeft)) != (size_t) 0) {
+ if ((errno == EILSEQ || errno == EINVAL) &&
+ inBytesLeft == 1 &&
+ outBytesLeft == 2) {
+ continue;
+ } else {
+#ifdef DEBUG
+ if (myconvDebug) {
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d) failed to initialize with iconv(cd,%02x,%d,%02x%02x,%d), errno = %d in %s at %d\n",
+ to, from, idx, dmapSrc[0], 1,
+ (&dmap_rec[idx].dmapD12U[i])[0],(&dmap_rec[idx].dmapD12U[i])[1], 2,
+ errno, __FILE__,__LINE__);
+ MyPrintf(STDERR_WITH_TIME,
+ "inBytesLeft=%d, outBytesLeft=%d, %02x%02x\n",
+ inBytesLeft, outBytesLeft,
+ (&dmap_rec[idx].dmapD12U[i])[0],(&dmap_rec[idx].dmapD12U[i])[1]);
+ }
+#endif
+ iconv_close(cd);
+ return -1;
+ }
+ dmap_rec[idx].dmapD12U[i]=0x0000;
+ }
+ if (dmap_rec[idx].dmapE02U[i] == 0x001A && /* pick the first one */
+ myconv_rec[idx].srcSubS == 0x00) {
+ myconv_rec[idx].srcSubS=i;
+ }
+ }
+ iconv_close(cd);
+ }
+ myconv_rec[idx].subS=0x1A;
+ myconv_rec[idx].subD=0xFFFD;
+
+
+ } else if (((myconvIsUCS2(from) && myconvIsSBCS(to)) && (dmap_rec[idx].codingSchema = DMAP_U2S)) ||
+ ((myconvIsUTF16(from) && myconvIsSBCS(to)) && (dmap_rec[idx].codingSchema = DMAP_T2S)) ||
+ ((myconvIsUTF8(from) && myconvIsSBCS(to)) && (dmap_rec[idx].codingSchema = DMAP_82S))) {
+ /* UTF-16 -> SBCS, the direct map a bit of waste of space,
+ * binary search may be reasonable alternative
+ */
+ if ((dmap_rec[idx].dmapU2S = (uchar *) alloc_root(&dmapMemRoot, 0x10000 * 2)) == NULL) {
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d), CS=%d failed with malloc(), errno = %d in %s at %d\n",
+ to, from, idx, DMAP_U2S, errno, __FILE__,__LINE__);
+#endif
+ return -1;
+ }
+ memset(dmap_rec[idx].dmapU2S, 0x00, 0x10000);
+ myconv_rec[idx].allocatedSize=(0x10000 * 2);
+
+ {
+ iconv_t cd;
+ int32_t i;
+
+#ifdef support_surrogate
+ if ((cd = iconv_open(to, "UTF-16")) == (iconv_t) -1) {
+#else
+ if ((cd = iconv_open(to, "UCS-2")) == (iconv_t) -1) {
+#endif
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d) failed with iconv_open(), errno = %d in %s at %d\n",
+ to, from, idx, errno, __FILE__,__LINE__);
+#endif
+ return -1;
+ }
+
+ for (i = 0; i < 0x100; ++i) {
+ UniChar dmapSrc[0x100];
+ int32_t j;
+ for (j = 0; j < 0x100; ++j) {
+ dmapSrc[j]=i * 0x100 + j;
+ }
+ char * inBuf=(char *) dmapSrc;
+ char * outBuf=(char *) &(dmap_rec[idx].dmapU2S[i*0x100]);
+ size_t inBytesLeft=sizeof(dmapSrc);
+ size_t outBytesLeft=0x100;
+ size_t len;
+
+ if ((len = iconv(cd, &inBuf, &inBytesLeft, &outBuf, &outBytesLeft)) != (size_t) 0) {
+ if (inBytesLeft == 0 && outBytesLeft == 0) { /* a number of substitution returns */
+ continue;
+ }
+#ifdef DEBUG
+ if (myconvDebug) {
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d) failed to initialize with iconv(), errno = %d in %s at %d\n",
+ from, to, idx, errno, __FILE__,__LINE__);
+ MyPrintf(STDERR_WITH_TIME,
+ "iconv() retuns %d, errno=%d, InBytesLeft=%d, OutBytesLeft=%d\n",
+ len, errno, inBytesLeft, outBytesLeft, __FILE__,__LINE__);
+ }
+#endif
+ iconv_close(cd);
+ return -1;
+ }
+ }
+ iconv_close(cd);
+
+ myconv_rec[idx].subS = dmap_rec[idx].dmapU2S[0x1A];
+ myconv_rec[idx].subD = dmap_rec[idx].dmapU2S[0xFFFD];
+ myconv_rec[idx].srcSubS = 0x1A;
+ myconv_rec[idx].srcSubD = 0xFFFD;
+ }
+
+
+
+ } else if (((myconvIsDBCS(from) && myconvIsUnicode2(to)) && (dmap_rec[idx].codingSchema = DMAP_D2U)) ||
+ ((myconvIsDBCS(from) && myconvIsUTF8(to)) && (dmap_rec[idx].codingSchema = DMAP_D28))) {
+ int i;
+ /* single byte mapping */
+ if ((dmap_rec[idx].dmapD12U = (UniChar *) alloc_root(&dmapMemRoot, 0x100 * 2)) == NULL) {
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d), CS=%d failed with malloc(), errno = %d in %s at %d\n",
+ to, from, idx, DMAP_D2U, errno, __FILE__,__LINE__);
+#endif
+ return -1;
+ }
+ memset(dmap_rec[idx].dmapD12U, 0x00, 0x100 * 2);
+
+ /* double byte mapping, assume 7 bit ASCII is not use as the first byte of DBCS. */
+ if ((dmap_rec[idx].dmapD22U = (UniChar *) alloc_root(&dmapMemRoot, 0x8000 * 2)) == NULL) {
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d), CS=%d failed with malloc(), errno = %d in %s at %d\n",
+ to, from, idx, DMAP_D2U, errno, __FILE__,__LINE__);
+#endif
+ return -1;
+ }
+ memset(dmap_rec[idx].dmapD22U, 0x00, 0x8000 * 2);
+
+ myconv_rec[idx].allocatedSize=(0x100 + 0x8000) * 2;
+
+
+ {
+ char dmapSrc[2];
+ iconv_t cd;
+ int32_t i;
+ size_t inBytesLeft;
+ size_t outBytesLeft;
+ size_t len;
+ char * inBuf;
+ char * outBuf;
+ char SS=0x1A;
+
+#ifdef support_surrogate
+ if ((cd = iconv_open("UTF-16", from)) == (iconv_t) -1) {
+#else
+ if ((cd = iconv_open("UCS-2", from)) == (iconv_t) -1) {
+#endif
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d) failed with iconv_open(), errno = %d in %s at %d\n",
+ to, from, idx, errno, __FILE__,__LINE__);
+#endif
+ return -1;
+ }
+
+ for (i = 0; i < 0x100; ++i) {
+ dmapSrc[0]=i;
+ inBuf=dmapSrc;
+ inBytesLeft=1;
+ outBuf=(char *) (&dmap_rec[idx].dmapD12U[i]);
+ outBytesLeft=2;
+ if ((len = iconv(cd, &inBuf, &inBytesLeft, &outBuf, &outBytesLeft)) != (size_t) 0) {
+ if ((errno == EILSEQ || errno == EINVAL) &&
+ inBytesLeft == 1 &&
+ outBytesLeft == 2) {
+ continue;
+ } else {
+#ifdef DEBUG
+ if (myconvDebug) {
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d) failed to initialize with iconv(cd,%02x,%d,%02x%02x,%d), errno = %d in %s at %d\n",
+ to, from, idx, dmapSrc[0], 1,
+ (&dmap_rec[idx].dmapD12U[i])[0],(&dmap_rec[idx].dmapD12U[i])[1], 2,
+ errno, __FILE__,__LINE__);
+ MyPrintf(STDERR_WITH_TIME,
+ "inBytesLeft=%d, outBytesLeft=%d, %02x%02x\n",
+ inBytesLeft, outBytesLeft,
+ (&dmap_rec[idx].dmapD12U[i])[0],(&dmap_rec[idx].dmapD12U[i])[1]);
+ }
+#endif
+ iconv_close(cd);
+ return -1;
+ }
+ dmap_rec[idx].dmapD12U[i]=0x0000;
+ }
+ if (dmap_rec[idx].dmapD12U[i] == 0x001A && /* pick the first one */
+ myconv_rec[idx].srcSubS == 0x00) {
+ myconv_rec[idx].srcSubS=i;
+ }
+ }
+
+
+ for (i = 0x80; i < 0x100; ++i) {
+ int j;
+ if (dmap_rec[idx].dmapD12U[i] != 0x0000)
+ continue;
+ for (j = 0x01; j < 0x100; ++j) {
+ dmapSrc[0]=i;
+ dmapSrc[1]=j;
+ int offset = i-0x80;
+ offset<<=8;
+ offset+=j;
+
+ inBuf=dmapSrc;
+ inBytesLeft=2;
+ outBuf=(char *) &(dmap_rec[idx].dmapD22U[offset]);
+ outBytesLeft=2;
+ if ((len = iconv(cd, &inBuf, &inBytesLeft, &outBuf, &outBytesLeft)) != (size_t) 0) {
+ if (inBytesLeft == 2 && outBytesLeft == 2 && (errno == EILSEQ || errno == EINVAL)) {
+ ; /* invalid DBCS character, dmapDD2U[offset] remains 0x0000 */
+ } else {
+#ifdef DEBUG
+ if (myconvDebug) {
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d) failed to initialize with iconv(cd,%p,2,%p,2), errno = %d in %s at %d\n",
+ to, from, idx,
+ dmapSrc, &(dmap_rec[idx].dmapD22U[offset]),
+ errno, __FILE__,__LINE__);
+ MyPrintf(STDERR_WO_TIME,
+ "iconv(cd,0x%02x%02x,2,0x%04x,2) returns %d, inBytesLeft=%d, outBytesLeft=%d\n",
+ dmapSrc[0], dmapSrc[1],
+ dmap_rec[idx].dmapD22U[offset],
+ len, inBytesLeft, outBytesLeft);
+ }
+#endif
+ iconv_close(cd);
+ return -1;
+ }
+ } else {
+#ifdef TRACE_DMAP
+ if (myconvDebug) {
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d) failed to initialize with iconv(), rc=%d, errno=%d in %s at %d\n",
+ to, from, idx, len, errno, __FILE__,__LINE__);
+ MyPrintf(STDERR_WITH_TIME,
+ "%04X: src=%04X%04X, inBuf=0x%02X%02X, inBytesLeft=%d, outBuf=%02X%02X%02X, outBytesLeft=%d\n",
+ i, dmapSrc[0], dmapSrc[1], inBuf[0], inBuf[1],
+ inBytesLeft, outBuf[-2], outBuf[-1], outBuf[0], outBytesLeft);
+ MyPrintf(STDERR_WITH_TIME,
+ "&dmapSrc=%p, inBuf=%p, %p, outBuf=%p\n",
+ dmapSrc, inBuf, dmap_rec[idx].dmapU2M3 + (i - 0x80) * 2, outBuf);
+ }
+#endif
+ }
+ }
+ if (dmap_rec[idx].dmapD12U[i] == 0xFFFD) { /* pick the last one */
+ myconv_rec[idx].srcSubD=i* 0x100 + j;
+ }
+ }
+ iconv_close(cd);
+ }
+
+ myconv_rec[idx].subS=0x1A;
+ myconv_rec[idx].subD=0xFFFD;
+ myconv_rec[idx].srcSubD=0xFCFC;
+
+
+ } else if (((myconvIsUCS2(from) && myconvIsDBCS(to)) && (dmap_rec[idx].codingSchema = DMAP_U2D)) ||
+ ((myconvIsUTF16(from) && myconvIsDBCS(to)) && (dmap_rec[idx].codingSchema = DMAP_T2D)) ||
+ ((myconvIsUTF8(from) && myconvIsDBCS(to)) && (dmap_rec[idx].codingSchema = DMAP_82D))) {
+ /* UTF-16 -> DBCS single/double byte */
+ /* A single table will cover all characters, assuming no second byte is 0x00. */
+ if ((dmap_rec[idx].dmapU2D = (uchar *) alloc_root(&dmapMemRoot, 0x10000 * 2)) == NULL) {
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d), CS=%d failed with malloc(), errno = %d in %s at %d\n",
+ to, from, idx, DMAP_U2D, errno, __FILE__,__LINE__);
+#endif
+ return -1;
+ }
+
+ memset(dmap_rec[idx].dmapU2D, 0x00, 0x10000 * 2);
+ myconv_rec[idx].allocatedSize=(0x10000 * 2);
+
+ {
+ UniChar dmapSrc[1];
+ iconv_t cd;
+ int32_t i;
+ size_t inBytesLeft;
+ size_t outBytesLeft;
+ size_t len;
+ char * inBuf;
+ char * outBuf;
+
+#ifdef support_surrogate
+ if ((cd = iconv_open(to, "UTF-16")) == (iconv_t) -1) {
+#else
+ if ((cd = iconv_open(to, "UCS-2")) == (iconv_t) -1) {
+#endif
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d) failed with iconv_open(), errno = %d in %s at %d\n",
+ to, from, idx, errno, __FILE__,__LINE__);
+#endif
+ return -1;
+ }
+
+ /* easy implementation, convert 1 Unicode character at one time. */
+ /* If the open performance is an issue, convert a chunk such as 128 chracters. */
+ /* if the converted length is not the same as the original, convert one by one. */
+ (dmap_rec[idx].dmapU2D)[0x0000]=0x00;
+ for (i = 1; i < 0x10000; ++i) {
+ dmapSrc[0]=i;
+ inBuf=(char *) dmapSrc;
+ inBytesLeft=2;
+ outBuf=(char *) &((dmap_rec[idx].dmapU2D)[2*i]);
+ outBytesLeft=2;
+ do {
+ if ((len = iconv(cd, &inBuf, &inBytesLeft, &outBuf, &outBytesLeft)) != (size_t) 0) {
+ if (len == 1 && inBytesLeft == 0 && outBytesLeft == 1 && (dmap_rec[idx].dmapU2D)[2*i] == 0x1A) {
+ /* UCS-2_TIS-620:0x0080 => 0x1A, converted to SBCS replacement character */
+ (dmap_rec[idx].dmapU2D)[2*i+1]=0x00;
+ break;
+ } else if (len == 1 && inBytesLeft == 0 && outBytesLeft == 0) {
+ break;
+ }
+ if (errno == EILSEQ || errno == EINVAL) {
+#ifdef DEBUG
+ if (myconvDebug) {
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d) failed to initialize with iconv(), errno = %d in %s at %d\n",
+ to, from, idx, errno, __FILE__,__LINE__);
+ MyPrintf(STDERR_WO_TIME,
+ "iconv(cd,%04x,2,%02x%02x,2) returns inBytesLeft=%d, outBytesLeft=%d\n",
+ dmapSrc[0],
+ (dmap_rec[idx].dmapU2D)[2*i], (dmap_rec[idx].dmapU2D)[2*i+1],
+ inBytesLeft, outBytesLeft);
+ if (outBuf - (char *) dmap_rec[idx].dmapU2M2 > 1)
+ MyPrintf(STDERR_WO_TIME, "outBuf[-2..2]=%02X%02X%02X%02X%02X\n", outBuf[-2],outBuf[-1],outBuf[0],outBuf[1],outBuf[2]);
+ else
+ MyPrintf(STDERR_WO_TIME, "outBuf[0..2]=%02X%02X%02X\n", outBuf[0],outBuf[1],outBuf[2]);
+ }
+#endif
+ inBuf+=2;
+ inBytesLeft-=2;
+ memcpy(outBuf, (char *) &(myconv_rec[idx].subD), 2);
+ outBuf+=2;
+ outBytesLeft-=2;
+ } else {
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "[%d] dmap_open(%s,%s,%d) failed to initialize with iconv(), errno = %d in %s at %d\n",
+ i, to, from, idx, errno, __FILE__,__LINE__);
+ MyPrintf(STDERR_WO_TIME,
+ "iconv(cd,%04x,2,%02x%02x,2) returns %d inBytesLeft=%d, outBytesLeft=%d\n",
+ dmapSrc[0],
+ (dmap_rec[idx].dmapU2D)[2*i],
+ (dmap_rec[idx].dmapU2D)[2*i+1],
+ len, inBytesLeft,outBytesLeft);
+ if (i == 1) {
+ MyPrintf(STDERR_WO_TIME,
+ " inBuf [-1..2]=%02x%02x%02x%02x\n",
+ inBuf[-1],inBuf[0],inBuf[1],inBuf[2]);
+ MyPrintf(STDERR_WO_TIME,
+ " outBuf [-1..2]=%02x%02x%02x%02x\n",
+ outBuf[-1],outBuf[0],outBuf[1],outBuf[2]);
+ } else {
+ MyPrintf(STDERR_WO_TIME,
+ " inBuf [-2..2]=%02x%02x%02x%02x%02x\n",
+ inBuf[-2],inBuf[-1],inBuf[0],inBuf[1],inBuf[2]);
+ MyPrintf(STDERR_WO_TIME,
+ " outBuf [-2..2]=%02x%02x%02x%02x%02x\n",
+ outBuf[-2],outBuf[-1],outBuf[0],outBuf[1],outBuf[2]);
+ }
+#endif
+ iconv_close(cd);
+ return -1;
+ }
+ if (len == 0 && inBytesLeft == 0 && outBytesLeft == 1) { /* converted to SBCS */
+ (dmap_rec[idx].dmapU2D)[2*i+1]=0x00;
+ break;
+ }
+ }
+ } while (inBytesLeft > 0);
+ }
+ iconv_close(cd);
+ myconv_rec[idx].subS = dmap_rec[idx].dmapU2D[2*0x1A];
+ myconv_rec[idx].subD = dmap_rec[idx].dmapU2D[2*0xFFFD] * 0x100
+ + dmap_rec[idx].dmapU2D[2*0xFFFD+1];
+ myconv_rec[idx].srcSubS = 0x1A;
+ myconv_rec[idx].srcSubD = 0xFFFD;
+ }
+
+
+ } else if (((myconvIsEUC(from) && myconvIsUnicode2(to)) && (dmap_rec[idx].codingSchema = DMAP_E2U)) ||
+ ((myconvIsEUC(from) && myconvIsUTF8(to)) && (dmap_rec[idx].codingSchema = DMAP_E28))) {
+ int i;
+ /* S0: 0x00 - 0x7F */
+ if ((dmap_rec[idx].dmapE02U = (UniChar *) alloc_root(&dmapMemRoot, 0x100 * 2)) == NULL) {
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d), CS=%d failed with malloc(), errno = %d in %s at %d\n",
+ to, from, idx, DMAP_E2U, errno, __FILE__,__LINE__);
+#endif
+ return -1;
+ }
+ memset(dmap_rec[idx].dmapE02U, 0x00, 0x100 * 2);
+
+ /* S1: 0xA0 - 0xFF, 0xA0 - 0xFF */
+ if ((dmap_rec[idx].dmapE12U = (UniChar *) alloc_root(&dmapMemRoot, 0x60 * 0x60 * 2)) == NULL) {
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d), CS=%d failed with malloc(), errno = %d in %s at %d\n",
+ to, from, idx, DMAP_E2U, errno, __FILE__,__LINE__);
+#endif
+ return -1;
+ }
+ memset(dmap_rec[idx].dmapE12U, 0x00, 0x60 * 0x60 * 2);
+
+ /* SS2: 0x8E + 0xA0 - 0xFF, 0xA0 - 0xFF */
+ if ((dmap_rec[idx].dmapE22U = (UniChar *) alloc_root(&dmapMemRoot, 0x60 * 0x61 * 2)) == NULL) {
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d), CS=%d failed with malloc(), errno = %d in %s at %d\n",
+ to, from, idx, DMAP_E2U, errno, __FILE__,__LINE__);
+#endif
+ return -1;
+ }
+ memset(dmap_rec[idx].dmapE22U, 0x00, 0x60 * 0x61 * 2);
+
+ /* SS3: 0x8F + 0xA0 - 0xFF, 0xA0 - 0xFF */
+ if ((dmap_rec[idx].dmapE32U = (UniChar *) alloc_root(&dmapMemRoot, 0x60 * 0x61 * 2)) == NULL) {
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d), CS=%d failed with malloc(), errno = %d in %s at %d\n",
+ to, from, idx, DMAP_E2U, errno, __FILE__,__LINE__);
+#endif
+ return -1;
+ }
+ memset(dmap_rec[idx].dmapE32U, 0x00, 0x60 * 0x61 * 2);
+
+ myconv_rec[idx].allocatedSize=(0x100 + 0x60 * 0x60 + 0x60 * 0x61* 2) * 2;
+
+
+ {
+ char dmapSrc[0x60 * 0x60 * 3];
+ iconv_t cd;
+ int32_t i;
+ size_t inBytesLeft;
+ size_t outBytesLeft;
+ size_t len;
+ char * inBuf;
+ char * outBuf;
+ char SS=0x8E;
+
+#ifdef support_surrogate
+ if ((cd = iconv_open("UTF-16", from)) == (iconv_t) -1) {
+#else
+ if ((cd = iconv_open("UCS-2", from)) == (iconv_t) -1) {
+#endif
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d) failed with iconv_open(), errno = %d in %s at %d\n",
+ to, from, idx, errno, __FILE__,__LINE__);
+#endif
+ return -1;
+ }
+
+ for (i = 0; i < 0x100; ++i) {
+ dmapSrc[0]=i;
+ inBuf=dmapSrc;
+ inBytesLeft=1;
+ outBuf=(char *) (&dmap_rec[idx].dmapE02U[i]);
+ outBytesLeft=2;
+ if ((len = iconv(cd, &inBuf, &inBytesLeft, &outBuf, &outBytesLeft)) != (size_t) 0) {
+#ifdef DEBUG
+ if (myconvDebug) {
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d) failed to initialize with iconv(), errno = %d in %s at %d\n",
+ to, from, idx, errno, __FILE__,__LINE__);
+ }
+#endif
+ dmap_rec[idx].dmapE02U[i]=0x0000;
+ }
+ if (dmap_rec[idx].dmapE02U[i] == 0x001A && /* pick the first one */
+ myconv_rec[idx].srcSubS == 0x00) {
+ myconv_rec[idx].srcSubS=i;
+ }
+ }
+
+
+ inBuf=dmapSrc;
+ for (i = 0; i < 0x60; ++i) {
+ int j;
+ for (j = 0; j < 0x60; ++j) {
+ *inBuf=i+0xA0;
+ ++inBuf;
+ *inBuf=j+0xA0;
+ ++inBuf;
+ }
+ }
+ inBuf=dmapSrc;
+ inBytesLeft=0x60 * 0x60 * 2;
+ outBuf=(char *) dmap_rec[idx].dmapE12U;
+ outBytesLeft=0x60 * 0x60 * 2;
+ do {
+ if ((len = iconv(cd, &inBuf, &inBytesLeft, &outBuf, &outBytesLeft)) != (size_t) 0) {
+ if (errno == EILSEQ) {
+#ifdef DEBUG
+ if (myconvDebug) {
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d) failed to initialize with iconv(), errno = %d in %s at %d\n",
+ to, from, idx, errno, __FILE__,__LINE__);
+ MyPrintf(STDERR_WO_TIME, "inBytesLeft=%d, outBytesLeft=%d\n", inBytesLeft, outBytesLeft);
+ if (inBuf - dmapSrc > 1 && inBuf - dmapSrc <= sizeof(dmapSrc) - 2)
+ MyPrintf(STDERR_WO_TIME, "inBuf[-2..2]=%02X%02X%02X%02X%02X\n", inBuf[-2],inBuf[-1],inBuf[0],inBuf[1],inBuf[2]);
+ else
+ MyPrintf(STDERR_WO_TIME, "inBuf[0..2]=%02X%02X%02X\n", inBuf[0],inBuf[1],inBuf[2]);
+ if (outBuf - (char *) dmap_rec[idx].dmapE12U > 1)
+ MyPrintf(STDERR_WO_TIME, "outBuf[-2..2]=%02X%02X%02X%02X%02X\n", outBuf[-2],outBuf[-1],outBuf[0],outBuf[1],outBuf[2]);
+ else
+ MyPrintf(STDERR_WO_TIME, "outBuf[0..2]=%02X%02X%02X\n", outBuf[0],outBuf[1],outBuf[2]);
+ }
+#endif
+ inBuf+=2;
+ inBytesLeft-=2;
+ outBuf[0]=0x00;
+ outBuf[1]=0x00;
+ outBuf+=2;
+ outBytesLeft-=2;
+ } else {
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d) failed to initialize with iconv(), errno = %d in %s at %d\n",
+ to, from, idx, errno, __FILE__,__LINE__);
+#endif
+ iconv_close(cd);
+ return -1;
+ }
+ }
+ } while (inBytesLeft > 0);
+
+ /* SS2: 0x8E + 1 or 2 bytes */
+ /* SS3: 0x8E + 1 or 2 bytes */
+ while (SS != 0x00) {
+ int32_t numSuccess=0;
+ for (i = 0; i < 0x60; ++i) {
+ inBuf=dmapSrc;
+ inBuf[0]=SS;
+ inBuf[1]=i+0xA0;
+ inBytesLeft=2;
+ if (SS == 0x8E)
+ outBuf=(char *) &(dmap_rec[idx].dmapE22U[i]);
+ else
+ outBuf=(char *) &(dmap_rec[idx].dmapE32U[i]);
+ outBytesLeft=2;
+ if ((len = iconv(cd, &inBuf, &inBytesLeft, &outBuf, &outBytesLeft)) != (size_t) 0) {
+ if (SS == 0x8E)
+ dmap_rec[idx].dmapE22U[i]=0x0000;
+ else
+ dmap_rec[idx].dmapE32U[i]=0x0000;
+ } else {
+ ++numSuccess;
+ }
+ }
+ if (numSuccess == 0) { /* SS2 is 2 bytes */
+ inBuf=dmapSrc;
+ for (i = 0; i < 0x60; ++i) {
+ int j;
+ for (j = 0; j < 0x60; ++j) {
+ *inBuf=SS;
+ ++inBuf;
+ *inBuf=i+0xA0;
+ ++inBuf;
+ *inBuf=j+0xA0;
+ ++inBuf;
+ }
+ }
+ inBuf=dmapSrc;
+ inBytesLeft=0x60 * 0x60 * 3;
+ if (SS == 0x8E)
+ outBuf=(char *) &(dmap_rec[idx].dmapE22U[0x60]);
+ else
+ outBuf=(char *) &(dmap_rec[idx].dmapE32U[0x60]);
+ outBytesLeft=0x60 * 0x60 * 2;
+ do {
+ if ((len = iconv(cd, &inBuf, &inBytesLeft, &outBuf, &outBytesLeft)) != (size_t) 0) {
+#ifdef DEBUG
+ if (myconvDebug) {
+ MyPrintf(STDERR_WITH_TIME,
+ "%02X:dmap_open(%s,%s,%d) failed to initialize with iconv(), errno = %d in %s at %d\n",
+ SS, to, from, idx, errno, __FILE__,__LINE__);
+ MyPrintf(STDERR_WO_TIME, "inBytesLeft=%d, outBytesLeft=%d\n", inBytesLeft, outBytesLeft);
+ if (inBuf - dmapSrc > 1 && inBuf - dmapSrc <= sizeof(dmapSrc) - 2)
+ MyPrintf(STDERR_WO_TIME, "inBuf[-2..2]=%02X%02X%02X%02X%02X\n", inBuf[-2],inBuf[-1],inBuf[0],inBuf[1],inBuf[2]);
+ else
+ MyPrintf(STDERR_WO_TIME, "inBuf[0..2]=%02X%02X%02X\n", inBuf[0],inBuf[1],inBuf[2]);
+ }
+#endif
+ if (errno == EILSEQ || errno == EINVAL) {
+ inBuf+=3;
+ inBytesLeft-=3;
+ outBuf[0]=0x00;
+ outBuf[1]=0x00;
+ outBuf+=2;
+ outBytesLeft-=2;
+ } else {
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "%02X:dmap_open(%s,%s,%d) failed to initialize with iconv(), errno = %d in %s at %d\n",
+ SS, to, from, idx, errno, __FILE__,__LINE__);
+#endif
+ iconv_close(cd);
+ return -1;
+ }
+ }
+ } while (inBytesLeft > 0);
+ }
+ if (SS == 0x8E)
+ SS=0x8F;
+ else
+ SS = 0x00;
+ }
+ iconv_close(cd);
+
+ myconv_rec[idx].subS=0x1A;
+ myconv_rec[idx].subD=0xFFFD;
+ for (i = 0; i < 0x80; ++i) {
+ if (dmap_rec[idx].dmapE02U[i] == 0x001A) {
+ myconv_rec[idx].srcSubS=i; /* pick the first one */
+ break;
+ }
+ }
+
+ for (i = 0; i < 0x60 * 0x60; ++i) {
+ if (dmap_rec[idx].dmapE12U[i] == 0xFFFD) {
+ uchar byte1=i / 0x60;
+ uchar byte2=i % 0x60;
+ myconv_rec[idx].srcSubD=(byte1 + 0xA0) * 0x100 + (byte2 + 0xA0); /* pick the last one */
+ }
+ }
+
+ }
+
+ } else if (((myconvIsUCS2(from) && myconvIsEUC(to)) && (dmap_rec[idx].codingSchema = DMAP_U2E)) ||
+ ((myconvIsUTF16(from) && myconvIsEUC(to)) && (dmap_rec[idx].codingSchema = DMAP_T2E)) ||
+ ((myconvIsUTF8(from) && myconvIsEUC(to)) && (dmap_rec[idx].codingSchema = DMAP_82E))) {
+ /* S0: 0x00 - 0xFF */
+ if ((dmap_rec[idx].dmapU2S = (uchar *) alloc_root(&dmapMemRoot, 0x100)) == NULL) {
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d), CS=%d failed with malloc(), errno = %d in %s at %d\n",
+ to, from, idx, DMAP_U2E, errno, __FILE__,__LINE__);
+#endif
+ return -1;
+ }
+ memset(dmap_rec[idx].dmapU2S, 0x00, 0x100);
+
+ /* U0080 - UFFFF -> S1: 0xA0 - 0xFF, 0xA0 - 0xFF */
+ if ((dmap_rec[idx].dmapU2M2 = (uchar *) alloc_root(&dmapMemRoot, 0xFF80 * 2)) == NULL) {
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d), CS=%d failed with malloc(), errno = %d in %s at %d\n",
+ to, from, idx, DMAP_U2E, errno, __FILE__,__LINE__);
+#endif
+ return -1;
+ }
+ memset(dmap_rec[idx].dmapU2M2, 0x00, 0xFF80 * 2);
+
+ /* U0080 - UFFFF -> SS2: 0x8E + 0xA0 - 0xFF, 0xA0 - 0xFF
+ * SS3: 0x8F + 0xA0 - 0xFF, 0xA0 - 0xFF */
+ if ((dmap_rec[idx].dmapU2M3 = (uchar *) alloc_root(&dmapMemRoot, 0xFF80 * 3)) == NULL) {
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d), CS=%d failed with malloc(), errno = %d in %s at %d\n",
+ to, from, idx, DMAP_U2E, errno, __FILE__,__LINE__);
+#endif
+ return -1;
+ }
+ memset(dmap_rec[idx].dmapU2M3, 0x00, 0xFF80 * 3);
+ myconv_rec[idx].allocatedSize=(0x100 + 0xFF80 * 2 + 0xFF80 * 3);
+
+ {
+ UniChar dmapSrc[0x80];
+ iconv_t cd;
+ int32_t i;
+ size_t inBytesLeft;
+ size_t outBytesLeft;
+ size_t len;
+ char * inBuf;
+ char * outBuf;
+
+#ifdef support_surrogate
+ if ((cd = iconv_open(to, "UTF-16")) == (iconv_t) -1) {
+#else
+ if ((cd = iconv_open(to, "UCS-2")) == (iconv_t) -1) {
+#endif
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d) failed with iconv_open(), errno = %d in %s at %d\n",
+ to, from, idx, errno, __FILE__,__LINE__);
+#endif
+ return -1;
+ }
+
+ for (i = 0; i < 0x80; ++i)
+ dmapSrc[i]=i;
+ inBuf=(char *) dmapSrc;
+ inBytesLeft=0x80 * 2;
+ outBuf=(char *) dmap_rec[idx].dmapU2S;
+ outBytesLeft=0x80;
+ do {
+ if ((len = iconv(cd, &inBuf, &inBytesLeft, &outBuf, &outBytesLeft)) != (size_t) 0) {
+#ifdef DEBUG
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d) failed to initialize with iconv(), errno = %d in %s at %d\n",
+ to, from, idx, errno, __FILE__,__LINE__);
+#endif
+ iconv_close(cd);
+ return -1;
+ }
+ } while (inBytesLeft > 0);
+
+ myconv_rec[idx].srcSubS = 0x1A;
+ myconv_rec[idx].srcSubD = 0xFFFD;
+ myconv_rec[idx].subS = dmap_rec[idx].dmapU2S[0x1A];
+
+ outBuf=(char *) &(myconv_rec[idx].subD);
+ dmapSrc[0]=0xFFFD;
+ inBuf=(char *) dmapSrc;
+ inBytesLeft=2;
+ outBytesLeft=2;
+ if ((len = iconv(cd, &inBuf, &inBytesLeft, &outBuf, &outBytesLeft)) != (size_t) 0) {
+#ifdef DEBUG
+ if (myconvDebug) {
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d) failed to initialize with iconv(), rc=%d, errno=%d in %s at %d\n",
+ to, from, idx, len, errno, __FILE__,__LINE__);
+ MyPrintf(STDERR_WO_TIME, "iconv(0x1A,1,%p,1) returns outBuf=%p, outBytesLeft=%d\n",
+ dmapSrc, outBuf, outBytesLeft);
+ }
+#endif
+ if (outBytesLeft == 0) {
+ /* UCS-2_IBM-eucKR returns error.
+ myconv(iconv) rc=1, error=0, InBytesLeft=0, OutBytesLeft=18
+ myconv(iconvRev) rc=-1, error=116, InBytesLeft=2, OutBytesLeft=20
+ iconv: 0xFFFD => 0xAFFE => 0x rc=1,-1 sub=0,0
+ */
+ ;
+ } else {
+ iconv_close(cd);
+ return -1;
+ }
+ }
+
+ for (i = 0x80; i < 0xFFFF; ++i) {
+ uchar eucBuf[3];
+ dmapSrc[0]=i;
+ inBuf=(char *) dmapSrc;
+ inBytesLeft=2;
+ outBuf=(char *) eucBuf;
+ outBytesLeft=sizeof(eucBuf);
+ errno=0;
+ if ((len = iconv(cd, &inBuf, &inBytesLeft, &outBuf, &outBytesLeft)) != (size_t) 0) {
+ if (len == 1 && errno == 0 && inBytesLeft == 0 && outBytesLeft == 1) { /* substitution occurred. */ continue;
+ }
+
+ if (errno == EILSEQ) {
+#ifdef DEBUG
+ if (myconvDebug) {
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d) failed to initialize with iconv(), errno = %d in %s at %d\n",
+ to, from, idx, errno, __FILE__,__LINE__);
+ MyPrintf(STDERR_WO_TIME, "inBytesLeft=%d, outBytesLeft=%d\n", inBytesLeft, outBytesLeft);
+ if (inBuf - (char *) dmapSrc > 1 && inBuf - (char *) dmapSrc <= sizeof(dmapSrc) - 2)
+ MyPrintf(STDERR_WO_TIME, "inBuf[-2..2]=%02X%02X%02X%02X%02X\n", inBuf[-2],inBuf[-1],inBuf[0],inBuf[1],inBuf[2]);
+ else
+ MyPrintf(STDERR_WO_TIME, "inBuf[0..2]=%02X%02X%02X\n", inBuf[0],inBuf[1],inBuf[2]);
+ if (outBuf - (char *) dmap_rec[idx].dmapU2M2 > 1)
+ MyPrintf(STDERR_WO_TIME, "outBuf[-2..2]=%02X%02X%02X%02X%02X\n", outBuf[-2],outBuf[-1],outBuf[0],outBuf[1],outBuf[2]);
+ else
+ MyPrintf(STDERR_WO_TIME, "outBuf[0..2]=%02X%02X%02X\n", outBuf[0],outBuf[1],outBuf[2]);
+ }
+#endif
+ inBuf+=2;
+ inBytesLeft-=2;
+ memcpy(outBuf, (char *) &(myconv_rec[idx].subD), 2);
+ outBuf+=2;
+ outBytesLeft-=2;
+ } else {
+#ifdef DEBUG
+ if (myconvDebug) {
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d) failed to initialize with iconv(), rc = %d, errno = %d in %s at %d\n",
+ to, from, idx, len, errno, __FILE__,__LINE__);
+ MyPrintf(STDERR_WITH_TIME,
+ "%04X: src=%04X%04X, inBuf=0x%02X%02X, inBytesLeft=%d, outBuf[-2..0]=%02X%02X%02X, outBytesLeft=%d\n",
+ i, dmapSrc[0], dmapSrc[1], inBuf[0], inBuf[1],
+ inBytesLeft, outBuf[-2], outBuf[-1], outBuf[0], outBytesLeft);
+ MyPrintf(STDERR_WITH_TIME,
+ "&dmapSrc=%p, inBuf=%p, dmapU2M2 + %d = %p, outBuf=%p\n",
+ dmapSrc, inBuf, (i - 0x80) * 2, dmap_rec[idx].dmapU2M2 + (i - 0x80) * 2, outBuf);
+ }
+#endif
+ iconv_close(cd);
+ return -1;
+ }
+ }
+ if (sizeof(eucBuf) - outBytesLeft == 1) {
+ if (i < 0x100) {
+ (dmap_rec[idx].dmapU2S)[i]=eucBuf[0];
+ } else {
+ dmap_rec[idx].dmapU2M2[(i - 0x80) * 2] = eucBuf[0];
+ dmap_rec[idx].dmapU2M2[(i - 0x80) * 2 + 1] = 0x00;
+ }
+ } else if (sizeof(eucBuf) - outBytesLeft == 2) { /* 2 bytes */
+ dmap_rec[idx].dmapU2M2[(i - 0x80) * 2] = eucBuf[0];
+ dmap_rec[idx].dmapU2M2[(i - 0x80) * 2 + 1] = eucBuf[1];
+ } else if (sizeof(eucBuf) - outBytesLeft == 3) { /* 3 byte SS2/SS3 */
+ dmap_rec[idx].dmapU2M3[(i - 0x80) * 3] = eucBuf[0];
+ dmap_rec[idx].dmapU2M3[(i - 0x80) * 3 + 1] = eucBuf[1];
+ dmap_rec[idx].dmapU2M3[(i - 0x80) * 3 + 2] = eucBuf[2];
+ } else {
+#ifdef DEBUG
+ if (myconvDebug) {
+ MyPrintf(STDERR_WITH_TIME,
+ "dmap_open(%s,%s,%d) failed to initialize with iconv(), rc=%d, errno=%d in %s at %d\n",
+ to, from, idx, len, errno, __FILE__,__LINE__);
+ MyPrintf(STDERR_WITH_TIME,
+ "%04X: src=%04X%04X, inBuf=0x%02X%02X, inBytesLeft=%d, outBuf=%02X%02X%02X, outBytesLeft=%d\n",
+ i, dmapSrc[0], dmapSrc[1], inBuf[0], inBuf[1],
+ inBytesLeft, outBuf[-2], outBuf[-1], outBuf[0], outBytesLeft);
+ MyPrintf(STDERR_WITH_TIME,
+ "&dmapSrc=%p, inBuf=%p, %p, outBuf=%p\n",
+ dmapSrc, inBuf, dmap_rec[idx].dmapU2M3 + (i - 0x80) * 2, outBuf);
+ }
+#endif
+ return -1;
+ }
+
+ }
+ iconv_close(cd);
+ }
+
+ } else if (myconvIsUTF16(from) && myconvIsUTF8(to)) {
+ dmap_rec[idx].codingSchema = DMAP_T28;
+
+ } else if (myconvIsUCS2(from) && myconvIsUTF8(to)) {
+ dmap_rec[idx].codingSchema = DMAP_U28;
+
+ } else if (myconvIsUTF8(from) && myconvIsUnicode2(to)) {
+ dmap_rec[idx].codingSchema = DMAP_82U;
+
+ } else if (myconvIsUnicode2(from) && myconvIsUnicode2(to)) {
+ dmap_rec[idx].codingSchema = DMAP_U2U;
+
+ } else {
+
+ return -1;
+ }
+ myconv_rec[idx].cnv_dmap=&(dmap_rec[idx]);
+ return 0;
+}
+
+
+
+static int bins_open(const char * to,
+ const char * from,
+ const int32_t idx)
+{
+ return -1;
+}
+
+
+
+static int32_t dmap_close(const int32_t idx)
+{
+ if (dmap_rec[idx].codingSchema == DMAP_S2S) {
+ if (dmap_rec[idx].dmapS2S != NULL) {
+ dmap_rec[idx].dmapS2S=NULL;
+ }
+ } else if (dmap_rec[idx].codingSchema = DMAP_E2U) {
+ if (dmap_rec[idx].dmapE02U != NULL) {
+ dmap_rec[idx].dmapE02U=NULL;
+ }
+ if (dmap_rec[idx].dmapE12U != NULL) {
+ dmap_rec[idx].dmapE12U=NULL;
+ }
+ if (dmap_rec[idx].dmapE22U != NULL) {
+ dmap_rec[idx].dmapE22U=NULL;
+ }
+ if (dmap_rec[idx].dmapE32U != NULL) {
+ dmap_rec[idx].dmapE32U=NULL;
+ }
+ }
+
+ return 0;
+}
+
+
+static int32_t bins_close(const int32_t idx)
+{
+ return 0;
+}
+
+
+myconv_t myconv_open(const char * toCode,
+ const char * fromCode,
+ int32_t converter)
+{
+ int32 i;
+ for (i = 0; i < MAX_CONVERTER; ++i) {
+ if (myconv_rec[i].converterType == 0)
+ break;
+ }
+ if (i >= MAX_CONVERTER)
+ return ((myconv_t) -1);
+
+ myconv_rec[i].converterType = converter;
+ myconv_rec[i].index=i;
+ myconv_rec[i].fromCcsid=cstoccsid(fromCode);
+ if (myconv_rec[i].fromCcsid == 0 && memcmp(fromCode, "big5",5) == 0)
+ myconv_rec[i].fromCcsid=950;
+ myconv_rec[i].toCcsid=cstoccsid(toCode);
+ if (myconv_rec[i].toCcsid == 0 && memcmp(toCode, "big5",5) == 0)
+ myconv_rec[i].toCcsid=950;
+ strncpy(myconv_rec[i].from, fromCode, sizeof(myconv_rec[i].from)-1);
+ strncpy(myconv_rec[i].to, toCode, sizeof(myconv_rec[i].to)-1);
+
+ if (converter == CONVERTER_ICONV) {
+ if ((myconv_rec[i].cnv_iconv=iconv_open(toCode, fromCode)) == (iconv_t) -1) {
+ return ((myconv_t) -1);
+ }
+ myconv_rec[i].allocatedSize = -1;
+ myconv_rec[i].srcSubS=myconvGetSubS(fromCode);
+ myconv_rec[i].srcSubD=myconvGetSubD(fromCode);
+ myconv_rec[i].subS=myconvGetSubS(toCode);
+ myconv_rec[i].subD=myconvGetSubD(toCode);
+ return &(myconv_rec[i]);
+ } else if (converter == CONVERTER_DMAP &&
+ dmap_open(toCode, fromCode, i) != -1) {
+ return &(myconv_rec[i]);
+ }
+ return ((myconv_t) -1);
+}
+
+
+
+int32_t myconv_close(myconv_t cd)
+{
+ int32_t ret=0;
+
+ if (cd->converterType == CONVERTER_ICONV) {
+ ret=iconv_close(cd->cnv_iconv);
+ } else if (cd->converterType == CONVERTER_DMAP) {
+ ret=dmap_close(cd->index);
+ }
+ memset(&(myconv_rec[cd->index]), 0x00, sizeof(myconv_rec[cd->index]));
+ return ret;
+}
+
+
+
+
+/* reference: http://www-306.ibm.com/software/globalization/other/es.jsp */
+/* systemCL would be expensive, and myconvIsXXXXX is called frequently.
+ need to cache entries */
+#define MAX_CCSID 256
+static int ccsidList [MAX_CCSID];
+static int esList [MAX_CCSID];
+int32 getEncodingScheme(const uint16 inCcsid, int32& outEncodingScheme);
+EXTERN int myconvGetES(CCSID ccsid)
+{
+ /* call QtqValidateCCSID in ILE to get encoding schema */
+ /* return QtqValidateCCSID(ccsid); */
+ int i;
+ for (i = 0; i < MAX_CCSID; ++i) {
+ if (ccsidList[i] == ccsid)
+ return esList[i];
+ if (ccsidList[i] == 0x00)
+ break;
+ }
+
+ if (i >= MAX_CCSID) {
+ i=MAX_CCSID-1;
+ }
+
+ {
+ ccsidList[i]=ccsid;
+ getEncodingScheme(ccsid, esList[i]);
+#ifdef DEBUG_PASE
+ if (myconvDebug) {
+ fprintf(stderr, "CCSID=%d, ES=0x%04X\n", ccsid, esList[i]);
+ }
+#endif
+ return esList[i];
+ }
+ return 0;
+}
+
+
+EXTERN int myconvIsEBCDIC(const char * pName)
+{
+ int es = myconvGetES(cstoccsid(pName));
+ if (es == 0x1100 ||
+ es == 0x1200 ||
+ es == 0x6100 ||
+ es == 0x6200 ||
+ es == 0x1301 ) {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+EXTERN int myconvIsISO(const char * pName)
+{
+ int es = myconvGetES(cstoccsid(pName));
+ if (es == 0x4100 ||
+ es == 0x4105 ||
+ es == 0x4155 ||
+ es == 0x5100 ||
+ es == 0x5150 ||
+ es == 0x5200 ||
+ es == 0x5404 ||
+ es == 0x5409 ||
+ es == 0x540A ||
+ es == 0x5700) {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+EXTERN int myconvIsASCII(const char * pName)
+{
+ int es = myconvGetES(cstoccsid(pName));
+ if (es == 0x2100 ||
+ es == 0x3100 ||
+ es == 0x8100 ||
+ es == 0x2200 ||
+ es == 0x3200 ||
+ es == 0x9200 ||
+ es == 0x2300 ||
+ es == 0x2305 ||
+ es == 0x3300 ||
+ es == 0x2900 ||
+ es == 0x2A00) {
+ return TRUE;
+ } else if (memcmp(pName, "big5", 5) == 0) {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+
+EXTERN int myconvIsUCS2(const char * pName)
+{
+ if (cstoccsid(pName) == 13488) {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+EXTERN int myconvIsUTF16(const char * pName)
+{
+ if (cstoccsid(pName) == 1200) {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+EXTERN int myconvIsUnicode2(const char * pName)
+{
+ int es = myconvGetES(cstoccsid(pName));
+ if (es == 0x7200 ||
+ es == 0x720B ||
+ es == 0x720F) {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+EXTERN int myconvIsUTF8(const char * pName)
+{
+ int es = myconvGetES(cstoccsid(pName));
+ if (es == 0x7807) {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+EXTERN int myconvIsUnicode(const char * pName)
+{
+ int es = myconvGetES(cstoccsid(pName));
+ if (es == 0x7200 ||
+ es == 0x720B ||
+ es == 0x720F ||
+ es == 0x7807) {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+EXTERN int myconvIsEUC(const char * pName)
+{
+ int es = myconvGetES(cstoccsid(pName));
+ if (es == 0x4403) {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+EXTERN int myconvIsDBCS(const char * pName)
+{
+ int es = myconvGetES(cstoccsid(pName));
+ if (es == 0x1200 ||
+ es == 0x2200 ||
+ es == 0x2300 ||
+ es == 0x2305 ||
+ es == 0x2A00 ||
+ es == 0x3200 ||
+ es == 0x3300 ||
+ es == 0x5200 ||
+ es == 0x6200 ||
+ es == 0x9200) {
+ return TRUE;
+ } else if (memcmp(pName, "big5", 5) == 0) {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+EXTERN int myconvIsSBCS(const char * pName)
+{
+ int es = myconvGetES(cstoccsid(pName));
+ if (es == 0x1100 ||
+ es == 0x2100 ||
+ es == 0x3100 ||
+ es == 0x4100 ||
+ es == 0x4105 ||
+ es == 0x5100 ||
+ es == 0x5150 ||
+ es == 0x6100 ||
+ es == 0x8100) {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+
+EXTERN char myconvGetSubS(const char * code)
+{
+ if (myconvIsEBCDIC(code)) {
+ return 0x3F;
+ } else if (myconvIsASCII(code)) {
+ return 0x1A;
+ } else if (myconvIsISO(code)) {
+ return 0x1A;
+ } else if (myconvIsEUC(code)) {
+ return 0x1A;
+ } else if (myconvIsUCS2(code)) {
+ return 0x00;
+ } else if (myconvIsUTF8(code)) {
+ return 0x1A;
+ }
+ return 0x00;
+}
+
+
+EXTERN UniChar myconvGetSubD(const char * code)
+{
+ if (myconvIsEBCDIC(code)) {
+ return 0xFDFD;
+ } else if (myconvIsASCII(code)) {
+ return 0xFCFC;
+ } else if (myconvIsISO(code)) {
+ return 0x00;
+ } else if (myconvIsEUC(code)) {
+ return 0x00;
+ } else if (myconvIsUCS2(code)) {
+ return 0xFFFD;
+ } else if (myconvIsUTF8(code)) {
+ return 0x00;
+ }
+ return 0x00;
+}
+
diff --git a/storage/ibmdb2i/db2i_myconv.h b/storage/ibmdb2i/db2i_myconv.h
new file mode 100644
index 00000000000..a9e87474505
--- /dev/null
+++ b/storage/ibmdb2i/db2i_myconv.h
@@ -0,0 +1,3200 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+/**
+ @file
+
+ @brief A direct map optimization of iconv and related functions
+ This was show to significantly reduce character conversion cost
+ for short strings when compared to calling iconv system code.
+*/
+
+#ifndef DB2I_MYCONV_H
+#define DB2I_MYCONV_H
+
+
+#include <sys/time.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <wchar.h>
+#include <errno.h>
+#include <iconv.h>
+#include <ctype.h>
+#include <time.h>
+#include <stdarg.h>
+#include <string.h>
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifdef __cplusplus
+#define INTERN inline
+#define EXTERN extern "C"
+#else
+#define INTERN static
+#define EXTERN extern
+#endif
+
+
+/* ANSI integer data types */
+#if defined(__OS400_TGTVRM__)
+/* for DTAMDL(*P128), datamodel(P128): int/long/pointer=4/4/16 */
+/* LLP64:4/4/8 is used for teraspace ?? */
+typedef short int16_t;
+typedef unsigned short uint16_t;
+typedef int int32_t;
+typedef unsigned int uint32_t;
+typedef long long int64_t;
+typedef unsigned long long uint64_t;
+#elif defined(PASE)
+/* PASE uses IPL32: int/long/pointer=4/4/4 + long long */
+#elif defined(__64BIT__)
+/* AIX 64 bit uses LP64: int/long/pointer=4/8/8 */
+#endif
+
+#define CONVERTER_ICONV 1
+#define CONVERTER_DMAP 2
+
+#define DMAP_S2S 10
+#define DMAP_S2U 20
+#define DMAP_D2U 30
+#define DMAP_E2U 40
+#define DMAP_U2S 120
+#define DMAP_T2S 125
+#define DMAP_U2D 130
+#define DMAP_T2D 135
+#define DMAP_U2E 140
+#define DMAP_T2E 145
+#define DMAP_S28 220
+#define DMAP_D28 230
+#define DMAP_E28 240
+#define DMAP_82S 310
+#define DMAP_82D 320
+#define DMAP_82E 330
+#define DMAP_U28 410
+#define DMAP_82U 420
+#define DMAP_T28 425
+#define DMAP_U2U 510
+
+
+typedef struct __dmap_rec *dmap_t;
+
+struct __dmap_rec
+{
+ uint32_t codingSchema;
+ unsigned char * dmapS2S; /* SBCS -> SBCS */
+ /* The following conversion needs be followed by conversion from UCS-2/UTF-16 to UTF-8 */
+ UniChar * dmapD12U; /* DBCS(non-EUC) -> UCS-2/UTF-16 */
+ UniChar * dmapD22U; /* DBCS(non-EUC) -> UCS-2/UTF-16 */
+ UniChar * dmapE02U; /* EUC/SS0 -> UCS-2/UTF-16 */
+ UniChar * dmapE12U; /* EUC/SS1 -> UCS-2/UTF-16 */
+ UniChar * dmapE22U; /* EUC/0x8E + SS2 -> UCS-2/UTF-16 */
+ UniChar * dmapE32U; /* EUC/0x8F + SS3 -> UCS-2/UTF-16 */
+ uchar * dmapU2D; /* UCS-2 -> DBCS */
+ uchar * dmapU2S; /* UCS-2 -> EUC SS0 */
+ uchar * dmapU2M2; /* UCS-2 -> EUC SS1 */
+ uchar * dmapU2M3; /* UCS-2 -> EUC SS2/SS3 */
+ /* All of these pointers/tables are not used at the same time.
+ * You may be able save some space if you consolidate them.
+ */
+ uchar * dmapS28; /* SBCS -> UTF-8 */
+ uchar * dmapD28; /* DBCS -> UTF-8 */
+};
+
+typedef struct __myconv_rec *myconv_t;
+struct __myconv_rec
+{
+ uint32_t converterType;
+ uint32_t index; /* for close */
+ union {
+ iconv_t cnv_iconv;
+ dmap_t cnv_dmap;
+ };
+ int32_t allocatedSize;
+ int32_t fromCcsid;
+ int32_t toCcsid;
+ UniChar subD; /* DBCS substitution char */
+ char subS; /* SBCS substitution char */
+ UniChar srcSubD; /* DBCS substitution char of src codepage */
+ char srcSubS; /* SBCS substitution char of src codepage */
+ char from [41+1]; /* codepage name is up to 41 bytes */
+ char to [41+1]; /* codepage name is up to 41 bytes */
+#ifdef __64BIT__
+ char reserved[10]; /* align 128 */
+#else
+ char reserved[14]; /* align 128 */
+#endif
+};
+
+
+EXTERN int32_t myconvDebug;
+
+
+
+EXTERN int myconvGetES(CCSID);
+EXTERN int myconvIsEBCDIC(const char *);
+EXTERN int myconvIsASCII(const char *);
+EXTERN int myconvIsUnicode(const char *); /* UTF-8, UTF-16, or UCS-2 */
+EXTERN int myconvIsUnicode2(const char *); /* 2 byte Unicode */
+EXTERN int myconvIsUCS2(const char *);
+EXTERN int myconvIsUTF16(const char *);
+EXTERN int myconvIsUTF8(const char *);
+EXTERN int myconvIsEUC(const char *);
+EXTERN int myconvIsISO(const char *);
+EXTERN int myconvIsSBCS(const char *);
+EXTERN int myconvIsDBCS(const char *);
+EXTERN char myconvGetSubS(const char *);
+EXTERN UniChar myconvGetSubD(const char *);
+
+
+EXTERN myconv_t myconv_open(const char*, const char*, int32_t);
+EXTERN int myconv_close(myconv_t);
+
+INTERN size_t myconv_iconv(myconv_t cd ,
+ char** inBuf,
+ size_t* inBytesLeft,
+ char** outBuf,
+ size_t* outBytesLeft,
+ size_t* numSub)
+{
+ return iconv(cd->cnv_iconv, inBuf, inBytesLeft, outBuf, outBytesLeft);
+}
+
+INTERN size_t myconv_dmap(myconv_t cd,
+ char** inBuf,
+ size_t* inBytesLeft,
+ char** outBuf,
+ size_t* outBytesLeft,
+ size_t* numSub)
+{
+ if (cd->cnv_dmap->codingSchema == DMAP_S2S) {
+ register unsigned char * dmapS2S=cd->cnv_dmap->dmapS2S;
+ register int inLen=*inBytesLeft;
+ register char * pOut=*outBuf;
+ register char * pIn=*inBuf;
+ register char * pLastOutBuf = *outBuf + *outBytesLeft - 1;
+ register char subS=cd->subS;
+ register size_t numS=0;
+ while (0 < inLen) {
+ if (pLastOutBuf < pOut)
+ break;
+ if (*pIn == 0x00) {
+ *pOut=0x00;
+ } else {
+ *pOut=dmapS2S[*pIn];
+ if (*pOut == 0x00) {
+ *outBytesLeft-=(*inBytesLeft-inLen);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ if (*pOut == subS) {
+ if ((*pOut=dmapS2S[*pIn]) == subS) {
+ if (*pIn != cd->srcSubS)
+ ++numS;
+ }
+ }
+ }
+ ++pIn;
+ --inLen;
+ ++pOut;
+ }
+ *outBytesLeft-=(*inBytesLeft-inLen);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return 0;
+
+ } else if (cd->cnv_dmap->codingSchema == DMAP_E2U) {
+ /* use uchar * instead of UniChar to avoid memcpy */
+ register uchar * dmapE02U=(uchar *) (cd->cnv_dmap->dmapE02U);
+ register uchar * dmapE12U=(uchar *) (cd->cnv_dmap->dmapE12U);
+ register uchar * dmapE22U=(uchar *) (cd->cnv_dmap->dmapE22U);
+ register uchar * dmapE32U=(uchar *) (cd->cnv_dmap->dmapE32U);
+ register int inLen=*inBytesLeft;
+ register char * pOut=*outBuf;
+ register char * pIn=*inBuf;
+ register int offset;
+ register char * pLastOutBuf = *outBuf + *outBytesLeft - 1;
+ register size_t numS=0;
+ while (0 < inLen) {
+ if (pLastOutBuf < pOut)
+ break;
+ if (*pIn == 0x00) {
+ *pOut=0x00;
+ ++pOut;
+ *pOut=0x00;
+ ++pOut;
+ ++pIn;
+ --inLen;
+ } else {
+ if (*pIn == 0x8E) { /* SS2 */
+ if (inLen < 2) {
+ if (cd->fromCcsid == 33722 || /* IBM-eucJP */
+ cd->fromCcsid == 964) /* IBM-eucTW */
+ errno=EINVAL; /* 22 */
+ else
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ return -1;
+ }
+ ++pIn;
+ if (*pIn < 0xA0) {
+ if (cd->fromCcsid == 964) /* IBM-eucTW */
+ errno=EINVAL; /* 22 */
+ else
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-1;
+ return -1;
+ }
+ offset=(*pIn - 0xA0);
+ offset<<=1;
+ if (dmapE22U[offset] == 0x00 &&
+ dmapE22U[offset+1] == 0x00) { /* 2 bytes */
+ if (inLen < 3) {
+ if (cd->fromCcsid == 964) /* IBM-eucTW */
+ errno=EINVAL; /* 22 */
+ else
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-1;
+ return -1;
+ }
+ offset=(*pIn - 0xA0) * 0x60 + 0x60;
+ ++pIn;
+ if (*pIn < 0xA0) {
+ if (cd->fromCcsid == 964) /* IBM-eucTW */
+ errno=EINVAL; /* 22 */
+ else
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-2;
+ return -1;
+ }
+ offset+=(*pIn - 0xA0);
+ offset<<=1;
+ if (dmapE22U[offset] == 0x00 &&
+ dmapE22U[offset+1] == 0x00) {
+ if (cd->fromCcsid == 964) /* IBM-eucTW */
+ errno=EINVAL; /* 22 */
+ else
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-2;
+ return -1;
+ }
+ *pOut=dmapE22U[offset];
+ ++pOut;
+ *pOut=dmapE22U[offset+1];
+ ++pOut;
+ if (dmapE22U[offset] == 0xFF &&
+ dmapE22U[offset+1] == 0xFD) {
+ if (pIn[-2] * 0x100 + pIn[-1] != cd->srcSubD)
+ ++numS;
+ }
+ ++pIn;
+ inLen-=3;
+ } else { /* 1 bytes */
+ *pOut=dmapE22U[offset];
+ ++pOut;
+ *pOut=dmapE22U[offset+1];
+ ++pOut;
+ ++pIn;
+ inLen-=2;
+ }
+ } else if (*pIn == 0x8F) { /* SS3 */
+ if (inLen < 2) {
+ if (cd->fromCcsid == 33722) /* IBM-eucJP */
+ errno=EINVAL; /* 22 */
+ else
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ return -1;
+ }
+ ++pIn;
+ if (*pIn < 0xA0) {
+ if (cd->fromCcsid == 970 || /* IBM-eucKR */
+ cd->fromCcsid == 964 || /* IBM-eucTW */
+ cd->fromCcsid == 1383 || /* IBM-eucCN */
+ (cd->fromCcsid == 33722 && 3 <= inLen)) /* IBM-eucJP */
+ errno=EILSEQ; /* 116 */
+ else
+ errno=EINVAL; /* 22 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-1;
+ return -1;
+ }
+ offset=(*pIn - 0xA0);
+ offset<<=1;
+ if (dmapE32U[offset] == 0x00 &&
+ dmapE32U[offset+1] == 0x00) { /* 0x8F + 2 bytes */
+ if (inLen < 3) {
+ if (cd->fromCcsid == 33722)
+ errno=EINVAL; /* 22 */
+ else
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-1;
+ return -1;
+ }
+ offset=(*pIn - 0xA0) * 0x60 + 0x60;
+ ++pIn;
+ if (*pIn < 0xA0) {
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-2;
+ return -1;
+ }
+ offset+=(*pIn - 0xA0);
+ offset<<=1;
+ if (dmapE32U[offset] == 0x00 &&
+ dmapE32U[offset+1] == 0x00) {
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-2;
+ return -1;
+ }
+ *pOut=dmapE32U[offset];
+ ++pOut;
+ *pOut=dmapE32U[offset+1];
+ ++pOut;
+ if (dmapE32U[offset] == 0xFF &&
+ dmapE32U[offset+1] == 0xFD) {
+ if (pIn[-2] * 0x100 + pIn[-1] != cd->srcSubD)
+ ++numS;
+ }
+ ++pIn;
+ inLen-=3;
+ } else { /* 0x8F + 1 bytes */
+ *pOut=dmapE32U[offset];
+ ++pOut;
+ *pOut=dmapE32U[offset+1];
+ ++pOut;
+ ++pIn;
+ inLen-=2;
+ }
+
+ } else {
+ offset=*pIn;
+ offset<<=1;
+ if (dmapE02U[offset] == 0x00 &&
+ dmapE02U[offset+1] == 0x00) { /* SS1 */
+ if (inLen < 2) {
+ if ((cd->fromCcsid == 33722 && (*pIn == 0xA0 || (0xA9 <= *pIn && *pIn <= 0xAF) || *pIn == 0xFF)) ||
+ (cd->fromCcsid == 970 && (*pIn == 0xA0 || *pIn == 0xAD || *pIn == 0xAE || *pIn == 0xAF || *pIn == 0xFF)) ||
+ (cd->fromCcsid == 964 && (*pIn == 0xA0 || (0xAA <= *pIn && *pIn <= 0xC1) || *pIn == 0xC3 || *pIn == 0xFE || *pIn == 0xFF)) ||
+ (cd->fromCcsid == 1383 && (*pIn == 0xA0 || *pIn == 0xFF)))
+ errno=EILSEQ; /* 116 */
+ else
+ errno=EINVAL; /* 22 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ return -1;
+ }
+ if (*pIn < 0xA0) {
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ return -1;
+ }
+ offset=(*pIn - 0xA0) * 0x60;
+ ++pIn;
+ if (*pIn < 0xA0) {
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-1;
+ return -1;
+ }
+ offset+=(*pIn - 0xA0);
+ offset<<=1;
+ if (dmapE12U[offset] == 0x00 &&
+ dmapE12U[offset+1] == 0x00) { /* undefined mapping */
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-1;
+ return -1;
+ }
+ *pOut=dmapE12U[offset];
+ ++pOut;
+ *pOut=dmapE12U[offset+1];
+ ++pOut;
+ if (dmapE12U[offset] == 0xFF &&
+ dmapE12U[offset+1] == 0xFD) {
+ if (pIn[-1] * 0x100 + pIn[0] != cd->srcSubD)
+ ++numS;
+ }
+ ++pIn;
+ inLen-=2;
+ } else {
+ *pOut=dmapE02U[offset];
+ ++pOut;
+ *pOut=dmapE02U[offset+1];
+ ++pOut;
+ if (dmapE02U[offset] == 0x00 &&
+ dmapE02U[offset+1] == 0x1A) {
+ if (*pIn != cd->srcSubS)
+ ++numS;
+ }
+ ++pIn;
+ --inLen;
+ }
+ }
+ }
+ }
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return 0;
+
+
+ } else if (cd->cnv_dmap->codingSchema == DMAP_E28) {
+ /* use uchar * instead of UniChar to avoid memcpy */
+ register uchar * dmapE02U=(uchar *) (cd->cnv_dmap->dmapE02U);
+ register uchar * dmapE12U=(uchar *) (cd->cnv_dmap->dmapE12U);
+ register uchar * dmapE22U=(uchar *) (cd->cnv_dmap->dmapE22U);
+ register uchar * dmapE32U=(uchar *) (cd->cnv_dmap->dmapE32U);
+ register int inLen=*inBytesLeft;
+ register char * pOut=*outBuf;
+ register char * pIn=*inBuf;
+ register int offset;
+ register char * pLastOutBuf = *outBuf + *outBytesLeft - 1;
+ register size_t numS=0;
+ register UniChar in; /* copy part of U28 */
+ register UniChar ucs2;
+ while (0 < inLen) {
+ if (pLastOutBuf < pOut)
+ break;
+ if (*pIn == 0x00) {
+ *pOut=0x00;
+ ++pOut;
+ ++pIn;
+ --inLen;
+ } else {
+ if (*pIn == 0x8E) { /* SS2 */
+ if (inLen < 2) {
+ if (cd->fromCcsid == 33722 || /* IBM-eucJP */
+ cd->fromCcsid == 964) /* IBM-eucTW */
+ errno=EINVAL; /* 22 */
+ else
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ return -1;
+ }
+ ++pIn;
+ if (*pIn < 0xA0) {
+ if (cd->fromCcsid == 964) /* IBM-eucTW */
+ errno=EINVAL; /* 22 */
+ else
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-1;
+ return -1;
+ }
+ offset=(*pIn - 0xA0);
+ offset<<=1;
+ if (dmapE22U[offset] == 0x00 &&
+ dmapE22U[offset+1] == 0x00) { /* 2 bytes */
+ if (inLen < 3) {
+ if (cd->fromCcsid == 964) /* IBM-eucTW */
+ errno=EINVAL; /* 22 */
+ else
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-1;
+ return -1;
+ }
+ offset=(*pIn - 0xA0) * 0x60 + 0x60;
+ ++pIn;
+ if (*pIn < 0xA0) {
+ if (cd->fromCcsid == 964) /* IBM-eucTW */
+ errno=EINVAL; /* 22 */
+ else
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-2;
+ return -1;
+ }
+ offset+=(*pIn - 0xA0);
+ offset<<=1;
+ if (dmapE22U[offset] == 0x00 &&
+ dmapE22U[offset+1] == 0x00) {
+ if (cd->fromCcsid == 964) /* IBM-eucTW */
+ errno=EINVAL; /* 22 */
+ else
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-2;
+ return -1;
+ }
+ in=dmapE22U[offset];
+ in<<=8;
+ in+=dmapE22U[offset+1];
+ if (dmapE22U[offset] == 0xFF &&
+ dmapE22U[offset+1] == 0xFD) {
+ if (pIn[-2] * 0x100 + pIn[-1] != cd->srcSubD)
+ ++numS;
+ }
+ ++pIn;
+ inLen-=3;
+ } else { /* 1 bytes */
+ in=dmapE22U[offset];
+ in<<=8;
+ in+=dmapE22U[offset+1];
+ ++pIn;
+ inLen-=2;
+ }
+ } else if (*pIn == 0x8F) { /* SS3 */
+ if (inLen < 2) {
+ if (cd->fromCcsid == 33722) /* IBM-eucJP */
+ errno=EINVAL; /* 22 */
+ else
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ return -1;
+ }
+ ++pIn;
+ if (*pIn < 0xA0) {
+ if (cd->fromCcsid == 970 || /* IBM-eucKR */
+ cd->fromCcsid == 964 || /* IBM-eucTW */
+ cd->fromCcsid == 1383 || /* IBM-eucCN */
+ (cd->fromCcsid == 33722 && 3 <= inLen)) /* IBM-eucJP */
+ errno=EILSEQ; /* 116 */
+ else
+ errno=EINVAL; /* 22 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-1;
+ return -1;
+ }
+ offset=(*pIn - 0xA0);
+ offset<<=1;
+ if (dmapE32U[offset] == 0x00 &&
+ dmapE32U[offset+1] == 0x00) { /* 0x8F + 2 bytes */
+ if (inLen < 3) {
+ if (cd->fromCcsid == 33722)
+ errno=EINVAL; /* 22 */
+ else
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-1;
+ return -1;
+ }
+ offset=(*pIn - 0xA0) * 0x60 + 0x60;
+ ++pIn;
+ if (*pIn < 0xA0) {
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-2;
+ return -1;
+ }
+ offset+=(*pIn - 0xA0);
+ offset<<=1;
+ if (dmapE32U[offset] == 0x00 &&
+ dmapE32U[offset+1] == 0x00) {
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-2;
+ return -1;
+ }
+ in=dmapE32U[offset];
+ in<<=8;
+ in+=dmapE32U[offset+1];
+ if (dmapE32U[offset] == 0xFF &&
+ dmapE32U[offset+1] == 0xFD) {
+ if (pIn[-2] * 0x100 + pIn[-1] != cd->srcSubD)
+ ++numS;
+ }
+ ++pIn;
+ inLen-=3;
+ } else { /* 0x8F + 1 bytes */
+ in=dmapE32U[offset];
+ in<<=8;
+ in+=dmapE32U[offset+1];
+ ++pIn;
+ inLen-=2;
+ }
+
+ } else {
+ offset=*pIn;
+ offset<<=1;
+ if (dmapE02U[offset] == 0x00 &&
+ dmapE02U[offset+1] == 0x00) { /* SS1 */
+ if (inLen < 2) {
+ if ((cd->fromCcsid == 33722 && (*pIn == 0xA0 || (0xA9 <= *pIn && *pIn <= 0xAF) || *pIn == 0xFF)) ||
+ (cd->fromCcsid == 970 && (*pIn == 0xA0 || *pIn == 0xAD || *pIn == 0xAE || *pIn == 0xAF || *pIn == 0xFF)) ||
+ (cd->fromCcsid == 964 && (*pIn == 0xA0 || (0xAA <= *pIn && *pIn <= 0xC1) || *pIn == 0xC3 || *pIn == 0xFE || *pIn == 0xFF)) ||
+ (cd->fromCcsid == 1383 && (*pIn == 0xA0 || *pIn == 0xFF)))
+ errno=EILSEQ; /* 116 */
+ else
+ errno=EINVAL; /* 22 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ return -1;
+ }
+ if (*pIn < 0xA0) {
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ return -1;
+ }
+ offset=(*pIn - 0xA0) * 0x60;
+ ++pIn;
+ if (*pIn < 0xA0) {
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-1;
+ return -1;
+ }
+ offset+=(*pIn - 0xA0);
+ offset<<=1;
+ if (dmapE12U[offset] == 0x00 &&
+ dmapE12U[offset+1] == 0x00) { /* undefined mapping */
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-1;
+ return -1;
+ }
+ in=dmapE12U[offset];
+ in<<=8;
+ in+=dmapE12U[offset+1];
+ if (dmapE12U[offset] == 0xFF &&
+ dmapE12U[offset+1] == 0xFD) {
+ if (pIn[-1] * 0x100 + pIn[0] != cd->srcSubD)
+ ++numS;
+ }
+ ++pIn;
+ inLen-=2;
+ } else {
+ in=dmapE02U[offset];
+ in<<=8;
+ in+=dmapE02U[offset+1];
+ if (dmapE02U[offset] == 0x00 &&
+ dmapE02U[offset+1] == 0x1A) {
+ if (*pIn != cd->srcSubS)
+ ++numS;
+ }
+ ++pIn;
+ --inLen;
+ }
+ }
+ ucs2=in;
+ if ((in & 0xFF80) == 0x0000) { /* U28: in & 0b1111111110000000 == 0x0000 */
+ *pOut=in;
+ ++pOut;
+ } else if ((in & 0xF800) == 0x0000) { /* in & 0b1111100000000000 == 0x0000 */
+ register uchar byte;
+ in>>=6;
+ in&=0x001F; /* 0b0000000000011111 */
+ in|=0x00C0; /* 0b0000000011000000 */
+ *pOut=in;
+ ++pOut;
+ byte=ucs2; /* dmapD12U[offset+1]; */
+ byte&=0x3F; /* 0b00111111; */
+ byte|=0x80; /* 0b10000000; */
+ *pOut=byte;
+ ++pOut;
+ } else if ((in & 0xFC00) == 0xD800) {
+ *pOut=0xEF;
+ ++pOut;
+ *pOut=0xBF;
+ ++pOut;
+ *pOut=0xBD;
+ ++pOut;
+ } else {
+ register uchar byte;
+ register uchar work;
+ byte=(ucs2>>8); /* dmapD12U[offset]; */
+ byte>>=4;
+ byte|=0xE0; /* 0b11100000; */
+ *pOut=byte;
+ ++pOut;
+
+ byte=(ucs2>>8); /* dmapD12U[offset]; */
+ byte<<=2;
+ work=ucs2; /* dmapD12U[offset+1]; */
+ work>>=6;
+ byte|=work;
+ byte&=0x3F; /* 0b00111111; */
+ byte|=0x80; /* 0b10000000; */
+ *pOut=byte;
+ ++pOut;
+
+ byte=ucs2; /* dmapD12U[offset+1]; */
+ byte&=0x3F; /* 0b00111111; */
+ byte|=0x80; /* 0b10000000; */
+ *pOut=byte;
+ ++pOut;
+ }
+ /* end of U28 */
+ }
+ }
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return 0;
+
+ } else if (cd->cnv_dmap->codingSchema == DMAP_U2E) {
+ register uchar * dmapU2S=cd->cnv_dmap->dmapU2S;
+ register uchar * dmapU2M2=cd->cnv_dmap->dmapU2M2 - 0x80 * 2;
+ register uchar * dmapU2M3=cd->cnv_dmap->dmapU2M3 - 0x80 * 3;
+ register int inLen=*inBytesLeft;
+ register char * pOut=*outBuf;
+ register char * pIn=*inBuf;
+ register char * pLastOutBuf = *outBuf + *outBytesLeft - 1;
+ register char subS=cd->subS;
+ register char * pSubD=(char *) &(cd->subD);
+ register size_t numS=0;
+ register size_t rc=0;
+ while (0 < inLen) {
+ register uint32_t in;
+ if (inLen == 1) {
+ errno=EINVAL; /* 22 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ return -1;
+ }
+ if (pLastOutBuf < pOut)
+ break;
+ in=pIn[0];
+ in<<=8;
+ in+=pIn[1];
+ if (in == 0x0000) {
+ *pOut=0x00;
+ ++pOut;
+ } else if (in < 0x100 && dmapU2S[in] != 0x0000) {
+ if ((*pOut=dmapU2S[in]) == subS) {
+ if (in != cd->srcSubS)
+ ++numS;
+ }
+ ++pOut;
+ } else {
+ in<<=1;
+ if (dmapU2M2[in] == 0x00) { /* not found in dmapU2M2 */
+ in*=1.5;
+ if (dmapU2M3[in] == 0x00) { /* not found in dmapU2M3*/
+ *pOut=pSubD[0];
+ ++pOut;
+ *pOut=pSubD[1];
+ ++pOut;
+ ++numS;
+ ++rc;
+ } else {
+ *pOut=dmapU2M3[in];
+ ++pOut;
+ *pOut=dmapU2M3[1+in];
+ ++pOut;
+ *pOut=dmapU2M3[2+in];
+ ++pOut;
+ }
+ } else {
+ *pOut=dmapU2M2[in];
+ ++pOut;
+ if (dmapU2M2[1+in] == 0x00) {
+ if (*pOut == subS) {
+ in>>=1;
+ if (in != cd->srcSubS)
+ ++numS;
+ }
+ } else {
+ *pOut=dmapU2M2[1+in];
+ ++pOut;
+ if (memcmp(pOut-2, pSubD, 2) == 0) {
+ in>>=1;
+ if (in != cd->srcSubD) {
+ ++numS;
+ ++rc;
+ }
+ }
+ }
+ }
+ }
+ pIn+=2;
+ inLen-=2;
+ }
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return rc; /* compatibility to iconv() */
+
+ } else if (cd->cnv_dmap->codingSchema == DMAP_T2E) {
+ register uchar * dmapU2S=cd->cnv_dmap->dmapU2S;
+ register uchar * dmapU2M2=cd->cnv_dmap->dmapU2M2 - 0x80 * 2;
+ register uchar * dmapU2M3=cd->cnv_dmap->dmapU2M3 - 0x80 * 3;
+ register int inLen=*inBytesLeft;
+ register char * pOut=*outBuf;
+ register char * pIn=*inBuf;
+ register char * pLastOutBuf = *outBuf + *outBytesLeft - 1;
+ register char subS=cd->subS;
+ register char * pSubD=(char *) &(cd->subD);
+ register size_t numS=0;
+ register size_t rc=0;
+ while (0 < inLen) {
+ register uint32_t in;
+ if (inLen == 1) {
+ errno=EINVAL; /* 22 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen-1;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ ++numS;
+ *numSub+=numS;
+ return 0;
+ }
+ if (pLastOutBuf < pOut)
+ break;
+ in=pIn[0];
+ in<<=8;
+ in+=pIn[1];
+ if (in == 0x0000) {
+ *pOut=0x00;
+ ++pOut;
+ } else if (0xD800 <= in && in <= 0xDBFF) { /* first byte of surrogate */
+ errno=EINVAL; /* 22 */
+ *inBytesLeft=inLen-2;
+ *outBytesLeft-=(pOut-*outBuf);
+ *outBuf=pOut;
+ *inBuf=pIn+2;
+ ++numS;
+ *numSub+=numS;
+ return -1;
+
+ } else if (0xDC00 <= in && in <= 0xDFFF) { /* second byte of surrogate */
+ errno=EINVAL; /* 22 */
+ *inBytesLeft=inLen-1;
+ *outBytesLeft-=(pOut-*outBuf);
+ *outBuf=pOut;
+ *inBuf=pIn;
+ ++numS;
+ *numSub+=numS;
+ return -1;
+
+ } else if (in < 0x100 && dmapU2S[in] != 0x0000) {
+ if ((*pOut=dmapU2S[in]) == subS) {
+ if (in != cd->srcSubS)
+ ++numS;
+ }
+ ++pOut;
+ } else {
+ in<<=1;
+ if (dmapU2M2[in] == 0x00) { /* not found in dmapU2M2 */
+ in*=1.5;
+ if (dmapU2M3[in] == 0x00) { /* not found in dmapU2M3*/
+ *pOut=pSubD[0];
+ ++pOut;
+ *pOut=pSubD[1];
+ ++pOut;
+ ++numS;
+ ++rc;
+ } else {
+ *pOut=dmapU2M3[in];
+ ++pOut;
+ *pOut=dmapU2M3[1+in];
+ ++pOut;
+ *pOut=dmapU2M3[2+in];
+ ++pOut;
+ }
+ } else {
+ *pOut=dmapU2M2[in];
+ ++pOut;
+ if (dmapU2M2[1+in] == 0x00) {
+ if (*pOut == subS) {
+ in>>=1;
+ if (in != cd->srcSubS)
+ ++numS;
+ }
+ } else {
+ *pOut=dmapU2M2[1+in];
+ ++pOut;
+ if (memcmp(pOut-2, pSubD, 2) == 0) {
+ in>>=1;
+ if (in != cd->srcSubD) {
+ ++numS;
+ ++rc;
+ }
+ }
+ }
+ }
+ }
+ pIn+=2;
+ inLen-=2;
+ }
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return 0;
+
+ } else if (cd->cnv_dmap->codingSchema == DMAP_82E) {
+ register uchar * dmapU2S=cd->cnv_dmap->dmapU2S;
+ register uchar * dmapU2M2=cd->cnv_dmap->dmapU2M2 - 0x80 * 2;
+ register uchar * dmapU2M3=cd->cnv_dmap->dmapU2M3 - 0x80 * 3;
+ register int inLen=*inBytesLeft;
+ register char * pOut=*outBuf;
+ register char * pIn=*inBuf;
+ register char * pLastOutBuf = *outBuf + *outBytesLeft - 1;
+ register char subS=cd->subS;
+ register char * pSubD=(char *) &(cd->subD);
+ register size_t numS=0;
+ register size_t rc=0;
+ while (0 < inLen) {
+ register uint32_t in;
+ uint32_t in2;
+ if (pLastOutBuf < pOut)
+ break;
+ /* convert from UTF-8 to UCS-2 */
+ if (*pIn == 0x00) {
+ in=0x0000;
+ ++pIn;
+ --inLen;
+ } else { /* 82U: */
+ register uchar byte1=*pIn;
+ if ((byte1 & 0x80) == 0x00) { /* if (byte1 & 0b10000000 == 0b00000000) { */
+ /* 1 bytes sequence: 0xxxxxxx => 00000000 0xxxxxxx*/
+ in=byte1;
+ ++pIn;
+ --inLen;
+ } else if ((byte1 & 0xE0) == 0xC0) { /* (byte1 & 0b11100000 == 0b11000000) { */
+ if (inLen < 2) {
+ errno=EINVAL; /* 22 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ if (byte1 == 0xC0 || byte1 == 0xC1) { /* invalid sequence */
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ /* 2 bytes sequence:
+ 110yyyyy 10xxxxxx => 00000yyy yyxxxxxx */
+ register uchar byte2;
+ ++pIn;
+ byte2=*pIn;
+ if ((byte2 & 0xC0) == 0x80) { /* byte2 & 0b11000000 == 0b10000000) { */
+ register uchar work=byte1;
+ work<<=6;
+ byte2&=0x3F; /* 0b00111111; */
+ byte2|=work;
+
+ byte1&=0x1F; /* 0b00011111; */
+ byte1>>=2;
+ in=byte1;
+ in<<=8;
+ in+=byte2;
+ inLen-=2;
+ ++pIn;
+ } else { /* invalid sequence */
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-1;
+ *numSub+=numS;
+ return -1;
+ }
+ } else if ((byte1 & 0xF0) == 0xE0) { /* byte1 & 0b11110000 == 0b11100000 */
+ /* 3 bytes sequence:
+ 1110zzzz 10yyyyyy 10xxxxxx => zzzzyyyy yyxxxxxx */
+ register uchar byte2;
+ register uchar byte3;
+ if (inLen < 3) {
+ if (inLen == 2 && (pIn[1] & 0xC0) != 0x80)
+ errno=EILSEQ; /* 116 */
+ else
+ errno=EINVAL; /* 22 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ ++pIn;
+ byte2=*pIn;
+ ++pIn;
+ byte3=*pIn;
+ if ((byte2 & 0xC0) != 0x80 ||
+ (byte3 & 0xC0) != 0x80 ||
+ (byte1 == 0xE0 && byte2 < 0xA0)) { /* invalid sequence, only 0xA0-0xBF allowed after 0xE0 */
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-2;
+ *numSub+=numS;
+ return -1;
+ }
+ {
+ register uchar work=byte2;
+ work<<=6;
+ byte3&=0x3F; /* 0b00111111; */
+ byte3|=work;
+
+ byte2&=0x3F; /* 0b00111111; */
+ byte2>>=2;
+
+ byte1<<=4;
+ in=byte1 | byte2;;
+ in<<=8;
+ in+=byte3;
+ inLen-=3;
+ ++pIn;
+ }
+ } else if ((0xF0 <= byte1 && byte1 <= 0xF4)) { /* (bytes1 & 11111000) == 0x1110000 */
+ /* 4 bytes sequence
+ 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx => 110110ww wwzzzzyy 110111yy yyxxxxxx
+ where uuuuu = wwww + 1 */
+ register uchar byte2;
+ register uchar byte3;
+ register uchar byte4;
+ if (inLen < 4) {
+ if ((inLen >= 2 && (pIn[1] & 0xC0) != 0x80) ||
+ (inLen >= 3 && (pIn[2] & 0xC0) != 0x80) ||
+ (cd->toCcsid == 13488) )
+ errno=EILSEQ; /* 116 */
+ else
+ errno=EINVAL; /* 22 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ ++pIn;
+ byte2=*pIn;
+ ++pIn;
+ byte3=*pIn;
+ ++pIn;
+ byte4=*pIn;
+ if ((byte2 & 0xC0) == 0x80 && /* byte2 & 0b11000000 == 0b10000000 */
+ (byte3 & 0xC0) == 0x80 && /* byte3 & 0b11000000 == 0b10000000 */
+ (byte4 & 0xC0) == 0x80) { /* byte4 & 0b11000000 == 0b10000000 */
+ register uchar work=byte2;
+ if (byte1 == 0xF0 && byte2 < 0x90) {
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-3;
+ *numSub+=numS;
+ return -1;
+ /* iconv() returns 0 for 0xF4908080 and convert to 0x00
+ } else if (byte1 == 0xF4 && byte2 > 0x8F) {
+ errno=EINVAL;
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-3;
+ *numSub+=numS;
+ return -1;
+ */
+ }
+
+ work&=0x30; /* 0b00110000; */
+ work>>=4;
+ byte1&=0x07; /* 0b00000111; */
+ byte1<<=2;
+ byte1+=work; /* uuuuu */
+ --byte1; /* wwww */
+
+ work=byte1 & 0x0F;
+ work>>=2;
+ work+=0xD8; /* 0b11011011; */
+ in=work;
+ in<<=8;
+
+ byte1<<=6;
+ byte2<<=2;
+ byte2&=0x3C; /* 0b00111100; */
+ work=byte3;
+ work>>=4;
+ work&=0x03; /* 0b00000011; */
+ work|=byte1;
+ work|=byte2;
+ in+=work;
+
+ work=byte3;
+ work>>=2;
+ work&=0x03; /* 0b00000011; */
+ work|=0xDC; /* 0b110111xx; */
+ in2=work;
+ in2<<=8;
+
+ byte3<<=6;
+ byte4&=0x3F; /* 0b00111111; */
+ byte4|=byte3;
+ in2+=byte4;
+ inLen-=4;
+ ++pIn;
+#ifdef match_with_GBK
+ if ((0xD800 == in && in2 < 0xDC80) ||
+ (0xD840 == in && in2 < 0xDC80) ||
+ (0xD880 == in && in2 < 0xDC80) ||
+ (0xD8C0 == in && in2 < 0xDC80) ||
+ (0xD900 == in && in2 < 0xDC80) ||
+ (0xD940 == in && in2 < 0xDC80) ||
+ (0xD980 == in && in2 < 0xDC80) ||
+ (0xD9C0 == in && in2 < 0xDC80) ||
+ (0xDA00 == in && in2 < 0xDC80) ||
+ (0xDA40 == in && in2 < 0xDC80) ||
+ (0xDA80 == in && in2 < 0xDC80) ||
+ (0xDAC0 == in && in2 < 0xDC80) ||
+ (0xDB00 == in && in2 < 0xDC80) ||
+ (0xDB40 == in && in2 < 0xDC80) ||
+ (0xDB80 == in && in2 < 0xDC80) ||
+ (0xDBC0 == in && in2 < 0xDC80)) {
+#else
+ if ((0xD800 <= in && in <= 0xDBFF) &&
+ (0xDC00 <= in2 && in2 <= 0xDFFF)) {
+#endif
+ *pOut=subS;
+ ++pOut;
+ ++numS;
+ continue;
+ }
+ } else { /* invalid sequence */
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-3;
+ *numSub+=numS;
+ return -1;
+ }
+ } else if (0xF5 <= byte1 && byte1 <= 0xFF) { /* minic iconv() behavior */
+ if (inLen < 4 ||
+ (inLen >= 4 && byte1 == 0xF8 && pIn[1] < 0x90) ||
+ pIn[1] < 0x80 || 0xBF < pIn[1] ||
+ pIn[2] < 0x80 || 0xBF < pIn[2] ||
+ pIn[3] < 0x80 || 0xBF < pIn[3] ) {
+ if (inLen == 1)
+ errno=EINVAL; /* 22 */
+ else if (inLen == 2 && (pIn[1] & 0xC0) != 0x80)
+ errno=EILSEQ; /* 116 */
+ else if (inLen == 3 && ((pIn[1] & 0xC0) != 0x80 || (pIn[2] & 0xC0) != 0x80))
+ errno=EILSEQ; /* 116 */
+ else if (inLen >= 4 && (byte1 == 0xF8 || (pIn[1] & 0xC0) != 0x80 || (pIn[2] & 0xC0) != 0x80 || (pIn[3] & 0xC0) != 0x80))
+ errno=EILSEQ; /* 116 */
+ else
+ errno=EINVAL; /* 22 */
+
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ } else if ((pIn[1] == 0x80 || pIn[1] == 0x90 || pIn[1] == 0xA0 || pIn[1] == 0xB0) &&
+ pIn[2] < 0x82) {
+ *pOut=subS; /* Though returns replacement character, which iconv() does not return. */
+ ++pOut;
+ ++numS;
+ pIn+=4;
+ inLen-=4;
+ continue;
+ } else {
+ *pOut=pSubD[0]; /* Though returns replacement character, which iconv() does not return. */
+ ++pOut;
+ *pOut=pSubD[1];
+ ++pOut;
+ ++numS;
+ pIn+=4;
+ inLen-=4;
+ continue;
+ /* iconv() returns 0 with strange 1 byte converted values */
+ }
+
+ } else { /* invalid sequence */
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ }
+ /* end of UTF-8 to UCS-2 */
+ if (in == 0x0000) {
+ *pOut=0x00;
+ ++pOut;
+ } else if (in < 0x100 && dmapU2S[in] != 0x0000) {
+ if ((*pOut=dmapU2S[in]) == subS) {
+ if (in != cd->srcSubS)
+ ++numS;
+ }
+ ++pOut;
+ } else {
+ in<<=1;
+ if (dmapU2M2[in] == 0x00) { /* not found in dmapU2M2 */
+ in*=1.5;
+ if (dmapU2M3[in] == 0x00) { /* not found in dmapU2M3*/
+ *pOut=pSubD[0];
+ ++pOut;
+ *pOut=pSubD[1];
+ ++pOut;
+ ++numS;
+ ++rc;
+ } else {
+ *pOut=dmapU2M3[in];
+ ++pOut;
+ *pOut=dmapU2M3[1+in];
+ ++pOut;
+ *pOut=dmapU2M3[2+in];
+ ++pOut;
+ }
+ } else {
+ *pOut=dmapU2M2[in];
+ ++pOut;
+ if (dmapU2M2[1+in] == 0x00) {
+ if (*pOut == subS) {
+ in>>=1;
+ if (in != cd->srcSubS)
+ ++numS;
+ }
+ } else {
+ *pOut=dmapU2M2[1+in];
+ ++pOut;
+ if (memcmp(pOut-2, pSubD, 2) == 0) {
+ in>>=1;
+ if (in != cd->srcSubD) {
+ ++numS;
+ ++rc;
+ }
+ }
+ }
+ }
+ }
+ }
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return 0;
+
+ } else if (cd->cnv_dmap->codingSchema == DMAP_S2U) {
+ /* use uchar * instead of UniChar to avoid memcpy */
+ register uchar * dmapD12U=(uchar *) (cd->cnv_dmap->dmapD12U);
+ register int inLen=*inBytesLeft;
+ register char * pOut=*outBuf;
+ register char * pIn=*inBuf;
+ register int offset;
+ register char * pLastOutBuf = *outBuf + *outBytesLeft - 1;
+ register size_t numS=0;
+ while (0 < inLen) {
+ if (pLastOutBuf < pOut)
+ break;
+ if (*pIn == 0x00) {
+ *pOut=0x00;
+ ++pOut;
+ *pOut=0x00;
+ ++pOut;
+ ++pIn;
+ --inLen;
+ } else {
+ offset=*pIn;
+ offset<<=1;
+ *pOut=dmapD12U[offset];
+ ++pOut;
+ *pOut=dmapD12U[offset+1];
+ ++pOut;
+ if (dmapD12U[offset] == 0x00) {
+ if (dmapD12U[offset+1] == 0x1A) {
+ if (*pIn != cd->srcSubS)
+ ++numS;
+ } else if (dmapD12U[offset+1] == 0x00) {
+ pOut-=2;
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ }
+ ++pIn;
+ --inLen;
+ }
+ }
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return 0;
+
+ } else if (cd->cnv_dmap->codingSchema == DMAP_S28) {
+ /* use uchar * instead of UniChar to avoid memcpy */
+ register uchar * dmapD12U=(uchar *) (cd->cnv_dmap->dmapD12U);
+ register int inLen=*inBytesLeft;
+ register char * pOut=*outBuf;
+ register char * pIn=*inBuf;
+ register int offset;
+ register char * pLastOutBuf = *outBuf + *outBytesLeft - 1;
+ register size_t numS=0;
+ register UniChar in; /* copy part of U28 */
+ while (0 < inLen) {
+ if (pLastOutBuf < pOut)
+ break;
+ if (*pIn == 0x00) {
+ *pOut=0x00;
+ ++pOut;
+ ++pIn;
+ --inLen;
+ } else {
+ offset=*pIn;
+ offset<<=1;
+ in=dmapD12U[offset];
+ in<<=8;
+ in+=dmapD12U[offset+1];
+ if ((in & 0xFF80) == 0x0000) { /* U28: in & 0b1111111110000000 == 0x0000 */
+ if (in == 0x000) {
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ *pOut=in;
+ ++pOut;
+ } else if ((in & 0xF800) == 0x0000) { /* in & 0b1111100000000000 == 0x0000 */
+ register uchar byte;
+ in>>=6;
+ in&=0x001F; /* 0b0000000000011111 */
+ in|=0x00C0; /* 0b0000000011000000 */
+ *pOut=in;
+ ++pOut;
+ byte=dmapD12U[offset+1];
+ byte&=0x3F; /* 0b00111111; */
+ byte|=0x80; /* 0b10000000; */
+ *pOut=byte;
+ ++pOut;
+ } else if ((in & 0xFC00) == 0xD800) { /* There should not be no surrogate character in SBCS. */
+ *pOut=0xEF;
+ ++pOut;
+ *pOut=0xBF;
+ ++pOut;
+ *pOut=0xBD;
+ ++pOut;
+ } else {
+ register uchar byte;
+ register uchar work;
+ byte=dmapD12U[offset];
+ byte>>=4;
+ byte|=0xE0; /* 0b11100000; */
+ *pOut=byte;
+ ++pOut;
+
+ byte=dmapD12U[offset];
+ byte<<=2;
+ work=dmapD12U[offset+1];
+ work>>=6;
+ byte|=work;
+ byte&=0x3F; /* 0b00111111; */
+ byte|=0x80; /* 0b10000000; */
+ *pOut=byte;
+ ++pOut;
+
+ byte=dmapD12U[offset+1];
+ byte&=0x3F; /* 0b00111111; */
+ byte|=0x80; /* 0b10000000; */
+ *pOut=byte;
+ ++pOut;
+ }
+ /* end of U28 */
+ if (dmapD12U[offset] == 0x00) {
+ if (dmapD12U[offset+1] == 0x1A) {
+ if (*pIn != cd->srcSubS)
+ ++numS;
+ }
+ }
+ ++pIn;
+ --inLen;
+ }
+ }
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return 0;
+
+ } else if (cd->cnv_dmap->codingSchema == DMAP_U2S) {
+ register uchar * dmapU2S=cd->cnv_dmap->dmapU2S;
+ register int inLen=*inBytesLeft;
+ register char * pOut=*outBuf;
+ register char * pIn=*inBuf;
+ register char * pLastOutBuf = *outBuf + *outBytesLeft - 1;
+ register char subS=cd->subS;
+ register size_t numS=0;
+ while (0 < inLen) {
+ register uint32_t in;
+ if (inLen == 1) {
+ errno=EINVAL; /* 22 */
+
+ *inBytesLeft=inLen;
+ *outBytesLeft-=(pOut-*outBuf);
+ *outBuf=pOut;
+ *inBuf=pIn;
+ return -1;
+ }
+ if (pLastOutBuf < pOut)
+ break;
+ in=pIn[0];
+ in<<=8;
+ in+=pIn[1];
+ if (in == 0x0000) {
+ *pOut=0x00;
+ } else {
+ if ((*pOut=dmapU2S[in]) == 0x00) {
+ *pOut=subS;
+ ++numS;
+ errno=EINVAL; /* 22 */
+ } else if (*pOut == subS) {
+ if (in != cd->srcSubS)
+ ++numS;
+ }
+ }
+ ++pOut;
+ pIn+=2;
+ inLen-=2;
+ }
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return numS;
+
+ } else if (cd->cnv_dmap->codingSchema == DMAP_T2S) {
+ register uchar * dmapU2S=cd->cnv_dmap->dmapU2S;
+ register int inLen=*inBytesLeft;
+ register char * pOut=*outBuf;
+ register char * pIn=*inBuf;
+ register char * pLastOutBuf = *outBuf + *outBytesLeft - 1;
+ register char subS=cd->subS;
+ register size_t numS=0;
+ while (0 < inLen) {
+ register uint32_t in;
+ if (inLen == 1) {
+ errno=EINVAL; /* 22 */
+
+ *inBytesLeft=inLen-1;
+ *outBytesLeft-=(pOut-*outBuf);
+ *outBuf=pOut;
+ *inBuf=pIn;
+ ++numS;
+ *numSub+=numS;
+ return 0;
+ }
+ if (pLastOutBuf < pOut)
+ break;
+ in=pIn[0];
+ in<<=8;
+ in+=pIn[1];
+ if (in == 0x0000) {
+ *pOut=0x00;
+
+ } else if (0xD800 <= in && in <= 0xDFFF) { /* 0xD800-0xDFFF, surrogate first and second values */
+ if (0xDC00 <= in ) {
+ errno=EINVAL; /* 22 */
+ *inBytesLeft=inLen-1;
+ *outBytesLeft-=(pOut-*outBuf);
+ *outBuf=pOut;
+ *inBuf=pIn;
+ return -1;
+
+ } else if (inLen < 4) {
+ errno=EINVAL; /* 22 */
+ *inBytesLeft=inLen-2;
+ *outBytesLeft-=(pOut-*outBuf);
+ *outBuf=pOut;
+ *inBuf=pIn+2;
+ return -1;
+
+ } else {
+ register uint32_t in2;
+ in2=pIn[2];
+ in2<<=8;
+ in2+=pIn[3];
+ if (0xDC00 <= in2 && in2 <= 0xDFFF) { /* second surrogate character =0xDC00 - 0xDFFF*/
+ *pOut=subS;
+ ++numS;
+ pIn+=4;
+ } else {
+ errno=EINVAL; /* 22 */
+ *inBytesLeft=inLen-1;
+ *outBytesLeft-=(pOut-*outBuf);
+ *outBuf=pOut;
+ *inBuf=pIn;
+ return -1;
+ }
+ }
+ } else {
+ if ((*pOut=dmapU2S[in]) == 0x00) {
+ *pOut=subS;
+ ++numS;
+ errno=EINVAL; /* 22 */
+ } else if (*pOut == subS) {
+ if (in != cd->srcSubS)
+ ++numS;
+ }
+ }
+ ++pOut;
+ pIn+=2;
+ inLen-=2;
+ }
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return 0;
+
+ } else if (cd->cnv_dmap->codingSchema == DMAP_82S) {
+ register uchar * dmapU2S=cd->cnv_dmap->dmapU2S;
+ register int inLen=*inBytesLeft;
+ register char * pOut=*outBuf;
+ register char * pIn=*inBuf;
+ register char * pLastOutBuf = *outBuf + *outBytesLeft - 1;
+ register char subS=cd->subS;
+ register size_t numS=0;
+ while (0 < inLen) {
+ register uint32_t in;
+ uint32_t in2; /* The second surrogate value */
+ if (pLastOutBuf < pOut)
+ break;
+ /* convert from UTF-8 to UCS-2 */
+ if (*pIn == 0x00) {
+ in=0x0000;
+ ++pIn;
+ --inLen;
+ } else { /* 82U: */
+ register uchar byte1=*pIn;
+ if ((byte1 & 0x80) == 0x00) { /* if (byte1 & 0b10000000 == 0b00000000) { */
+ /* 1 bytes sequence: 0xxxxxxx => 00000000 0xxxxxxx*/
+ in=byte1;
+ ++pIn;
+ --inLen;
+ } else if ((byte1 & 0xE0) == 0xC0) { /* (byte1 & 0b11100000 == 0b11000000) { */
+ if (inLen < 2) {
+ errno=EINVAL; /* 22 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ if (byte1 == 0xC0 || byte1 == 0xC1) { /* invalid sequence */
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ /* 2 bytes sequence:
+ 110yyyyy 10xxxxxx => 00000yyy yyxxxxxx */
+ register uchar byte2;
+ ++pIn;
+ byte2=*pIn;
+ if ((byte2 & 0xC0) == 0x80) { /* byte2 & 0b11000000 == 0b10000000) { */
+ register uchar work=byte1;
+ work<<=6;
+ byte2&=0x3F; /* 0b00111111; */
+ byte2|=work;
+
+ byte1&=0x1F; /* 0b00011111; */
+ byte1>>=2;
+ in=byte1;
+ in<<=8;
+ in+=byte2;
+ inLen-=2;
+ ++pIn;
+ } else { /* invalid sequence */
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-1;
+ *numSub+=numS;
+ return -1;
+ }
+ } else if ((byte1 & 0xF0) == 0xE0) { /* byte1 & 0b11110000 == 0b11100000 */
+ /* 3 bytes sequence:
+ 1110zzzz 10yyyyyy 10xxxxxx => zzzzyyyy yyxxxxxx */
+ register uchar byte2;
+ register uchar byte3;
+ if (inLen < 3) {
+ if (inLen == 2 && (pIn[1] & 0xC0) != 0x80)
+ errno=EILSEQ; /* 116 */
+ else
+ errno=EINVAL; /* 22 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ ++pIn;
+ byte2=*pIn;
+ ++pIn;
+ byte3=*pIn;
+ if ((byte2 & 0xC0) != 0x80 ||
+ (byte3 & 0xC0) != 0x80 ||
+ (byte1 == 0xE0 && byte2 < 0xA0)) { /* invalid sequence, only 0xA0-0xBF allowed after 0xE0 */
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-2;
+ *numSub+=numS;
+ return -1;
+ }
+ {
+ register uchar work=byte2;
+ work<<=6;
+ byte3&=0x3F; /* 0b00111111; */
+ byte3|=work;
+
+ byte2&=0x3F; /* 0b00111111; */
+ byte2>>=2;
+
+ byte1<<=4;
+ in=byte1 | byte2;;
+ in<<=8;
+ in+=byte3;
+ inLen-=3;
+ ++pIn;
+ }
+ } else if ((0xF0 <= byte1 && byte1 <= 0xF4) || /* (bytes1 & 11111000) == 0x1110000 */
+ ((byte1&=0xF7) && 0xF0 <= byte1 && byte1 <= 0xF4)) { /* minic iconv() behavior */
+ /* 4 bytes sequence
+ 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx => 110110ww wwzzzzyy 110111yy yyxxxxxx
+ where uuuuu = wwww + 1 */
+ register uchar byte2;
+ register uchar byte3;
+ register uchar byte4;
+ if (inLen < 4) {
+ if ((inLen >= 2 && (pIn[1] & 0xC0) != 0x80) ||
+ (inLen >= 3 && (pIn[2] & 0xC0) != 0x80) ||
+ (cd->toCcsid == 13488) )
+ errno=EILSEQ; /* 116 */
+ else
+ errno=EINVAL; /* 22 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ ++pIn;
+ byte2=*pIn;
+ ++pIn;
+ byte3=*pIn;
+ ++pIn;
+ byte4=*pIn;
+ if ((byte2 & 0xC0) == 0x80 && /* byte2 & 0b11000000 == 0b10000000 */
+ (byte3 & 0xC0) == 0x80 && /* byte3 & 0b11000000 == 0b10000000 */
+ (byte4 & 0xC0) == 0x80) { /* byte4 & 0b11000000 == 0b10000000 */
+ register uchar work=byte2;
+ if (byte1 == 0xF0 && byte2 < 0x90) {
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-3;
+ *numSub+=numS;
+ return -1;
+ /* iconv() returns 0 for 0xF4908080 and convert to 0x00
+ } else if (byte1 == 0xF4 && byte2 > 0x8F) {
+ errno=EINVAL;
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-3;
+ *numSub+=numS;
+ return -1;
+ */
+ }
+
+ work&=0x30; /* 0b00110000; */
+ work>>=4;
+ byte1&=0x07; /* 0b00000111; */
+ byte1<<=2;
+ byte1+=work; /* uuuuu */
+ --byte1; /* wwww */
+
+ work=byte1 & 0x0F;
+ work>>=2;
+ work+=0xD8; /* 0b11011011; */
+ in=work;
+ in<<=8;
+
+ byte1<<=6;
+ byte2<<=2;
+ byte2&=0x3C; /* 0b00111100; */
+ work=byte3;
+ work>>=4;
+ work&=0x03; /* 0b00000011; */
+ work|=byte1;
+ work|=byte2;
+ in+=work;
+
+ work=byte3;
+ work>>=2;
+ work&=0x03; /* 0b00000011; */
+ work|=0xDC; /* 0b110111xx; */
+ in2=work;
+ in2<<=8;
+
+ byte3<<=6;
+ byte4&=0x3F; /* 0b00111111; */
+ byte4|=byte3;
+ in2+=byte4;
+ inLen-=4;
+ ++pIn;
+ } else { /* invalid sequence */
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-3;
+ *numSub+=numS;
+ return -1;
+ }
+ } else if ((byte1 & 0xF0) == 0xF0) { /* minic iconv() behavior */
+ if (inLen < 4 ||
+ pIn[1] < 0x80 || 0xBF < pIn[1] ||
+ pIn[2] < 0x80 || 0xBF < pIn[2] ||
+ pIn[3] < 0x80 || 0xBF < pIn[3] ) {
+ if (inLen == 1)
+ errno=EINVAL; /* 22 */
+ else if (inLen == 2 && (pIn[1] & 0xC0) != 0x80)
+ errno=EILSEQ; /* 116 */
+ else if (inLen == 3 && ((pIn[1] & 0xC0) != 0x80 || (pIn[2] & 0xC0) != 0x80))
+ errno=EILSEQ; /* 116 */
+ else if (inLen >= 4 && ((pIn[1] & 0xC0) != 0x80 || (pIn[2] & 0xC0) != 0x80 || (pIn[3] & 0xC0) != 0x80))
+ errno=EILSEQ; /* 116 */
+ else
+ errno=EINVAL; /* 22 */
+
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ } else {
+ *pOut=subS; /* Though returns replacement character, which iconv() does not return. */
+ ++pOut;
+ ++numS;
+ pIn+=4;
+ inLen-=4;
+ /* UTF-8_IBM-850 0xF0908080 : converted value does not match, iconv=0x00, dmap=0x7F
+ UTF-8_IBM-850 0xF0908081 : converted value does not match, iconv=0x01, dmap=0x7F
+ UTF-8_IBM-850 0xF0908082 : converted value does not match, iconv=0x02, dmap=0x7F
+ UTF-8_IBM-850 0xF0908083 : converted value does not match, iconv=0x03, dmap=0x7F
+ ....
+ UTF-8_IBM-850 0xF09081BE : converted value does not match, iconv=0x7E, dmap=0x7F
+ UTF-8_IBM-850 0xF09081BF : converted value does not match, iconv=0x1C, dmap=0x7F
+ UTF-8_IBM-850 0xF09082A0 : converted value does not match, iconv=0xFF, dmap=0x7F
+ UTF-8_IBM-850 0xF09082A1 : converted value does not match, iconv=0xAD, dmap=0x7F
+ ....
+ */
+ continue;
+ /* iconv() returns 0 with strange 1 byte converted values */
+ }
+
+ } else { /* invalid sequence */
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ }
+ /* end of UTF-8 to UCS-2 */
+ if (in == 0x0000) {
+ *pOut=0x00;
+ } else {
+ if ((*pOut=dmapU2S[in]) == 0x00) {
+ *pOut=subS;
+ ++numS;
+ errno=EINVAL; /* 22 */
+ } else if (*pOut == subS) {
+ if (in != cd->srcSubS) {
+ ++numS;
+ }
+ }
+ }
+ ++pOut;
+ }
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return 0;
+
+ } else if (cd->cnv_dmap->codingSchema == DMAP_D2U) {
+ /* use uchar * instead of UniChar to avoid memcpy */
+ register uchar * dmapD12U=(uchar *) (cd->cnv_dmap->dmapD12U);
+ register uchar * dmapD22U=(uchar *) (cd->cnv_dmap->dmapD22U);
+ register int inLen=*inBytesLeft;
+ register char * pOut=*outBuf;
+ register char * pIn=*inBuf;
+ register int offset;
+ register char * pLastOutBuf = *outBuf + *outBytesLeft - 1;
+ register size_t numS=0;
+ while (0 < inLen) {
+ if (pLastOutBuf < pOut)
+ break;
+ if (*pIn == 0x00) {
+ *pOut=0x00;
+ ++pOut;
+ *pOut=0x00;
+ ++pOut;
+ ++pIn;
+ --inLen;
+ } else {
+ offset=*pIn;
+ offset<<=1;
+ if (dmapD12U[offset] == 0x00 &&
+ dmapD12U[offset+1] == 0x00) { /* DBCS */
+ if (inLen < 2) {
+ if (*pIn == 0x80 || *pIn == 0xFF ||
+ (cd->fromCcsid == 943 && (*pIn == 0x85 || *pIn == 0x86 || *pIn == 0xA0 || *pIn == 0xEB || *pIn == 0xEC || *pIn == 0xEF || *pIn == 0xFD || *pIn == 0xFE)) ||
+ (cd->fromCcsid == 932 && (*pIn == 0x85 || *pIn == 0x86 || *pIn == 0x87 || *pIn == 0xEB || *pIn == 0xEC || *pIn == 0xED || *pIn == 0xEE || *pIn == 0xEF)) ||
+ (cd->fromCcsid == 1381 && ((0x85 <= *pIn && *pIn <= 0x8B) || (0xAA <= *pIn && *pIn <= 0xAF) || (0xF8 <= *pIn && *pIn <= 0xFE))))
+ errno=EILSEQ; /* 116 */
+ else
+ errno=EINVAL; /* 22 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ return -1;
+ }
+ offset-=0x100;
+ ++pIn;
+ offset<<=8;
+ offset+=(*pIn * 2);
+ if (dmapD22U[offset] == 0x00 &&
+ dmapD22U[offset+1] == 0x00) {
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-1;
+ return -1;
+ }
+ *pOut=dmapD22U[offset];
+ ++pOut;
+ *pOut=dmapD22U[offset+1];
+ ++pOut;
+ if (dmapD22U[offset] == 0xFF &&
+ dmapD22U[offset+1] == 0xFD) {
+ if (pIn[-1] * 0x100 + pIn[0] != cd->srcSubD)
+ ++numS;
+ }
+ ++pIn;
+ inLen-=2;
+ } else { /* SBCS */
+ *pOut=dmapD12U[offset];
+ ++pOut;
+ *pOut=dmapD12U[offset+1];
+ ++pOut;
+ if (dmapD12U[offset] == 0x00 &&
+ dmapD12U[offset+1] == 0x1A) {
+ if (*pIn != cd->srcSubS)
+ ++numS;
+ }
+ ++pIn;
+ --inLen;
+ }
+ }
+ }
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return 0;
+
+ } else if (cd->cnv_dmap->codingSchema == DMAP_D28) {
+ /* use uchar * instead of UniChar to avoid memcpy */
+ register uchar * dmapD12U=(uchar *) (cd->cnv_dmap->dmapD12U);
+ register uchar * dmapD22U=(uchar *) (cd->cnv_dmap->dmapD22U);
+ register int inLen=*inBytesLeft;
+ register char * pOut=*outBuf;
+ register char * pIn=*inBuf;
+ register int offset;
+ register char * pLastOutBuf = *outBuf + *outBytesLeft - 1;
+ register size_t numS=0;
+ register UniChar in; /* copy part of U28 */
+ register UniChar ucs2;
+ while (0 < inLen) {
+ if (pLastOutBuf < pOut)
+ break;
+ if (*pIn == 0x00) {
+ *pOut=0x00;
+ ++pOut;
+ ++pIn;
+ --inLen;
+ } else {
+ offset=*pIn;
+ offset<<=1;
+ if (dmapD12U[offset] == 0x00 &&
+ dmapD12U[offset+1] == 0x00) { /* DBCS */
+ if (inLen < 2) {
+ if (*pIn == 0x80 || *pIn == 0xFF ||
+ (cd->fromCcsid == 943 && (*pIn == 0x85 || *pIn == 0x86 || *pIn == 0xA0 || *pIn == 0xEB || *pIn == 0xEC || *pIn == 0xEF || *pIn == 0xFD || *pIn == 0xFE)) ||
+ (cd->fromCcsid == 932 && (*pIn == 0x85 || *pIn == 0x86 || *pIn == 0x87 || *pIn == 0xEB || *pIn == 0xEC || *pIn == 0xED || *pIn == 0xEE || *pIn == 0xEF)) ||
+ (cd->fromCcsid == 1381 && ((0x85 <= *pIn && *pIn <= 0x8B) || (0xAA <= *pIn && *pIn <= 0xAF) || (0xF8 <= *pIn && *pIn <= 0xFE))))
+ errno=EILSEQ; /* 116 */
+ else
+ errno=EINVAL; /* 22 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ return -1;
+ }
+ offset-=0x100;
+ ++pIn;
+ offset<<=8;
+ offset+=(*pIn * 2);
+ if (dmapD22U[offset] == 0x00 &&
+ dmapD22U[offset+1] == 0x00) {
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-1;
+ return -1;
+ }
+ in=dmapD22U[offset];
+ in<<=8;
+ in+=dmapD22U[offset+1];
+ ucs2=in;
+ if (dmapD22U[offset] == 0xFF &&
+ dmapD22U[offset+1] == 0xFD) {
+ if (in != cd->srcSubD)
+ ++numS;
+ }
+ ++pIn;
+ inLen-=2;
+ } else { /* SBCS */
+ in=dmapD12U[offset];
+ in<<=8;
+ in+=dmapD12U[offset+1];
+ ucs2=in;
+ if (dmapD12U[offset] == 0x00 &&
+ dmapD12U[offset+1] == 0x1A) {
+ if (in != cd->srcSubS)
+ ++numS;
+ }
+ ++pIn;
+ --inLen;
+ }
+ if ((in & 0xFF80) == 0x0000) { /* U28: in & 0b1111111110000000 == 0x0000 */
+ *pOut=in;
+ ++pOut;
+ } else if ((in & 0xF800) == 0x0000) { /* in & 0b1111100000000000 == 0x0000 */
+ register uchar byte;
+ in>>=6;
+ in&=0x001F; /* 0b0000000000011111 */
+ in|=0x00C0; /* 0b0000000011000000 */
+ *pOut=in;
+ ++pOut;
+ byte=ucs2; /* dmapD12U[offset+1]; */
+ byte&=0x3F; /* 0b00111111; */
+ byte|=0x80; /* 0b10000000; */
+ *pOut=byte;
+ ++pOut;
+ } else if ((in & 0xFC00) == 0xD800) { /* There should not be no surrogate character in SBCS. */
+ *pOut=0xEF;
+ ++pOut;
+ *pOut=0xBF;
+ ++pOut;
+ *pOut=0xBD;
+ ++pOut;
+ } else {
+ register uchar byte;
+ register uchar work;
+ byte=(ucs2>>8); /* dmapD12U[offset]; */
+ byte>>=4;
+ byte|=0xE0; /* 0b11100000; */
+ *pOut=byte;
+ ++pOut;
+
+ byte=(ucs2>>8); /* dmapD12U[offset]; */
+ byte<<=2;
+ work=ucs2; /* dmapD12U[offset+1]; */
+ work>>=6;
+ byte|=work;
+ byte&=0x3F; /* 0b00111111; */
+ byte|=0x80; /* 0b10000000; */
+ *pOut=byte;
+ ++pOut;
+
+ byte=ucs2; /* dmapD12U[offset+1]; */
+ byte&=0x3F; /* 0b00111111; */
+ byte|=0x80; /* 0b10000000; */
+ *pOut=byte;
+ ++pOut;
+ }
+ /* end of U28 */
+ }
+ }
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return 0;
+
+ } else if (cd->cnv_dmap->codingSchema == DMAP_U2D) {
+ register uchar * dmapU2D=cd->cnv_dmap->dmapU2D;
+ register int inLen=*inBytesLeft;
+ register char * pOut=*outBuf;
+ register char * pIn=*inBuf;
+ register char * pLastOutBuf = *outBuf + *outBytesLeft - 1;
+ register char subS=cd->subS;
+ register char * pSubD=(char *) &(cd->subD);
+ register size_t numS=0;
+ while (0 < inLen) {
+ register uint32_t in;
+ if (inLen == 1) {
+ errno=EINVAL; /* 22 */
+
+ *inBytesLeft=inLen;
+ *outBytesLeft-=(pOut-*outBuf);
+ *outBuf=pOut;
+ *inBuf=pIn;
+ return -1;
+ }
+ if (pLastOutBuf < pOut)
+ break;
+ in=pIn[0];
+ in<<=8;
+ in+=pIn[1];
+ if (in == 0x0000) {
+ *pOut=0x00;
+ ++pOut;
+ } else {
+ in<<=1;
+ *pOut=dmapU2D[in];
+ ++pOut;
+ if (dmapU2D[in+1] == 0x00) { /* SBCS */
+ if (*pOut == subS) {
+ if (in != cd->srcSubS)
+ ++numS;
+ }
+ } else {
+ *pOut=dmapU2D[in+1];
+ ++pOut;
+ if (dmapU2D[in] == pSubD[0] &&
+ dmapU2D[in+1] == pSubD[1]) {
+ in>>=1;
+ if (in != cd->srcSubD)
+ ++numS;
+ }
+ }
+ }
+ pIn+=2;
+ inLen-=2;
+ }
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return numS; /* to minic iconv() behavior */
+
+ } else if (cd->cnv_dmap->codingSchema == DMAP_T2D) {
+ register uchar * dmapU2D=cd->cnv_dmap->dmapU2D;
+ register int inLen=*inBytesLeft;
+ register char * pOut=*outBuf;
+ register char * pIn=*inBuf;
+ register char * pLastOutBuf = *outBuf + *outBytesLeft - 1;
+ register char subS=cd->subS;
+ register char * pSubD=(char *) &(cd->subD);
+ register size_t numS=0;
+ while (0 < inLen) {
+ register uint32_t in;
+ if (inLen == 1) {
+ errno=EINVAL; /* 22 */
+ *inBytesLeft=inLen-1;
+ *outBytesLeft-=(pOut-*outBuf);
+ *outBuf=pOut;
+ *inBuf=pIn;
+ ++numS;
+ *numSub+=numS;
+ return 0;
+ }
+ if (pLastOutBuf < pOut)
+ break;
+ in=pIn[0];
+ in<<=8;
+ in+=pIn[1];
+ if (in == 0x0000) {
+ *pOut=0x00;
+ ++pOut;
+ } else if (0xD800 <= in && in <= 0xDBFF) { /* first byte of surrogate */
+ errno=EINVAL; /* 22 */
+ *inBytesLeft=inLen-2;
+ *outBytesLeft-=(pOut-*outBuf);
+ *outBuf=pOut;
+ *inBuf=pIn+2;
+ ++numS;
+ *numSub+=numS;
+ return -1;
+
+ } else if (0xDC00 <= in && in <= 0xDFFF) { /* second byte of surrogate */
+ errno=EINVAL; /* 22 */
+ *inBytesLeft=inLen-1;
+ *outBytesLeft-=(pOut-*outBuf);
+ *outBuf=pOut;
+ *inBuf=pIn;
+ ++numS;
+ *numSub+=numS;
+ return -1;
+
+ } else {
+ in<<=1;
+ *pOut=dmapU2D[in];
+ ++pOut;
+ if (dmapU2D[in+1] == 0x00) { /* SBCS */
+ if (*pOut == subS) {
+ if (in != cd->srcSubS)
+ ++numS;
+ }
+ } else {
+ *pOut=dmapU2D[in+1];
+ ++pOut;
+ if (dmapU2D[in] == pSubD[0] &&
+ dmapU2D[in+1] == pSubD[1]) {
+ in>>=1;
+ if (in != cd->srcSubD)
+ ++numS;
+ }
+ }
+ }
+ pIn+=2;
+ inLen-=2;
+ }
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return 0; /* to minic iconv() behavior */
+
+ } else if (cd->cnv_dmap->codingSchema == DMAP_82D) {
+ register uchar * dmapU2D=cd->cnv_dmap->dmapU2D;
+ register int inLen=*inBytesLeft;
+ register char * pOut=*outBuf;
+ register char * pIn=*inBuf;
+ register char * pLastOutBuf = *outBuf + *outBytesLeft - 1;
+ register char subS=cd->subS;
+ register char * pSubD=(char *) &(cd->subD);
+ register size_t numS=0;
+ while (0 < inLen) {
+ register uint32_t in;
+ uint32_t in2;
+ if (pLastOutBuf < pOut)
+ break;
+ /* convert from UTF-8 to UCS-2 */
+ if (*pIn == 0x00) {
+ in=0x0000;
+ ++pIn;
+ --inLen;
+ } else { /* 82U: */
+ register uchar byte1=*pIn;
+ if ((byte1 & 0x80) == 0x00) { /* if (byte1 & 0b10000000 == 0b00000000) { */
+ /* 1 bytes sequence: 0xxxxxxx => 00000000 0xxxxxxx*/
+ in=byte1;
+ ++pIn;
+ --inLen;
+ } else if ((byte1 & 0xE0) == 0xC0) { /* (byte1 & 0b11100000 == 0b11000000) { */
+ if (inLen < 2) {
+ errno=EINVAL; /* 22 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ if (byte1 == 0xC0 || byte1 == 0xC1) { /* invalid sequence */
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ /* 2 bytes sequence:
+ 110yyyyy 10xxxxxx => 00000yyy yyxxxxxx */
+ register uchar byte2;
+ ++pIn;
+ byte2=*pIn;
+ if ((byte2 & 0xC0) == 0x80) { /* byte2 & 0b11000000 == 0b10000000) { */
+ register uchar work=byte1;
+ work<<=6;
+ byte2&=0x3F; /* 0b00111111; */
+ byte2|=work;
+
+ byte1&=0x1F; /* 0b00011111; */
+ byte1>>=2;
+ in=byte1;
+ in<<=8;
+ in+=byte2;
+ inLen-=2;
+ ++pIn;
+ } else { /* invalid sequence */
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-1;
+ *numSub+=numS;
+ return -1;
+ }
+ } else if ((byte1 & 0xF0) == 0xE0) { /* byte1 & 0b11110000 == 0b11100000 */
+ /* 3 bytes sequence:
+ 1110zzzz 10yyyyyy 10xxxxxx => zzzzyyyy yyxxxxxx */
+ register uchar byte2;
+ register uchar byte3;
+ if (inLen < 3) {
+ if (inLen == 2 && (pIn[1] & 0xC0) != 0x80)
+ errno=EILSEQ; /* 116 */
+ else
+ errno=EINVAL; /* 22 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ ++pIn;
+ byte2=*pIn;
+ ++pIn;
+ byte3=*pIn;
+ if ((byte2 & 0xC0) != 0x80 ||
+ (byte3 & 0xC0) != 0x80 ||
+ (byte1 == 0xE0 && byte2 < 0xA0)) { /* invalid sequence, only 0xA0-0xBF allowed after 0xE0 */
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-2;
+ *numSub+=numS;
+ return -1;
+ }
+ {
+ register uchar work=byte2;
+ work<<=6;
+ byte3&=0x3F; /* 0b00111111; */
+ byte3|=work;
+
+ byte2&=0x3F; /* 0b00111111; */
+ byte2>>=2;
+
+ byte1<<=4;
+ in=byte1 | byte2;;
+ in<<=8;
+ in+=byte3;
+ inLen-=3;
+ ++pIn;
+ }
+ } else if ((0xF0 <= byte1 && byte1 <= 0xF4)) { /* (bytes1 & 11111000) == 0x1110000 */
+ /* 4 bytes sequence
+ 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx => 110110ww wwzzzzyy 110111yy yyxxxxxx
+ where uuuuu = wwww + 1 */
+ register uchar byte2;
+ register uchar byte3;
+ register uchar byte4;
+ if (inLen < 4) {
+ if ((inLen >= 2 && (pIn[1] & 0xC0) != 0x80) ||
+ (inLen >= 3 && (pIn[2] & 0xC0) != 0x80) ||
+ (cd->toCcsid == 13488) )
+ errno=EILSEQ; /* 116 */
+ else
+ errno=EINVAL; /* 22 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ ++pIn;
+ byte2=*pIn;
+ ++pIn;
+ byte3=*pIn;
+ ++pIn;
+ byte4=*pIn;
+ if ((byte2 & 0xC0) == 0x80 && /* byte2 & 0b11000000 == 0b10000000 */
+ (byte3 & 0xC0) == 0x80 && /* byte3 & 0b11000000 == 0b10000000 */
+ (byte4 & 0xC0) == 0x80) { /* byte4 & 0b11000000 == 0b10000000 */
+ register uchar work=byte2;
+ if (byte1 == 0xF0 && byte2 < 0x90) {
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-3;
+ *numSub+=numS;
+ return -1;
+ /* iconv() returns 0 for 0xF4908080 and convert to 0x00
+ } else if (byte1 == 0xF4 && byte2 > 0x8F) {
+ errno=EINVAL;
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-3;
+ *numSub+=numS;
+ return -1;
+ */
+ }
+
+ work&=0x30; /* 0b00110000; */
+ work>>=4;
+ byte1&=0x07; /* 0b00000111; */
+ byte1<<=2;
+ byte1+=work; /* uuuuu */
+ --byte1; /* wwww */
+
+ work=byte1 & 0x0F;
+ work>>=2;
+ work+=0xD8; /* 0b11011011; */
+ in=work;
+ in<<=8;
+
+ byte1<<=6;
+ byte2<<=2;
+ byte2&=0x3C; /* 0b00111100; */
+ work=byte3;
+ work>>=4;
+ work&=0x03; /* 0b00000011; */
+ work|=byte1;
+ work|=byte2;
+ in+=work;
+
+ work=byte3;
+ work>>=2;
+ work&=0x03; /* 0b00000011; */
+ work|=0xDC; /* 0b110111xx; */
+ in2=work;
+ in2<<=8;
+
+ byte3<<=6;
+ byte4&=0x3F; /* 0b00111111; */
+ byte4|=byte3;
+ in2+=byte4;
+ inLen-=4;
+ ++pIn;
+#ifdef match_with_GBK
+ if ((0xD800 == in && in2 < 0xDC80) ||
+ (0xD840 == in && in2 < 0xDC80) ||
+ (0xD880 == in && in2 < 0xDC80) ||
+ (0xD8C0 == in && in2 < 0xDC80) ||
+ (0xD900 == in && in2 < 0xDC80) ||
+ (0xD940 == in && in2 < 0xDC80) ||
+ (0xD980 == in && in2 < 0xDC80) ||
+ (0xD9C0 == in && in2 < 0xDC80) ||
+ (0xDA00 == in && in2 < 0xDC80) ||
+ (0xDA40 == in && in2 < 0xDC80) ||
+ (0xDA80 == in && in2 < 0xDC80) ||
+ (0xDAC0 == in && in2 < 0xDC80) ||
+ (0xDB00 == in && in2 < 0xDC80) ||
+ (0xDB40 == in && in2 < 0xDC80) ||
+ (0xDB80 == in && in2 < 0xDC80) ||
+ (0xDBC0 == in && in2 < 0xDC80)) {
+#else
+ if ((0xD800 <= in && in <= 0xDBFF) &&
+ (0xDC00 <= in2 && in2 <= 0xDFFF)) {
+#endif
+ *pOut=subS;
+ ++pOut;
+ ++numS;
+ continue;
+ }
+ } else { /* invalid sequence */
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-3;
+ *numSub+=numS;
+ return -1;
+ }
+ } else if (0xF5 <= byte1 && byte1 <= 0xFF) { /* minic iconv() behavior */
+ if (inLen < 4 ||
+ (inLen >= 4 && byte1 == 0xF8 && pIn[1] < 0x90) ||
+ pIn[1] < 0x80 || 0xBF < pIn[1] ||
+ pIn[2] < 0x80 || 0xBF < pIn[2] ||
+ pIn[3] < 0x80 || 0xBF < pIn[3] ) {
+ if (inLen == 1)
+ errno=EINVAL; /* 22 */
+ else if (inLen == 2 && (pIn[1] & 0xC0) != 0x80)
+ errno=EILSEQ; /* 116 */
+ else if (inLen == 3 && ((pIn[1] & 0xC0) != 0x80 || (pIn[2] & 0xC0) != 0x80))
+ errno=EILSEQ; /* 116 */
+ else if (inLen >= 4 && (byte1 == 0xF8 || (pIn[1] & 0xC0) != 0x80 || (pIn[2] & 0xC0) != 0x80 || (pIn[3] & 0xC0) != 0x80))
+ errno=EILSEQ; /* 116 */
+ else
+ errno=EINVAL; /* 22 */
+
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ } else if ((pIn[1] == 0x80 || pIn[1] == 0x90 || pIn[1] == 0xA0 || pIn[1] == 0xB0) &&
+ pIn[2] < 0x82) {
+ *pOut=subS; /* Though returns replacement character, which iconv() does not return. */
+ ++pOut;
+ ++numS;
+ pIn+=4;
+ inLen-=4;
+ continue;
+ } else {
+ *pOut=pSubD[0]; /* Though returns replacement character, which iconv() does not return. */
+ ++pOut;
+ *pOut=pSubD[1];
+ ++pOut;
+ ++numS;
+ pIn+=4;
+ inLen-=4;
+ continue;
+ /* iconv() returns 0 with strange 1 byte converted values */
+ }
+
+ } else { /* invalid sequence */
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ }
+ /* end of UTF-8 to UCS-2 */
+ if (in == 0x0000) {
+ *pOut=0x00;
+ ++pOut;
+ } else {
+ in<<=1;
+ *pOut=dmapU2D[in];
+ ++pOut;
+ if (dmapU2D[in+1] == 0x00) { /* SBCS */
+ if (dmapU2D[in] == subS) {
+ in>>=1;
+ if (in != cd->srcSubS)
+ ++numS;
+ }
+ } else {
+ *pOut=dmapU2D[in+1];
+ ++pOut;
+ if (dmapU2D[in] == pSubD[0] &&
+ dmapU2D[in+1] == pSubD[1]) {
+ in>>=1;
+ if (in != cd->srcSubD)
+ ++numS;
+ }
+ }
+ }
+ }
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return 0;
+
+ } else if (cd->cnv_dmap->codingSchema == DMAP_82U) {
+ /* See http://unicode.org/versions/corrigendum1.html */
+ /* convert from UTF-8 to UTF-16 can cover all conversion from UTF-8 to UCS-2 */
+ register int inLen=*inBytesLeft;
+ register char * pOut=*outBuf;
+ register char * pIn=*inBuf;
+ register char * pLastOutBuf = *outBuf + *outBytesLeft - 1;
+ register size_t numS=0;
+ while (0 < inLen) {
+ if (pLastOutBuf < pOut)
+ break;
+ if (*pIn == 0x00) {
+ *pOut=0x00;
+ ++pOut;
+ *pOut=0x00;
+ ++pOut;
+ ++pIn;
+ --inLen;
+ } else { /* 82U: */
+ register uchar byte1=*pIn;
+ if ((byte1 & 0x80) == 0x00) { /* if (byte1 & 0b10000000 == 0b00000000) { */
+ /* 1 bytes sequence: 0xxxxxxx => 00000000 0xxxxxxx*/
+ *pOut=0x00;
+ ++pOut;
+ *pOut=byte1;
+ ++pOut;
+ ++pIn;
+ --inLen;
+ } else if ((byte1 & 0xE0) == 0xC0) { /* (byte1 & 0b11100000 == 0b11000000) { */
+ if (inLen < 2) {
+ errno=EINVAL; /* 22 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ if (byte1 == 0xC0 || byte1 == 0xC1) { /* invalid sequence */
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ /* 2 bytes sequence:
+ 110yyyyy 10xxxxxx => 00000yyy yyxxxxxx */
+ register uchar byte2;
+ ++pIn;
+ byte2=*pIn;
+ if ((byte2 & 0xC0) == 0x80) { /* byte2 & 0b11000000 == 0b10000000) { */
+ register uchar work=byte1;
+ work<<=6;
+ byte2&=0x3F; /* 0b00111111; */
+ byte2|=work;
+
+ byte1&=0x1F; /* 0b00011111; */
+ byte1>>=2;
+ *pOut=byte1;
+ ++pOut;
+ *pOut=byte2;
+ ++pOut;
+ inLen-=2;
+ ++pIn;
+ } else { /* invalid sequence */
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-1;
+ *numSub+=numS;
+ return -1;
+ }
+ } else if ((byte1 & 0xF0) == 0xE0) { /* byte1 & 0b11110000 == 0b11100000 */
+ /* 3 bytes sequence:
+ 1110zzzz 10yyyyyy 10xxxxxx => zzzzyyyy yyxxxxxx */
+ register uchar byte2;
+ register uchar byte3;
+ if (inLen < 3) {
+ if (inLen == 2 && (pIn[1] & 0xC0) != 0x80)
+ errno=EILSEQ; /* 116 */
+ else
+ errno=EINVAL; /* 22 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ ++pIn;
+ byte2=*pIn;
+ ++pIn;
+ byte3=*pIn;
+ if ((byte2 & 0xC0) != 0x80 ||
+ (byte3 & 0xC0) != 0x80 ||
+ (byte1 == 0xE0 && byte2 < 0xA0)) { /* invalid sequence, only 0xA0-0xBF allowed after 0xE0 */
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-2;
+ *numSub+=numS;
+ return -1;
+ }
+ {
+ register uchar work=byte2;
+ work<<=6;
+ byte3&=0x3F; /* 0b00111111; */
+ byte3|=work;
+
+ byte2&=0x3F; /* 0b00111111; */
+ byte2>>=2;
+
+ byte1<<=4;
+ *pOut=byte1 | byte2;;
+ ++pOut;
+ *pOut=byte3;
+ ++pOut;
+ inLen-=3;
+ ++pIn;
+ }
+ } else if ((0xF0 <= byte1 && byte1 <= 0xF4) || /* (bytes1 & 11111000) == 0x1110000 */
+ ((byte1&=0xF7) && 0xF0 <= byte1 && byte1 <= 0xF4)) { /* minic iconv() behavior */
+ /* 4 bytes sequence
+ 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx => 110110ww wwzzzzyy 110111yy yyxxxxxx
+ where uuuuu = wwww + 1 */
+ register uchar byte2;
+ register uchar byte3;
+ register uchar byte4;
+ if (inLen < 4 || cd->toCcsid == 13488) {
+ if ((inLen >= 2 && (pIn[1] & 0xC0) != 0x80) ||
+ (inLen >= 3 && (pIn[2] & 0xC0) != 0x80) ||
+ (cd->toCcsid == 13488) )
+ errno=EILSEQ; /* 116 */
+ else
+ errno=EINVAL; /* 22 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ ++pIn;
+ byte2=*pIn;
+ ++pIn;
+ byte3=*pIn;
+ ++pIn;
+ byte4=*pIn;
+ if ((byte2 & 0xC0) == 0x80 && /* byte2 & 0b11000000 == 0b10000000 */
+ (byte3 & 0xC0) == 0x80 && /* byte3 & 0b11000000 == 0b10000000 */
+ (byte4 & 0xC0) == 0x80) { /* byte4 & 0b11000000 == 0b10000000 */
+ register uchar work=byte2;
+ if (byte1 == 0xF0 && byte2 < 0x90) {
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-3;
+ *numSub+=numS;
+ return -1;
+ } else if (byte1 == 0xF4 && byte2 > 0x8F) {
+ errno=EINVAL; /* 22 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-3;
+ *numSub+=numS;
+ return -1;
+ }
+
+ work&=0x30; /* 0b00110000; */
+ work>>=4;
+ byte1&=0x07; /* 0b00000111; */
+ byte1<<=2;
+ byte1+=work; /* uuuuu */
+ --byte1; /* wwww */
+
+ work=byte1 & 0x0F;
+ work>>=2;
+ work+=0xD8; /* 0b11011011; */
+ *pOut=work;
+ ++pOut;
+
+ byte1<<=6;
+ byte2<<=2;
+ byte2&=0x3C; /* 0b00111100; */
+ work=byte3;
+ work>>=4;
+ work&=0x03; /* 0b00000011; */
+ work|=byte1;
+ work|=byte2;
+ *pOut=work;
+ ++pOut;
+
+ work=byte3;
+ work>>=2;
+ work&=0x03; /* 0b00000011; */
+ work|=0xDC; /* 0b110111xx; */
+ *pOut=work;
+ ++pOut;
+
+ byte3<<=6;
+ byte4&=0x3F; /* 0b00111111; */
+ byte4|=byte3;
+ *pOut=byte4;
+ ++pOut;
+ inLen-=4;
+ ++pIn;
+ } else { /* invalid sequence */
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn-3;
+ *numSub+=numS;
+ return -1;
+ }
+ } else if ((byte1 & 0xF0) == 0xF0) {
+ if (cd->toCcsid == 13488) {
+ errno=EILSEQ; /* 116 */
+ } else {
+ if (inLen == 1)
+ errno=EINVAL; /* 22 */
+ else if (inLen == 2 && (pIn[1] & 0xC0) != 0x80)
+ errno=EILSEQ; /* 116 */
+ else if (inLen == 3 && ((pIn[1] & 0xC0) != 0x80 || (pIn[2] & 0xC0) != 0x80))
+ errno=EILSEQ; /* 116 */
+ else if (inLen >= 4 && ((pIn[1] & 0xC0) != 0x80 || (pIn[2] & 0xC0) != 0x80 || (pIn[3] & 0xC0) != 0x80))
+ errno=EILSEQ; /* 116 */
+ else
+ errno=EINVAL; /* 22 */
+ }
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+
+ } else { /* invalid sequence */
+ errno=EILSEQ; /* 116 */
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return -1;
+ }
+ }
+ }
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ *numSub+=numS;
+ return 0;
+ } else if (cd->cnv_dmap->codingSchema == DMAP_U28) {
+ /* See http://unicode.org/versions/corrigendum1.html */
+ register int inLen=*inBytesLeft;
+ register char * pOut=*outBuf;
+ register char * pIn=*inBuf;
+ register char * pLastOutBuf = *outBuf + *outBytesLeft - 1;
+ // register size_t numS=0;
+ while (0 < inLen) {
+ register uint32_t in;
+ if (inLen == 1) {
+ errno=EINVAL; /* 22 */
+ *inBytesLeft=inLen;
+ *outBytesLeft-=(pOut-*outBuf);
+ *outBuf=pOut;
+ *inBuf=pIn;
+ return -1;
+ }
+ if (pLastOutBuf < pOut)
+ break;
+ in=pIn[0];
+ in<<=8;
+ in+=pIn[1];
+ if (in == 0x0000) {
+ *pOut=0x00;
+ ++pOut;
+ } else if ((in & 0xFF80) == 0x0000) { /* U28: in & 0b1111111110000000 == 0x0000 */
+ *pOut=in;
+ ++pOut;
+ } else if ((in & 0xF800) == 0x0000) { /* in & 0b1111100000000000 == 0x0000 */
+ register uchar byte;
+ in>>=6;
+ in&=0x001F; /* 0b0000000000011111 */
+ in|=0x00C0; /* 0b0000000011000000 */
+ *pOut=in;
+ ++pOut;
+ byte=pIn[1];
+ byte&=0x3F; /* 0b00111111; */
+ byte|=0x80; /* 0b10000000; */
+ *pOut=byte;
+ ++pOut;
+ } else {
+ register uchar byte;
+ register uchar work;
+ byte=pIn[0];
+ byte>>=4;
+ byte|=0xE0; /* 0b11100000; */
+ *pOut=byte;
+ ++pOut;
+
+ byte=pIn[0];
+ byte<<=2;
+ work=pIn[1];
+ work>>=6;
+ byte|=work;
+ byte&=0x3F; /* 0b00111111; */
+ byte|=0x80; /* 0b10000000; */
+ *pOut=byte;
+ ++pOut;
+
+ byte=pIn[1];
+ byte&=0x3F; /* 0b00111111; */
+ byte|=0x80; /* 0b10000000; */
+ *pOut=byte;
+ ++pOut;
+ }
+ pIn+=2;
+ inLen-=2;
+ }
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ // *numSub+=numS;
+ return 0;
+
+ } else if (cd->cnv_dmap->codingSchema == DMAP_T28) { /* UTF-16_UTF-8 */
+ /* See http://unicode.org/versions/corrigendum1.html */
+ register int inLen=*inBytesLeft;
+ register char * pOut=*outBuf;
+ register char * pIn=*inBuf;
+ register char * pLastOutBuf = *outBuf + *outBytesLeft - 1;
+ // register size_t numS=0;
+ while (0 < inLen) {
+ register uint32_t in;
+ if (inLen == 1) {
+ errno=EINVAL; /* 22 */
+ *inBytesLeft=0;
+ *outBytesLeft-=(pOut-*outBuf);
+ *outBuf=pOut;
+ *inBuf=pIn;
+ return 0;
+ }
+ if (pLastOutBuf < pOut)
+ break;
+ in=pIn[0];
+ in<<=8;
+ in+=pIn[1];
+ if (in == 0x0000) {
+ *pOut=0x00;
+ ++pOut;
+ } else if ((in & 0xFF80) == 0x0000) { /* U28: in & 0b1111111110000000 == 0x0000 */
+ *pOut=in;
+ ++pOut;
+ } else if ((in & 0xF800) == 0x0000) { /* in & 0b1111100000000000 == 0x0000 */
+ register uchar byte;
+ in>>=6;
+ in&=0x001F; /* 0b0000000000011111 */
+ in|=0x00C0; /* 0b0000000011000000 */
+ *pOut=in;
+ ++pOut;
+ byte=pIn[1];
+ byte&=0x3F; /* 0b00111111; */
+ byte|=0x80; /* 0b10000000; */
+ *pOut=byte;
+ ++pOut;
+ } else if ((in & 0xFC00) == 0xD800) { /* in & 0b1111110000000000 == 0b1101100000000000, first surrogate character */
+ if (0xDC00 <= in ) {
+ errno=EINVAL; /* 22 */
+ *inBytesLeft=inLen-1;
+ *outBytesLeft-=(pOut-*outBuf);
+ *outBuf=pOut;
+ *inBuf=pIn;
+ return -1;
+
+ } else if (inLen < 4) {
+ errno=EINVAL; /* 22 */
+ *inBytesLeft=inLen-2;
+ *outBytesLeft-=(pOut-*outBuf);
+ *outBuf=pOut;
+ *inBuf=pIn+2;
+ return -1;
+
+ } else if ((pIn[2] & 0xFC) != 0xDC) { /* pIn[2] & 0b11111100 == 0b11011100, second surrogate character */
+ errno=EINVAL; /* 22 */
+ *inBytesLeft=inLen-2;
+ *outBytesLeft-=(pOut-*outBuf);
+ *outBuf=pOut;
+ *inBuf=pIn+2;
+ return -1;
+
+ } else {
+ register uchar byte;
+ register uchar work;
+ in>>=6;
+ in&=0x000F; /* 0b0000000000001111 */
+ byte=in; /* wwww */
+ ++byte; /* uuuuu */
+ work=byte; /* save uuuuu */
+ byte>>=2;
+ byte|=0xF0; /* 0b11110000; */
+ *pOut=byte;
+ ++pOut;
+
+ byte=work;
+ byte&=0x03; /* 0b00000011; */
+ byte<<=4;
+ byte|=0x80; /* 0b10000000; */
+ work=pIn[1];
+ work&=0x3C; /* 0b00111100; */
+ work>>=2;
+ byte|=work;
+ *pOut=byte;
+ ++pOut;
+
+ byte=pIn[1];
+ byte&=0x03; /* 0b00000011; */
+ byte<<=4;
+ byte|=0x80; /* 0b10000000; */
+ work=pIn[2];
+ work&=0x03; /* 0b00000011; */
+ work<<=2;
+ byte|=work;
+ work=pIn[3];
+ work>>=6;
+ byte|=work;
+ *pOut=byte;
+ ++pOut;
+
+ byte=pIn[3];
+ byte&=0x3F; /* 0b00111111; */
+ byte|=0x80; /* 0b10000000; */
+ *pOut=byte;
+ ++pOut;
+ pIn+=2;
+ inLen-=2;
+ }
+ } else if ((in & 0xFC00) == 0xDC00) { /* in & 0b11111100 == 0b11011100, second surrogate character */
+ errno=EINVAL; /* 22 */
+ *inBytesLeft=inLen-1;
+ *outBytesLeft-=(pOut-*outBuf);
+ *outBuf=pOut;
+ *inBuf=pIn;
+ return -1;
+
+ } else {
+ register uchar byte;
+ register uchar work;
+ byte=pIn[0];
+ byte>>=4;
+ byte|=0xE0; /* 0b11100000; */
+ *pOut=byte;
+ ++pOut;
+
+ byte=pIn[0];
+ byte<<=2;
+ work=pIn[1];
+ work>>=6;
+ byte|=work;
+ byte&=0x3F; /* 0b00111111; */
+ byte|=0x80; /* 0b10000000; */
+ *pOut=byte;
+ ++pOut;
+
+ byte=pIn[1];
+ byte&=0x3F; /* 0b00111111; */
+ byte|=0x80; /* 0b10000000; */
+ *pOut=byte;
+ ++pOut;
+ }
+ pIn+=2;
+ inLen-=2;
+ }
+ *outBytesLeft-=(pOut-*outBuf);
+ *inBytesLeft=inLen;
+ *outBuf=pOut;
+ *inBuf=pIn;
+ // *numSub+=numS;
+ return 0;
+
+ } else if (cd->cnv_dmap->codingSchema == DMAP_U2U) { /* UTF-16_UCS-2 */
+ register int inLen=*inBytesLeft;
+ register int outLen=*outBytesLeft;
+ if (inLen <= outLen) {
+ memcpy(*outBuf, *inBuf, inLen);
+ (*outBytesLeft)-=inLen;
+ (*inBuf)+=inLen;
+ (*outBuf)+=inLen;
+ *inBytesLeft=0;
+ return 0;
+ }
+ memcpy(*outBuf, *inBuf, outLen);
+ (*outBytesLeft)=0;
+ (*inBuf)+=outLen;
+ (*outBuf)+=outLen;
+ *inBytesLeft-=outLen;
+ return (*inBytesLeft);
+
+ } else {
+ return -1;
+ }
+ return 0;
+}
+
+
+#ifdef DEBUG
+inline size_t myconv(myconv_t cd ,
+ char** inBuf,
+ size_t* inBytesLeft,
+ char** outBuf,
+ size_t* outBytesLeft,
+ size_t* numSub)
+{
+ if (cd->converterType == CONVERTER_ICONV) {
+ return myconv_iconv(cd,inBuf,inBytesLeft,outBuf,outBytesLeft,numSub);
+ } else if (cd->converterType == CONVERTER_DMAP) {
+ return myconv_dmap(cd,inBuf,inBytesLeft,outBuf,outBytesLeft,numSub);
+ }
+ return -1;
+}
+
+inline char * converterName(int32_t type)
+{
+ if (type == CONVERTER_ICONV)
+ return "iconv";
+ else if (type == CONVERTER_DMAP)
+ return "dmap";
+
+ return "?????";
+}
+#else
+#define myconv(a,b,c,d,e,f) \
+(((a)->converterType == CONVERTER_ICONV)? myconv_iconv((a),(b),(c),(d),(e),(f)): (((a)->converterType == CONVERTER_DMAP)? myconv_dmap((a),(b),(c),(d),(e),(f)): -1))
+
+
+#define converterName(a) \
+(((a) == CONVERTER_ICONV)? "iconv": ((a) == CONVERTER_DMAP)? "dmap": "?????")
+#endif
+
+void initMyconv();
+void cleanupMyconv();
+
+#endif
diff --git a/storage/ibmdb2i/db2i_rir.cc b/storage/ibmdb2i/db2i_rir.cc
new file mode 100644
index 00000000000..a80a181c9ac
--- /dev/null
+++ b/storage/ibmdb2i/db2i_rir.cc
@@ -0,0 +1,465 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+
+#include "ha_ibmdb2i.h"
+
+/* Helper function for records_in_range.
+ Input: Bitmap of used key parts.
+ Output: Number of used key parts. */
+
+static inline int getKeyCntFromMap(key_part_map keypart_map)
+{
+ int cnt = 0;
+ while (keypart_map)
+ {
+ keypart_map = keypart_map >> 1;
+ cnt++;
+ }
+ return (cnt);
+}
+
+
+/**
+ @brief
+ Given a starting key and an ending key, estimate the number of rows that
+ will exist between the two keys.
+
+ INPUT
+ inx Index to use
+ min_key Min key. Is NULL if no min range
+ max_key Max key. Is NULL if no max range
+
+ NOTES
+ min_key.flag can have one of the following values:
+ HA_READ_KEY_EXACT Include the key in the range
+ HA_READ_AFTER_KEY Don't include key in range
+
+ max_key.flag can have one of the following values:
+ HA_READ_BEFORE_KEY Don't include key in range
+ HA_READ_AFTER_KEY Include all 'end_key' values in the range
+
+ RETURN
+ HA_POS_ERROR Error or the storage engine cannot estimate the number of rows
+ 1 There are no matching keys in the given range
+ n > 0 There are approximately n rows in the range
+*/
+ha_rows ha_ibmdb2i::records_in_range(uint inx,
+ key_range *min_key,
+ key_range *max_key)
+{
+ DBUG_ENTER("ha_ibmdb2i::records_in_range");
+ int rc = 0; // Return code
+ ha_rows rows = 0; // Row count returned to caller of this method
+ uint32 spcLen; // Length of space passed to DB2
+ uint32 keyCnt; // Number of fields in the key composite
+ uint32 literalCnt = 0; // Number of literals
+ uint32 boundsOff; // Offset from beginning of space to range bounds
+ uint32 litDefOff; // Offset from beginning of space to literal definitions
+ uint32 literalsOff; // Offset from beginning of space to literal values
+ uint32 cutoff = 0; // Early exit cutoff (currently not used)
+ uint64 recCnt; // Row count from DB2
+ uint16 rtnCode; // Return code from DB2
+ Bounds* boundsPtr; // Pointer to a pair of range bounds
+ Bound* boundPtr; // Pointer to a single (high or low) range bound
+ LitDef* litDefPtr; // Pointer to a literal definition
+ char* literalsPtr; // Pointer to the start of all literal values
+ char* literalPtr; // Pointer to the start of this literal value
+ char* tempPtr; // Temporary pointer
+ char* tempMinPtr; // Temporary pointer into min_key
+ int minKeyCnt = 0; // Number of fields in the min_key composite
+ int maxKeyCnt = 0; // Number of fields in the max_key composite
+ size_t tempLen = 0; // Temporary length
+ uint16 DB2FieldWidth = 0; // DB2 field width
+ uint32 workFieldLen = 0; // Length of workarea needed for CCSID conversions
+ bool overrideInclusion; // Indicator for inclusion/exclusion
+ char* endOfLiteralPtr; // Pointer to the end of this literal
+ char* endOfMinPtr; // Pointer to end of min_key
+ uint16 endByte = 0; // End byte of char or graphic literal (padding not included)
+ bool reuseLiteral; // Indicator that hi and lo bounds use same literal
+ char* minPtr = NULL; // Work pointer for traversing min_key
+ char* maxPtr = NULL; // Work pointer for traversing max_key
+ /*
+ Handle the special case of 'x < null' anywhere in the key range. There are
+ no values less than null, but return 1 so that MySQL does not assume
+ the empty set for the query.
+ */
+ if (min_key != NULL && max_key != NULL &&
+ min_key->flag == HA_READ_AFTER_KEY && max_key->flag == HA_READ_BEFORE_KEY &&
+ min_key->length == max_key->length &&
+ (memcmp((uchar*)min_key->key,(uchar*)max_key->key,min_key->length)==0))
+ {
+ DBUG_PRINT("ha_ibmdb2i::records_in_range",("Estimate 1 row for key %d; special case: < null", inx));
+ DBUG_RETURN((ha_rows) 1 );
+ }
+ /*
+ Determine the number of fields in the key composite.
+ */
+
+ if (min_key)
+ {
+ minKeyCnt = getKeyCntFromMap(min_key->keypart_map);
+ minPtr = (char*)min_key->key;
+ }
+ if (max_key)
+ {
+ maxKeyCnt = getKeyCntFromMap(max_key->keypart_map);
+ maxPtr = (char*)max_key->key;
+ }
+ keyCnt = maxKeyCnt >= minKeyCnt ? maxKeyCnt : minKeyCnt;
+
+ /*
+ Handle the special case where MySQL does not pass either a min or max
+ key range. In this case, set the key count to 1 (knowing that there
+ is at least one key field) to flow through and create one bounds structure.
+ When both the min and max key ranges are nil, the bounds structure will
+ specify positive and negative infinity and DB2 will estimate the total
+ number of rows. */
+
+ if (keyCnt == 0)
+ keyCnt = 1;
+
+ /*
+ Allocate the space needed to pass range information to DB2. The
+ space must be large enough to store the following:
+ - one pair of bounds (high and low) per field in the key composite
+ - one literal definition per literal value
+ - the literal values
+ - work area for literal CCSID conversions
+ Since we don't know yet how many of these structures are needed,
+ allocate enough space for the maximum that we will possibly need.
+ The workarea for the literal conversion must be big enough to hold the
+ largest of the DB2 key fields.
+ */
+ KEY& curKey = table->key_info[inx];
+
+ for (int i = 0; i < keyCnt; i++)
+ {
+ DB2FieldWidth =
+ db2Table->db2Field(curKey.key_part[i].field->field_index).getByteLengthInRecord();
+ if (DB2FieldWidth > workFieldLen)
+ workFieldLen = DB2FieldWidth; // Get length of largest DB2 field
+ tempLen = tempLen + DB2FieldWidth; // Tally the DB2 field lengths
+ }
+ spcLen = (sizeof(Bounds)*keyCnt) + (sizeof(LitDef)*keyCnt*2) + (tempLen*2) + workFieldLen;
+
+ ValidatedPointer<char> spcPtr(spcLen); // Pointer to space passed to DB2
+ memset(spcPtr, 0, spcLen); // Clear the allocated space
+ /*
+ Set addressability to the various sections of the DB2 interface space.
+ */
+ boundsOff = 0; // Range bounds are at the start of the space
+ litDefOff = sizeof(Bounds) * keyCnt; // Literal defs follow all the range bounds
+ literalsOff = litDefOff + (sizeof(LitDef) * keyCnt * 2); // Literal values are last
+ boundsPtr = (Bounds_t*)(void*)spcPtr; // Address first bounds structure
+ tempPtr = (char*)((char*)spcPtr + litDefOff);
+ litDefPtr = (LitDef_t*)tempPtr; // Address first literal definition
+ tempPtr = (char*)((char*)spcPtr + literalsOff);
+ literalsPtr = (char*)tempPtr; // Address start of literal values
+ literalPtr = literalsPtr; // Address first literal value
+ /*
+ For each key part, build the low (min) and high (max) DB2 range bounds.
+ If literals are specified in the MySQL range, build DB2 literal
+ definitions and store the literal values for access by DB2.
+
+ If no value is specified for a key part, assume infinity. Negative
+ infinity will cause processing to start at the first index entry.
+ Positive infinity will cause processing to end at the last index entry.
+ When infinity is specified in a bound, inclusion/exclusion and position
+ are ignored, and there is no literal definition or literal value for
+ the bound.
+
+ If the keypart value is null, the null indicator is set in the range
+ bound and the other fields in the bound are ignored. When the bound is
+ null, only index entries with the null value will be included in the
+ estimate. If one bound is null, both bounds must be null. When the bound
+ is not null, the data offset and length must be set, and the literal
+ value stored for access by DB2.
+ */
+ for (int partsInUse = 0; partsInUse < keyCnt; ++partsInUse)
+ {
+ Field *field= curKey.key_part[partsInUse].field;
+ overrideInclusion = false;
+ reuseLiteral = false;
+ endOfLiteralPtr = NULL;
+ /*
+ Build the low bound for the key range.
+ */
+ if ((partsInUse + 1) > minKeyCnt) // if no min_key info for this part
+ boundsPtr->LoBound.Infinity[0] = QMY_NEG_INFINITY; // select...where 3 between x and y
+ else
+ {
+ if ((curKey.key_part[partsInUse].null_bit) && (char*)minPtr[0])
+ { // min_key is null
+ if (max_key == NULL ||
+ ((partsInUse + 1) > maxKeyCnt)) // select...where x='ab' and y=null and z != 'c'
+ boundsPtr->LoBound.Infinity[0] = QMY_NEG_INFINITY; // select...where x not null or
+ // select...where x > null
+ else // max_key is not null
+ {
+ if (min_key->flag == HA_READ_KEY_EXACT)
+ boundsPtr->LoBound.IsNull[0] = QMY_YES; // select...where x is null
+ else
+ {
+ if ((char*)maxPtr[0])
+ boundsPtr->LoBound.IsNull[0] = QMY_YES; // select...where a = null and b < 5 (max-before)
+ // select...where a='a' and b is null and c !='a' (max-after)
+ else
+ boundsPtr->LoBound.Infinity[0] = QMY_NEG_INFINITY; // select...where x < y
+ }
+ } // end min_key is null
+ }
+ else // min_key is not null
+ {
+ if (literalCnt) litDefPtr = litDefPtr + 1;
+ literalCnt = literalCnt + 1;
+ boundsPtr->LoBound.Position = literalCnt;
+ /*
+ Determine inclusion or exclusion.
+ */
+ if (min_key->flag == HA_READ_KEY_EXACT || //select...where a like 'this%'
+
+ /* An example for the following conditions is 'select...where a = 5 and b > null'. */
+
+ (max_key &&
+ (memcmp((uchar*)minPtr,(uchar*)maxPtr,
+ curKey.key_part[partsInUse].store_length)==0)))
+
+ {
+ if ((min_key->flag != HA_READ_KEY_EXACT) ||
+ (max_key &&
+ (memcmp((uchar*)minPtr,(uchar*)maxPtr,
+ curKey.key_part[partsInUse].store_length)==0)))
+ overrideInclusion = true; // Need inclusion for both min and max
+ }
+ else
+ boundsPtr->LoBound.Embodiment[0] = QMY_EXCLUSION;
+ litDefPtr->FieldNbr = field->field_index + 1;
+ DB2Field& db2Field = db2Table->db2Field(field->field_index);
+ litDefPtr->DataType = db2Field.getType();
+ /*
+ Convert the literal to DB2 format.
+ */
+ rc = convertMySQLtoDB2(field,
+ db2Field,
+ literalPtr,
+ (uchar*)minPtr+((curKey.key_part[partsInUse].null_bit)? 1 : 0));
+ if (rc != 0) break;
+ litDefPtr->Offset = (uint32_t)(literalPtr - literalsPtr);
+ litDefPtr->Length = db2Field.getByteLengthInRecord();
+ tempLen = litDefPtr->Length;
+ /*
+ Do additional conversion of a character or graphic value.
+ */
+ CHARSET_INFO* fieldCharSet = field->charset();
+ if ((field->type() != MYSQL_TYPE_BIT) && // Don't do conversion on BIT data
+ (field->charset() != &my_charset_bin) && // Don't do conversion on BINARY data
+ (litDefPtr->DataType == QMY_CHAR || litDefPtr->DataType == QMY_VARCHAR ||
+ litDefPtr->DataType == QMY_GRAPHIC || litDefPtr->DataType == QMY_VARGRAPHIC))
+ {
+ if (litDefPtr->DataType == QMY_VARCHAR ||
+ litDefPtr->DataType == QMY_VARGRAPHIC)
+ tempPtr = literalPtr + sizeof(uint16);
+ else
+ tempPtr = literalPtr;
+ /* The following code checks to determine if MySQL is passing a
+ partial key. DB2 will accept a partial field value, but only
+ in the last field position of the key composite (and only if
+ there is no ICU sort sequence on the index). */
+ tempMinPtr = (char*)minPtr+((curKey.key_part[partsInUse].null_bit)? 1 : 0);
+ if (field->type() == MYSQL_TYPE_VARCHAR)
+ {
+ /* MySQL always stores key lengths as 2 bytes, little-endian. */
+ tempLen = *(uint8*)tempMinPtr + ((*(uint8*)(tempMinPtr+1)) << 8);
+ tempMinPtr = (char*)((char*)tempMinPtr + 2);
+ }
+ else
+ tempLen = field->field_length;
+
+ /* Determine if we are dealing with a partial key and if so, find the end of the partial key. */
+ if (litDefPtr->DataType == QMY_CHAR || litDefPtr->DataType == QMY_VARCHAR )
+ { /* Char or varchar. If UTF8, no conversion is done to DB2 graphic.) */
+ endOfMinPtr = (char*)memchr(tempMinPtr,field->charset()->min_sort_char,tempLen);
+ if (endOfMinPtr)
+ endOfLiteralPtr = tempPtr + ((uint32_t)(endOfMinPtr - tempMinPtr));
+ }
+ else
+ {
+ if (strncmp(fieldCharSet->csname, "utf8", sizeof("utf8")) == 0)
+ { /* The MySQL charset is UTF8 but we are converting to graphic on DB2. Divide number of UTF8 bytes
+ by 3 to get the number of characters, then multiple by 2 for double-byte graphic.*/
+ endOfMinPtr = (char*)memchr(tempMinPtr,field->charset()->min_sort_char,tempLen);
+ if (endOfMinPtr)
+ endOfLiteralPtr = tempPtr + (((uint32_t)((endOfMinPtr - tempMinPtr)) / 3) * 2);
+ }
+ else
+ { /* The DB2 data type is graphic or vargraphic, and we are not converting from UTF8 to graphic. */
+ endOfMinPtr = (char*)wmemchr((wchar_t*)tempMinPtr,field->charset()->min_sort_char,tempLen/2);
+ if (endOfMinPtr)
+ endOfLiteralPtr = tempPtr + (endOfMinPtr - tempMinPtr);
+ }
+ }
+ /* Enforce here that a partial is only allowed on the last field position
+ of the key composite */
+ if (endOfLiteralPtr)
+ {
+ if ((partsInUse + 1) < minKeyCnt)
+ {
+ rc = HA_POS_ERROR;
+ break;
+ }
+ endByte = endOfLiteralPtr - tempPtr;
+ /* We're making an assumption that if MySQL gives us a partial key,
+ the length of the partial is the same for both the min_key and max_key. */
+ }
+ }
+ literalPtr = literalPtr + litDefPtr->Length; // Bump pointer for next literal
+ }
+ /* If there is a max_key value for this field, and if the max_key value is
+ the same as the min_key value, then the low bound literal can be reused
+ for the high bound literal. This eliminates the overhead of copying and
+ converting the same value twice. */
+ if (max_key && ((partsInUse + 1) <= maxKeyCnt) &&
+ (memcmp((uchar*)minPtr,(uchar*)maxPtr,
+ curKey.key_part[partsInUse].store_length)==0 || endOfLiteralPtr))
+ reuseLiteral = true;
+ minPtr += curKey.key_part[partsInUse].store_length;
+ }
+ /*
+ Build the high bound for the key range.
+ */
+ if (max_key == NULL || ((partsInUse + 1) > maxKeyCnt))
+ boundsPtr->HiBound.Infinity[0] = QMY_POS_INFINITY;
+ else
+ {
+ if ((curKey.key_part[partsInUse].null_bit) && (char*)maxPtr[0])
+ {
+ if (min_key == NULL)
+ boundsPtr->HiBound.Infinity[0] = QMY_POS_INFINITY;
+ else
+ boundsPtr->HiBound.IsNull[0] = QMY_YES; // select...where x is null
+ }
+ else // max_key field is not null
+ {
+ if (boundsPtr->LoBound.IsNull[0] == QMY_YES) // select where x < 10 or x is null
+ {
+ rc = HA_POS_ERROR;
+ break;
+ }
+ if (!reuseLiteral)
+ {
+ if (literalCnt)
+ litDefPtr = litDefPtr + 1;
+ literalCnt = literalCnt + 1;
+ litDefPtr->FieldNbr = field->field_index + 1;
+ DB2Field& db2Field = db2Table->db2Field(field->field_index);
+ litDefPtr->DataType = db2Field.getType();
+ /*
+ Convert the literal to DB2 format
+ */
+ rc = convertMySQLtoDB2(field,
+ db2Field,
+ literalPtr,
+ (uchar*)maxPtr+((curKey.key_part[partsInUse].null_bit)? 1 : 0));
+ if (rc != 0) break;
+ litDefPtr->Offset = (uint32_t)(literalPtr - literalsPtr);
+ litDefPtr->Length = db2Field.getByteLengthInRecord();
+ tempLen = litDefPtr->Length;
+ /*
+ Now convert a character or graphic value.
+ */
+ if ((field->type() != MYSQL_TYPE_BIT) &&
+ (litDefPtr->DataType == QMY_CHAR || litDefPtr->DataType == QMY_VARCHAR ||
+ litDefPtr->DataType == QMY_GRAPHIC || litDefPtr->DataType == QMY_VARGRAPHIC))
+ {
+ if (litDefPtr->DataType == QMY_VARCHAR || litDefPtr->DataType == QMY_VARGRAPHIC)
+ {
+ tempPtr = literalPtr + sizeof(uint16);
+ }
+ else
+ tempPtr = literalPtr;
+ }
+ literalPtr = literalPtr + litDefPtr->Length; // Bump pointer for next literal
+ }
+ boundsPtr->HiBound.Position = literalCnt;
+ if (max_key->flag == HA_READ_BEFORE_KEY && !overrideInclusion)
+ boundsPtr->HiBound.Embodiment[0] = QMY_EXCLUSION;
+ }
+ maxPtr += curKey.key_part[partsInUse].store_length;
+ }
+ /*
+ Bump to the next field in the key composite.
+ */
+
+ if ((partsInUse+1) < keyCnt)
+ boundsPtr = boundsPtr + 1;
+ }
+
+ /*
+ Call DB2 to estimate the number of rows in the key range.
+ */
+ if (rc == 0)
+ {
+ rc = db2i_ileBridge::getBridgeForThread()->recordsInRange((indexHandles[inx] ? indexHandles[inx] : db2Table->indexFile(inx)->getMasterDefnHandle()),
+ spcPtr,
+ keyCnt,
+ literalCnt,
+ boundsOff,
+ litDefOff,
+ literalsOff,
+ cutoff,
+ (uint32_t)(literalPtr - (char*)spcPtr),
+ endByte,
+ &recCnt,
+ &rtnCode);
+ }
+ /*
+ Set the row count and return.
+ Beware that if this method returns a zero row count, MySQL assumes the
+ result set for the query is zero; never return a zero row count.
+ */
+ if ((rc == 0) && (rtnCode == QMY_SUCCESS || rtnCode == QMY_EARLY_EXIT))
+ {
+ rows = recCnt ? (ha_rows)recCnt : 1;
+ }
+
+ rows = (rows > 0 ? rows : HA_POS_ERROR);
+
+ setIndexReadEstimate(inx, rows);
+
+ DBUG_PRINT("ha_ibmdb2i::recordsInRange",("Estimate %d rows for key %d", uint32(rows), inx));
+
+ DBUG_RETURN(rows);
+}
diff --git a/storage/ibmdb2i/db2i_safeString.h b/storage/ibmdb2i/db2i_safeString.h
new file mode 100644
index 00000000000..e353316c8fc
--- /dev/null
+++ b/storage/ibmdb2i/db2i_safeString.h
@@ -0,0 +1,98 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+
+
+#ifndef DB2I_SAFESTRING_H
+#define DB2I_SAFESTRING_H
+
+
+#include <my_global.h>
+#include <string.h>
+
+/**
+ @class SafeString
+
+ This class was designed to provide safe, but lightweight, concatenation
+ operations C strings inside pre-allocated buffers.
+*/
+class SafeString
+{
+public:
+ SafeString(char* buffer, size_t size) :
+ allocSize(size), curPos(0), buf(buffer)
+ {
+ DBUG_ASSERT(size > 0);
+ buf[allocSize - 1] = 0xFF; // Set an overflow indicator
+ }
+
+ char* ptr() { return buf; }
+ operator char*() { return buf; }
+
+ SafeString& strcat(const char* str)
+ {
+ return this->strncat(str, strlen(str));
+ }
+
+ SafeString& strcat(char one)
+ {
+ if (curPos < allocSize - 2)
+ {
+ buf[curPos++] = one;
+ }
+ buf[curPos] = 0;
+
+ return *this;
+ }
+
+ SafeString& strncat(const char* str, size_t len)
+ {
+ uint64 amountToCopy = min((allocSize-1) - curPos, len);
+ memcpy(buf + curPos, str, amountToCopy);
+ curPos += amountToCopy;
+ buf[curPos] = 0;
+ return *this;
+ }
+
+ bool overflowed() const { return (buf[allocSize - 1] == 0);}
+
+private:
+ char* buf;
+ uint64 curPos;
+ size_t allocSize;
+};
+
+
+#endif
diff --git a/storage/ibmdb2i/db2i_sqlStatementStream.cc b/storage/ibmdb2i/db2i_sqlStatementStream.cc
new file mode 100644
index 00000000000..92a8b03fd00
--- /dev/null
+++ b/storage/ibmdb2i/db2i_sqlStatementStream.cc
@@ -0,0 +1,86 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+
+#include "db2i_sqlStatementStream.h"
+#include "as400_types.h"
+
+/**
+ Add a statement to the statement stream, allocating additional memory as needed.
+
+ @parm stmt The statement text
+ @parm length The length of the statement text
+ @parm fileSortSequence The DB2 sort sequence identifier, in EBCDIC
+ @parm fileSortSequenceLibrary The DB2 sort sequence library, in EBCDIC
+
+ @return Reference to this object
+*/
+SqlStatementStream& SqlStatementStream::addStatementInternal(const char* stmt,
+ uint32 length,
+ const char* fileSortSequence,
+ const char* fileSortSequenceLibrary)
+{
+ uint32 storageNeeded = length + sizeof(StmtHdr_t);
+ storageNeeded = (storageNeeded + 3) & ~3; // We have to be 4-byte aligned.
+ if (storageNeeded > storageRemaining())
+ {
+ // We overallocate new storage to reduce number of times reallocation is
+ // needed.
+ int newSize = curSize + 2 * storageNeeded;
+ DBUG_PRINT("SqlStatementStream::addStatementInternal",
+ ("PERF: Had to realloc! Old size=%d. New size=%d", curSize, newSize));
+ char* old_space = block;
+ char* new_space = (char*)getNewSpace(newSize);
+ memcpy(new_space, old_space, curSize);
+ ptr = new_space + (ptr - old_space);
+ curSize = newSize;
+ }
+
+ DBUG_ASSERT((address64_t)ptr % 4 == 0);
+
+ memcpy(((StmtHdr_t*)ptr)->SrtSeqNam,
+ fileSortSequence,
+ sizeof(((StmtHdr_t*)ptr)->SrtSeqNam));
+ memcpy(((StmtHdr_t*)ptr)->SrtSeqSch,
+ fileSortSequenceLibrary,
+ sizeof(((StmtHdr_t*)ptr)->SrtSeqSch));
+ ((StmtHdr_t*)ptr)->Length = length;
+ memcpy(ptr + sizeof(StmtHdr_t), stmt, length);
+
+ ptr += storageNeeded;
+ ++statements;
+
+ return *this;
+}
diff --git a/storage/ibmdb2i/db2i_sqlStatementStream.h b/storage/ibmdb2i/db2i_sqlStatementStream.h
new file mode 100644
index 00000000000..11db41a6c5d
--- /dev/null
+++ b/storage/ibmdb2i/db2i_sqlStatementStream.h
@@ -0,0 +1,151 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+
+#ifndef DB2I_SQLSTATEMENTSTREAM_H
+#define DB2I_SQLSTATEMENTSTREAM_H
+
+#include "db2i_charsetSupport.h"
+#include "qmyse.h"
+
+/**
+ @class SqlStatementStream
+
+ This class handles building the stream of SQL statements expected by the
+ QMY_EXECUTE_IMMEDIATE and QMY_PREPARE_OPEN_CURSOR APIs.
+ Memory allocation is handled internally.
+*/
+class SqlStatementStream
+{
+ public:
+ /**
+ ctor to be used when multiple strings may be appended.
+ */
+ SqlStatementStream(uint32 firstStringSize) : statements(0)
+ {
+ curSize = firstStringSize + sizeof(StmtHdr_t);
+ curSize = (curSize + 3) & ~3;
+ ptr = (char*) getNewSpace(curSize);
+ if (ptr == NULL)
+ curSize = 0;
+ }
+
+ /**
+ ctor to be used when only a single statement will be executed.
+ */
+ SqlStatementStream(const String& statement) : statements(0), block(NULL), curSize(0), ptr(0)
+ {
+ addStatement(statement);
+ }
+
+ /**
+ ctor to be used when only a single statement will be executed.
+ */
+ SqlStatementStream(const char* statement) : statements(0), block(NULL), curSize(0), ptr(0)
+ {
+ addStatement(statement);
+ }
+
+ /**
+ Append an SQL statement, specifiying the DB2 sort sequence under which
+ the statement should be executed. This is important for CREATE TABLE
+ and CREATE INDEX statements.
+ */
+ SqlStatementStream& addStatement(const String& append, const char* fileSortSequence, const char* fileSortSequenceLibrary)
+ {
+ char sortSeqEbcdic[10];
+ char sortSeqLibEbcdic[10];
+
+ DBUG_ASSERT(strlen(fileSortSequence) <= 10 &&
+ strlen(fileSortSequenceLibrary) <= 10);
+ memset(sortSeqEbcdic, 0x40, 10);
+ memset(sortSeqLibEbcdic, 0x40, 10);
+ convToEbcdic(fileSortSequence, sortSeqEbcdic, strlen(fileSortSequence));
+ convToEbcdic(fileSortSequenceLibrary, sortSeqLibEbcdic, strlen(fileSortSequenceLibrary));
+
+ return addStatementInternal(append.ptr(), append.length(), sortSeqEbcdic, sortSeqLibEbcdic);
+ }
+
+ /**
+ Append an SQL statement using default (*HEX) sort sequence.
+ */
+ SqlStatementStream& addStatement(const String& append)
+ {
+ const char splatHEX[] = {0x5C, 0xC8, 0xC5, 0xE7, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40}; // *HEX
+ const char blanks[] = {0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40}; //
+
+ return addStatementInternal(append.ptr(), append.length(), splatHEX, blanks);
+ }
+
+ /**
+ Append an SQL statement using default (*HEX) sort sequence.
+ */
+ SqlStatementStream& addStatement(const char* stmt)
+ {
+ const char splatHEX[] = {0x5C, 0xC8, 0xC5, 0xE7, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40}; // *HEX
+ const char blanks[] = {0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40}; //
+
+ return addStatementInternal(stmt, strlen(stmt), splatHEX, blanks);
+ }
+
+ char* getPtrToData() const { return block; }
+ uint32 getStatementCount() const { return statements; }
+ private:
+ SqlStatementStream& addStatementInternal(const char* stmt,
+ uint32 length,
+ const char* fileSortSequence,
+ const char* fileSortSequenceLibrary);
+
+ uint32 storageRemaining() const
+ {
+ return (block == NULL ? 0 : curSize - (ptr - block));
+ }
+
+ char* getNewSpace(size_t size)
+ {
+ allocBase = (char*)sql_alloc(size + 15);
+ block = (char*)roundToQuadWordBdy(allocBase);
+ return block;
+ }
+
+ uint32 curSize; // The size of the usable memory.
+ char* allocBase; // The allocated memory (with padding for aligment)
+ char* block; // The usable memory chunck (aligned for ILE)
+ char* ptr; // The current position within block.
+ uint32 statements; // The number of statements that have been appended.
+};
+
+#endif
+
diff --git a/storage/ibmdb2i/db2i_validatedPointer.h b/storage/ibmdb2i/db2i_validatedPointer.h
new file mode 100644
index 00000000000..c4e31d1f11b
--- /dev/null
+++ b/storage/ibmdb2i/db2i_validatedPointer.h
@@ -0,0 +1,162 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+#ifndef DB2I_VALIDATEDPOINTER_H
+#define DB2I_VALIDATEDPOINTER_H
+
+#include "db2i_ileBridge.h"
+
+/**
+ @class ValidatedPointer
+ @brief Encapsulates a pointer registered for usage by the QMYSE APIs
+
+ @details As a performance optimization, to prevent pointer validation each
+ time a particular pointer is thunked across to ILE, QMYSE allows us to
+ "register" a pointer such that it is validated once and then subsequently
+ referenced on QMYSE APIs by means of a handle value. This class should be
+ used to manage memory allocation/registration/unregistration of these
+ pointers. Using the alloc function guarantees that the resulting storage is
+ 16-byte aligned, a requirement for many pointers passed to QMYSE.
+*/
+template <class T>
+class ValidatedPointer
+{
+public:
+ ValidatedPointer<T>() : address(NULL), handle(NULL) {;}
+
+ ValidatedPointer<T>(size_t size)
+ {
+ alloc(size);
+ }
+
+ ValidatedPointer<T>(T* ptr)
+ {
+ assign(ptr);
+ }
+
+ operator T*()
+ {
+ return address;
+ };
+
+ operator T*() const
+ {
+ return address;
+ };
+
+ operator void*()
+ {
+ return address;
+ };
+
+ operator ILEMemHandle()
+ {
+ return handle;
+ }
+
+ void alloc(size_t size)
+ {
+ address = (T*)malloc_aligned(size);
+ if (address)
+ db2i_ileBridge::registerPtr(address, &handle);
+ mallocedHere = 1;
+ }
+
+ void assign(T* ptr)
+ {
+ address = ptr;
+ db2i_ileBridge::registerPtr((void*)ptr, &handle);
+ mallocedHere = 0;
+ }
+
+ void realloc(size_t size)
+ {
+ dealloc();
+ alloc(size);
+ }
+
+ void reassign(T* ptr)
+ {
+ dealloc();
+ assign(ptr);
+ }
+
+ void dealloc()
+ {
+ if (address)
+ {
+ db2i_ileBridge::unregisterPtr(handle);
+
+ if (mallocedHere)
+ free_aligned((void*)address);
+ }
+ address = NULL;
+ handle = 0;
+ }
+
+ ~ValidatedPointer()
+ {
+ dealloc();
+ }
+
+private:
+ // Disable copy ctor and assignment operator, as these would break
+ // the registration guarantees provided by the class.
+ ValidatedPointer& operator= (const ValidatedPointer newVal);
+ ValidatedPointer(ValidatedPointer& newCopy);
+
+ ILEMemHandle handle;
+ T* address;
+ char mallocedHere;
+};
+
+
+/**
+ @class ValidatedObject
+ @brief This class allows users to instantiate and register a particular
+ object in a single step.
+*/
+template<class T>
+class ValidatedObject : public ValidatedPointer<T>
+{
+ public:
+ ValidatedObject<T>() : ValidatedPointer<T>(&value) {;}
+
+ T& operator= (const T newVal) { value = newVal; return value; }
+
+ private:
+ T value;
+};
+#endif
diff --git a/storage/ibmdb2i/ha_ibmdb2i.cc b/storage/ibmdb2i/ha_ibmdb2i.cc
new file mode 100644
index 00000000000..6c7ce12ded1
--- /dev/null
+++ b/storage/ibmdb2i/ha_ibmdb2i.cc
@@ -0,0 +1,3286 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+
+/**
+ @file ha_ibmdb2i.cc
+
+ @brief
+ The ha_ibmdb2i storage engine provides an interface from MySQL to IBM DB2 for i.
+
+*/
+
+#ifdef USE_PRAGMA_IMPLEMENTATION
+#pragma implementation // gcc: Class implementation
+#endif
+
+#include "ha_ibmdb2i.h"
+#include "mysql_priv.h"
+#include <mysql/plugin.h>
+#include "db2i_ileBridge.h"
+#include "db2i_charsetSupport.h"
+#include <sys/utsname.h>
+#include "db2i_safeString.h"
+
+static const char __NOT_NULL_VALUE_EBCDIC = 0xF0; // '0'
+static const char __NULL_VALUE_EBCDIC = 0xF1; // '1'
+static const char __DEFAULT_VALUE_EBCDIC = 0xC4; // 'D'
+static const char BlankASPName[19] = " ";
+static const int DEFAULT_MAX_ROWS_TO_BUFFER = 4096;
+
+static const char SAVEPOINT_PREFIX[] = {0xD4, 0xE8, 0xE2, 0xD7}; // MYSP (in EBCDIC)
+
+OSVersion osVersion;
+
+
+// ================================================================
+// ================================================================
+// System variables
+static char* ibmdb2i_rdb_name;
+static MYSQL_SYSVAR_STR(rdb_name, ibmdb2i_rdb_name,
+ PLUGIN_VAR_MEMALLOC | PLUGIN_VAR_READONLY,
+ "The name of the RDB to use",
+ NULL,
+ NULL,
+ BlankASPName);
+
+static MYSQL_THDVAR_BOOL(transaction_unsafe,
+ 0,
+ "Disable support for commitment control",
+ NULL,
+ NULL,
+ FALSE);
+
+static MYSQL_THDVAR_UINT(lob_alloc_size,
+ 0,
+ "Baseline allocation for lob read buffer",
+ NULL,
+ NULL,
+ 2*1024*1024,
+ 64*1024,
+ 128*1024*1024,
+ 1);
+
+static MYSQL_THDVAR_UINT(max_read_buffer_size,
+ 0,
+ "Maximum size of buffers used for read-ahead.",
+ NULL,
+ NULL,
+ 1*1024*1024,
+ 32*1024,
+ 16*1024*1024,
+ 1);
+
+static MYSQL_THDVAR_UINT(max_write_buffer_size,
+ 0,
+ "Maximum size of buffers used for bulk writes.",
+ NULL,
+ NULL,
+ 8*1024*1024,
+ 32*1024,
+ 64*1024*1024,
+ 1);
+
+static MYSQL_THDVAR_BOOL(compat_opt_time_as_duration,
+ 0,
+ "Control how new TIME columns should be defined in DB2. 0=time-of-day (default), 1=duration.",
+ NULL,
+ NULL,
+ FALSE);
+
+static MYSQL_THDVAR_UINT(compat_opt_year_as_int,
+ 0,
+ "Control how new YEAR columns should be defined in DB2. 0=CHAR(4) (default), 1=SMALLINT.",
+ NULL,
+ NULL,
+ 0,
+ 0,
+ 1,
+ 1);
+
+static MYSQL_THDVAR_UINT(compat_opt_blob_cols,
+ 0,
+ "Control how new TEXT and BLOB columns should be defined in DB2. 0=CLOB/BLOB (default), 1=VARCHAR/VARBINARY",
+ NULL,
+ NULL,
+ 0,
+ 0,
+ 1,
+ 1);
+
+static MYSQL_THDVAR_UINT(compat_opt_allow_zero_date_vals,
+ 0,
+ "Allow substitute values to be used when storing a column with a 0000-00-00 date component. 0=No substitution (default), 1=Substitute '0001-01-01'",
+ NULL,
+ NULL,
+ 0,
+ 0,
+ 1,
+ 1);
+
+static MYSQL_THDVAR_BOOL(propagate_default_col_vals,
+ 0,
+ "Should DEFAULT column values be propagated to the DB2 table definition.",
+ NULL,
+ NULL,
+ TRUE);
+
+static my_bool ibmdb2i_assume_exclusive_use;
+static MYSQL_SYSVAR_BOOL(assume_exclusive_use, ibmdb2i_assume_exclusive_use,
+ 0,
+ "Can MySQL assume that this process is the only one modifying the DB2 tables. ",
+ NULL,
+ NULL,
+ FALSE);
+
+static MYSQL_THDVAR_BOOL(async_enabled,
+ 0,
+ "Should reads be done asynchronously when possible",
+ NULL,
+ NULL,
+ TRUE);
+
+static MYSQL_THDVAR_UINT(create_index_option,
+ 0,
+ "Control whether additional indexes are created. 0=No (default), 1=Create additional *HEX-based index",
+ NULL,
+ NULL,
+ 0,
+ 0,
+ 1,
+ 1);
+
+/* static MYSQL_THDVAR_UINT(discovery_mode,
+ 0,
+ "Unsupported",
+ NULL,
+ NULL,
+ 0,
+ 0,
+ 1,
+ 1); */
+
+static uint32 ibmdb2i_system_trace;
+static MYSQL_SYSVAR_UINT(system_trace_level, ibmdb2i_system_trace,
+ 0,
+ "Set system tracing level",
+ NULL,
+ NULL,
+ 0,
+ 0,
+ 63,
+ 1);
+
+
+inline uint8 ha_ibmdb2i::getCommitLevel(THD* thd)
+{
+ if (!THDVAR(thd, transaction_unsafe))
+ {
+ switch (thd_tx_isolation(thd))
+ {
+ case ISO_READ_UNCOMMITTED:
+ return (accessIntent == QMY_READ_ONLY ? QMY_READ_UNCOMMITTED : QMY_REPEATABLE_READ);
+ case ISO_READ_COMMITTED:
+ return (accessIntent == QMY_READ_ONLY ? QMY_READ_COMMITTED : QMY_REPEATABLE_READ);
+ case ISO_REPEATABLE_READ:
+ return QMY_REPEATABLE_READ;
+ case ISO_SERIALIZABLE:
+ return QMY_SERIALIZABLE;
+ }
+ }
+
+ return QMY_NONE;
+}
+
+inline uint8 ha_ibmdb2i::getCommitLevel()
+{
+ return getCommitLevel(ha_thd());
+}
+
+//=====================================================================
+
+static handler *ibmdb2i_create_handler(handlerton *hton,
+ TABLE_SHARE *table,
+ MEM_ROOT *mem_root);
+static void ibmdb2i_drop_database(handlerton *hton, char* path);
+static int ibmdb2i_savepoint_set(handlerton *hton, THD* thd, void *sv);
+static int ibmdb2i_savepoint_rollback(handlerton *hton, THD* thd, void *sv);
+static int ibmdb2i_savepoint_release(handlerton *hton, THD* thd, void *sv);
+static uint ibmdb2i_alter_table_flags(uint flags);
+
+handlerton *ibmdb2i_hton;
+static bool was_ILE_inited;
+
+/* Tracks the number of open tables */
+static HASH ibmdb2i_open_tables;
+
+/* Mutex used to synchronize initialization of the hash */
+static pthread_mutex_t ibmdb2i_mutex;
+
+
+/**
+ Create hash key for tracking open tables.
+*/
+
+static uchar* ibmdb2i_get_key(IBMDB2I_SHARE *share,size_t *length,
+ bool not_used __attribute__((unused)))
+{
+ *length=share->table_name_length;
+ return (uchar*) share->table_name;
+}
+
+
+int ibmdb2i_close_connection(handlerton* hton, THD *thd)
+{
+ DBUG_PRINT("ha_ibmdb2i::close_connection", ("Closing %d", thd->thread_id));
+ db2i_ileBridge::getBridgeForThread(thd)->closeConnection(thd->thread_id);
+ db2i_ileBridge::destroyBridgeForThread(thd);
+
+ return 0;
+}
+
+
+static int ibmdb2i_init_func(void *p)
+{
+ DBUG_ENTER("ibmdb2i_init_func");
+
+ utsname tempName;
+ uname(&tempName);
+ osVersion.v = atoi(tempName.version);
+ osVersion.r = atoi(tempName.release);
+
+ was_ILE_inited = false;
+ ibmdb2i_hton= (handlerton *)p;
+ VOID(pthread_mutex_init(&ibmdb2i_mutex,MY_MUTEX_INIT_FAST));
+ (void) hash_init(&ibmdb2i_open_tables,system_charset_info,32,0,0,
+ (hash_get_key) ibmdb2i_get_key,0,0);
+
+ ibmdb2i_hton->state= SHOW_OPTION_YES;
+ ibmdb2i_hton->create= ibmdb2i_create_handler;
+ ibmdb2i_hton->drop_database= ibmdb2i_drop_database;
+ ibmdb2i_hton->commit= ha_ibmdb2i::doCommit;
+ ibmdb2i_hton->rollback= ha_ibmdb2i::doRollback;
+ ibmdb2i_hton->savepoint_offset= 0;
+ ibmdb2i_hton->savepoint_set= ibmdb2i_savepoint_set;
+ ibmdb2i_hton->savepoint_rollback= ibmdb2i_savepoint_rollback;
+ ibmdb2i_hton->savepoint_release= ibmdb2i_savepoint_release;
+ ibmdb2i_hton->alter_table_flags=ibmdb2i_alter_table_flags;
+ ibmdb2i_hton->close_connection=ibmdb2i_close_connection;
+
+ int rc;
+
+ rc = initCharsetSupport();
+
+ if (!rc)
+ rc = db2i_ileBridge::setup();
+
+ if (!rc)
+ {
+ int nameLen = strlen(ibmdb2i_rdb_name);
+ for (int i = 0; i < nameLen; ++i)
+ {
+ ibmdb2i_rdb_name[i] = my_toupper(system_charset_info, (uchar)ibmdb2i_rdb_name[i]);
+ }
+
+ rc = db2i_ileBridge::initILE(ibmdb2i_rdb_name, (uint16*)(((char*)&ibmdb2i_system_trace)+2));
+ if (rc == 0)
+ {
+ was_ILE_inited = true;
+ }
+ }
+
+ DBUG_RETURN(rc);
+}
+
+
+static int ibmdb2i_done_func(void *p)
+{
+ int error= 0;
+ DBUG_ENTER("ibmdb2i_done_func");
+
+ if (ibmdb2i_open_tables.records)
+ error= 1;
+
+ if (was_ILE_inited)
+ db2i_ileBridge::exitILE();
+
+ db2i_ileBridge::takedown();
+
+ doneCharsetSupport();
+
+ hash_free(&ibmdb2i_open_tables);
+ pthread_mutex_destroy(&ibmdb2i_mutex);
+
+ DBUG_RETURN(0);
+}
+
+
+IBMDB2I_SHARE *ha_ibmdb2i::get_share(const char *table_name, TABLE *table)
+{
+ IBMDB2I_SHARE *share;
+ uint length;
+ char *tmp_name;
+
+ pthread_mutex_lock(&ibmdb2i_mutex);
+ length=(uint) strlen(table_name);
+
+ if (!(share=(IBMDB2I_SHARE*) hash_search(&ibmdb2i_open_tables,
+ (uchar*)table_name,
+ length)))
+ {
+ if (!(share=(IBMDB2I_SHARE *)
+ my_multi_malloc(MYF(MY_WME | MY_ZEROFILL),
+ &share, sizeof(*share),
+ &tmp_name, length+1,
+ NullS)))
+ {
+ pthread_mutex_unlock(&ibmdb2i_mutex);
+ return NULL;
+ }
+
+ share->use_count=0;
+ share->table_name_length=length;
+ share->table_name=tmp_name;
+ strmov(share->table_name,table_name);
+ if (my_hash_insert(&ibmdb2i_open_tables, (uchar*) share))
+ goto error;
+ thr_lock_init(&share->lock);
+ pthread_mutexattr_t mutexattr = MY_MUTEX_INIT_FAST;
+ pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_RECURSIVE);
+ pthread_mutex_init(&share->mutex, &mutexattr);
+
+ share->db2Table = new db2i_table(table->s, table_name);
+ int32 rc = share->db2Table->initDB2Objects(table_name);
+
+ if (rc)
+ {
+ delete share->db2Table;
+ hash_delete(&ibmdb2i_open_tables, (uchar*) share);
+ thr_lock_delete(&share->lock);
+ my_errno = rc;
+ goto error;
+ }
+
+ memset(&share->cachedStats, 0, sizeof(share->cachedStats));
+ }
+ share->use_count++;
+ pthread_mutex_unlock(&ibmdb2i_mutex);
+
+ db2Table = share->db2Table;
+
+ return share;
+
+error:
+ pthread_mutex_destroy(&share->mutex);
+ my_free((uchar*) share, MYF(0));
+ pthread_mutex_unlock(&ibmdb2i_mutex);
+
+ return NULL;
+}
+
+
+
+int ha_ibmdb2i::free_share(IBMDB2I_SHARE *share)
+{
+ pthread_mutex_lock(&ibmdb2i_mutex);
+ if (!--share->use_count)
+ {
+ delete share->db2Table;
+ db2Table = NULL;
+
+ hash_delete(&ibmdb2i_open_tables, (uchar*) share);
+ thr_lock_delete(&share->lock);
+ pthread_mutex_destroy(&share->mutex);
+ my_free(share, MYF(0));
+ pthread_mutex_unlock(&ibmdb2i_mutex);
+ return 1;
+ }
+ pthread_mutex_unlock(&ibmdb2i_mutex);
+
+ return 0;
+}
+
+static handler* ibmdb2i_create_handler(handlerton *hton,
+ TABLE_SHARE *table,
+ MEM_ROOT *mem_root)
+{
+ return new (mem_root) ha_ibmdb2i(hton, table);
+}
+
+static void ibmdb2i_drop_database(handlerton *hton, char* path)
+{
+ DBUG_ENTER("ha_ibmdb2i::ibmdb2i_drop_database");
+ int rc = 0;
+ char queryBuffer[200];
+ String query(queryBuffer, sizeof(queryBuffer), system_charset_info);
+ query.length(0);
+ query.append(STRING_WITH_LEN(" DROP SCHEMA \""));
+ query.append(path+2, strchr(path+2, '/')-(path+2));
+ query.append('"');
+
+ SqlStatementStream sqlStream(query);
+
+ rc = db2i_ileBridge::getBridgeForThread()->execSQL(sqlStream.getPtrToData(),
+ sqlStream.getStatementCount(),
+ QMY_NONE,
+ FALSE,
+ TRUE);
+ DBUG_VOID_RETURN;
+}
+
+inline static void genSavepointName(const void* sv, char* out)
+{
+ *(uint32*)out = *(uint32*)SAVEPOINT_PREFIX;
+ DBUG_ASSERT(sizeof(SAVEPOINT_PREFIX) == 4);
+ out += sizeof(SAVEPOINT_PREFIX);
+
+ longlong2str((longlong)sv, out, 10);
+ while (*out)
+ {
+ out += 0xF0;
+ ++out;
+ }
+}
+
+
+/*********************************************************************
+Sets a transaction savepoint. */
+static int ibmdb2i_savepoint_set(handlerton* hton, THD* thd, void* sv)
+{
+ DBUG_ENTER("ibmdb2i_savepoint_set");
+ int rc = 0;
+ if (!THDVAR(thd ,transaction_unsafe))
+ {
+ char name[64];
+ genSavepointName(sv, name);
+ DBUG_PRINT("ibmdb2i_savepoint_set",("Setting %s", name));
+ rc = ha_ibmdb2i::doSavepointSet(thd, name);
+ }
+ DBUG_RETURN(rc);
+}
+
+
+/*********************************************************************
+Rollback a savepoint. */
+static int ibmdb2i_savepoint_rollback(handlerton* hton, THD* thd, void* sv)
+{
+ DBUG_ENTER("ibmdb2i_savepoint_rollback");
+ int rc = 0;
+ if (!THDVAR(thd,transaction_unsafe))
+ {
+ char name[64];
+ genSavepointName(sv, name);
+ DBUG_PRINT("ibmdb2i_savepoint_rollback",("Rolling back %s", name));
+ rc = ha_ibmdb2i::doSavepointRollback(thd, name);
+ }
+ DBUG_RETURN(rc);
+}
+
+
+/*********************************************************************
+Release a savepoint. */
+static int ibmdb2i_savepoint_release(handlerton* hton, THD* thd, void* sv)
+{
+ DBUG_ENTER("ibmdb2i_savepoint_release");
+ int rc = 0;
+ if (!THDVAR(thd,transaction_unsafe))
+ {
+ char name[64];
+ genSavepointName(sv, name);
+ DBUG_PRINT("ibmdb2i_savepoint_release",("Releasing %s", name));
+ rc = ha_ibmdb2i::doSavepointRelease(thd, name);
+ }
+ DBUG_RETURN(rc);
+}
+
+/* Thse flags allow for the online add and drop of an index via the CREATE INDEX,
+ DROP INDEX, and ALTER TABLE statements. These flags indicate that MySQL is not
+ required to lock the table before calling the storage engine to add or drop the
+ index(s). */
+static uint ibmdb2i_alter_table_flags(uint flags)
+{
+ return (HA_ONLINE_ADD_INDEX | HA_ONLINE_DROP_INDEX |
+ HA_ONLINE_ADD_UNIQUE_INDEX | HA_ONLINE_DROP_UNIQUE_INDEX |
+ HA_ONLINE_ADD_PK_INDEX | HA_ONLINE_DROP_PK_INDEX);
+}
+
+ha_ibmdb2i::ha_ibmdb2i(handlerton *hton, TABLE_SHARE *table_arg)
+ :share(NULL), handler(hton, table_arg),
+ activeHandle(0), dataHandle(0),
+ activeReadBuf(NULL), activeWriteBuf(NULL),
+ blobReadBuffers(NULL), accessIntent(QMY_UPDATABLE), currentRRN(0),
+ releaseRowNeeded(FALSE),
+ indexReadSizeEstimates(NULL),
+ outstanding_start_bulk_insert(false),
+ last_rnd_init_rc(0),
+ last_index_init_rc(0),
+ last_start_bulk_insert_rc(0),
+ autoIncLockAcquired(false),
+ got_auto_inc_values(false),
+ next_identity_value(0),
+ indexHandles(0),
+ returnDupKeysImmediately(false),
+ onDupUpdate(false),
+ blobWriteBuffers(NULL),
+ forceSingleRowRead(false)
+ {
+ activeReferences = 0;
+ ref_length = sizeof(currentRRN);
+ if (table_share && table_share->keys > 0)
+ {
+ indexHandles = (FILE_HANDLE*)my_malloc(table_share->keys * sizeof(FILE_HANDLE), MYF(MY_WME | MY_ZEROFILL));
+ }
+ clear_alloc_root(&conversionBufferMemroot);
+ }
+
+
+ha_ibmdb2i::~ha_ibmdb2i()
+{
+ DBUG_ASSERT(activeReferences == 0 || outstanding_start_bulk_insert);
+
+ if (indexHandles)
+ my_free(indexHandles, MYF(0));
+ if (indexReadSizeEstimates)
+ my_free(indexReadSizeEstimates, MYF(0));
+
+ cleanupBuffers();
+}
+
+
+static const char *ha_ibmdb2i_exts[] = {
+ FID_EXT,
+ NullS
+};
+
+const char **ha_ibmdb2i::bas_ext() const
+{
+ return ha_ibmdb2i_exts;
+}
+
+
+int ha_ibmdb2i::open(const char *name, int mode, uint test_if_locked)
+{
+ DBUG_ENTER("ha_ibmdb2i::open");
+
+ initBridge();
+
+ dataHandle = bridge()->findAndRemovePreservedHandle(name, &share);
+
+ if (share)
+ db2Table = share->db2Table;
+
+ if (!share && (!(share = get_share(name, table))))
+ DBUG_RETURN(my_errno);
+ thr_lock_data_init(&share->lock,&lock,NULL);
+
+ info(HA_STATUS_NO_LOCK | HA_STATUS_CONST | HA_STATUS_VARIABLE);
+
+
+ DBUG_RETURN(0);
+}
+
+
+
+
+int ha_ibmdb2i::close(void)
+{
+ DBUG_ENTER("ha_ibmdb2i::close");
+ int32 rc = 0;
+ bool preserveShare = false;
+
+ db2i_ileBridge* bridge = db2i_ileBridge::getBridgeForThread();
+
+ if (dataHandle)
+ {
+ if (bridge->expectErrors(QMY_ERR_PEND_LOCKS)->deallocateFile(dataHandle, FALSE) == QMY_ERR_PEND_LOCKS)
+ {
+ bridge->preserveHandle(share->table_name, dataHandle, share);
+ preserveShare = true;
+ }
+ dataHandle = 0;
+ }
+
+ for (int idx = 0; idx < table_share->keys; ++idx)
+ {
+ if (indexHandles[idx] != 0)
+ {
+ bridge->deallocateFile(indexHandles[idx], FALSE);
+ }
+ }
+
+ cleanupBuffers();
+
+ if (!preserveShare)
+ {
+ if (free_share(share))
+ share = NULL;
+ }
+
+ DBUG_RETURN(rc);
+}
+
+
+
+int ha_ibmdb2i::write_row(uchar * buf)
+{
+
+ DBUG_ENTER("ha_ibmdb2i::write_row");
+
+ if (last_start_bulk_insert_rc)
+ DBUG_RETURN( last_start_bulk_insert_rc );
+
+ ha_statistic_increment(&SSV::ha_write_count);
+ int rc = 0;
+
+ bool fileHandleNeedsRelease = false;
+
+ if (!activeHandle)
+ {
+ rc = useDataFile();
+ if (rc) DBUG_RETURN(rc);
+ fileHandleNeedsRelease = true;
+ }
+
+ if (!outstanding_start_bulk_insert)
+ rc = prepWriteBuffer(1, getFileForActiveHandle());
+
+ if (!rc)
+ {
+ if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_INSERT)
+ table->timestamp_field->set_time();
+
+ char* writeBuffer = activeWriteBuf->addRow();
+ rc = prepareRowForWrite(writeBuffer,
+ writeBuffer+activeWriteBuf->getRowNullOffset(),
+ true);
+ if (rc == 0)
+ {
+ // If we are doing block inserts, if the MI is supposed to generate an auto_increment
+ // (i.e. identity column) value for this record, and if this is not the first record in
+ // the block, then store the value (that the MI will generate for the identity column)
+ // into the MySQL write buffer. We can predetermine the value because the file is locked.
+
+ if ((autoIncLockAcquired) && (default_identity_value) && (got_auto_inc_values))
+ {
+ if (unlikely((next_identity_value - 1) ==
+ maxValueForField(table->next_number_field)))
+ {
+ rc = QMY_ERR_MAXVALUE;
+ }
+ else
+ {
+ rc = table->next_number_field->store((longlong) next_identity_value, TRUE);
+ next_identity_value = next_identity_value + incrementByValue;
+ }
+ }
+ // If the buffer is full, or if we locked the file and this is the first or last row
+ // of a blocked insert, then flush the buffer.
+ if (!rc && (activeWriteBuf->endOfBuffer()) ||
+ ((autoIncLockAcquired) &&
+ ((!got_auto_inc_values))) ||
+ (returnDupKeysImmediately))
+ rc = flushWrite(activeHandle, buf);
+ }
+ else
+ activeWriteBuf->deleteRow();
+ }
+
+ if (fileHandleNeedsRelease)
+ releaseActiveHandle();
+
+ DBUG_RETURN(rc);
+}
+
+/**
+ @brief
+ Helper function used by write_row and update_row to prepare the MySQL
+ row for insertion into DB2.
+*/
+int ha_ibmdb2i::prepareRowForWrite(char* data, char* nulls, bool honorIdentCols)
+{
+ int rc = 0;
+
+ // set null map all to non nulls
+ memset(nulls,__NOT_NULL_VALUE_EBCDIC, table->s->fields);
+ default_identity_value = FALSE;
+
+ ulong sql_mode = ha_thd()->variables.sql_mode;
+
+ my_bitmap_map *old_map= dbug_tmp_use_all_columns(table, table->read_set);
+ for (Field **field = table->field; *field && !rc; ++field)
+ {
+ int fieldIndex = (*field)->field_index;
+ if ((*field)->Field::is_null())
+ {
+ nulls[fieldIndex] = __NULL_VALUE_EBCDIC;
+ }
+ if (honorIdentCols && ((*field)->flags & AUTO_INCREMENT_FLAG) &&
+ *field == table->next_number_field)
+// && ((!autoIncLockAcquired) || (!got_auto_inc_values)))
+ {
+ if (sql_mode & MODE_NO_AUTO_VALUE_ON_ZERO)
+ {
+ if (!table->auto_increment_field_not_null)
+ {
+ nulls[fieldIndex] = __DEFAULT_VALUE_EBCDIC;
+ default_identity_value = TRUE;
+ }
+ }
+ else if ((*field)->val_int() == 0)
+ {
+ nulls[fieldIndex] = __DEFAULT_VALUE_EBCDIC;
+ default_identity_value = TRUE;
+ }
+ }
+
+ DB2Field& db2Field = db2Table->db2Field(fieldIndex);
+ if (nulls[fieldIndex] == __NOT_NULL_VALUE_EBCDIC ||
+ db2Field.isBlob())
+ {
+ rc = convertMySQLtoDB2(*field, db2Field, data + db2Field.getBufferOffset());
+ }
+ }
+
+ if (!rc && db2Table->hasBlobs())
+ rc = db2i_ileBridge::getBridgeForThread()->objectOverride(activeHandle,
+ activeWriteBuf->ptr());
+
+ dbug_tmp_restore_column_map(table->read_set, old_map);
+
+ return rc;
+}
+
+
+
+int ha_ibmdb2i::update_row(const uchar * old_data, uchar * new_data)
+{
+ DBUG_ENTER("ha_ibmdb2i::update_row");
+ ha_statistic_increment(&SSV::ha_update_count);
+ int rc;
+
+ bool fileHandleNeedsRelease = false;
+
+ if (!activeHandle)
+ {
+ rc = useFileByHandle(QMY_UPDATABLE, rrnAssocHandle);
+ if (rc) DBUG_RETURN(rc);
+ fileHandleNeedsRelease = true;
+ }
+
+ if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_UPDATE)
+ table->timestamp_field->set_time();
+
+ char* writeBuf = activeWriteBuf->addRow();
+ rc = prepareRowForWrite(writeBuf,
+ writeBuf+activeWriteBuf->getRowNullOffset(),
+ onDupUpdate);
+
+ char* lastDupKeyNamePtr = NULL;
+ uint32 lastDupKeyNameLen = 0;
+
+ if (!rc)
+ {
+ rc = db2i_ileBridge::getBridgeForThread()->updateRow(activeHandle,
+ currentRRN,
+ activeWriteBuf->ptr(),
+ &lastDupKeyRRN,
+ &lastDupKeyNamePtr,
+ &lastDupKeyNameLen);
+ }
+
+ if (lastDupKeyNameLen)
+ {
+ lastDupKeyID = getKeyFromName(lastDupKeyNamePtr, lastDupKeyNameLen);
+ rrnAssocHandle = activeHandle;
+ }
+
+ if (fileHandleNeedsRelease)
+ releaseActiveHandle();
+
+ activeWriteBuf->resetAfterWrite();
+
+ DBUG_RETURN(rc);
+}
+
+
+int ha_ibmdb2i::delete_row(const uchar * buf)
+{
+ DBUG_ENTER("ha_ibmdb2i::delete_row");
+ ha_statistic_increment(&SSV::ha_delete_count);
+
+ bool needReleaseFile = false;
+ int rc = 0;
+
+ if (!activeHandle) // In some circumstances, MySQL comes here after
+ { // closing the active handle. We need to re-open.
+ rc = useFileByHandle(QMY_UPDATABLE, rrnAssocHandle);
+ needReleaseFile = true;
+ }
+
+ if (likely(!rc))
+ {
+ rc = db2i_ileBridge::getBridgeForThread()->deleteRow(activeHandle,
+ currentRRN);
+ invalidateCachedStats();
+ if (needReleaseFile)
+ releaseActiveHandle();
+ }
+
+ DBUG_RETURN(rc);
+}
+
+
+
+int ha_ibmdb2i::index_init(uint idx, bool sorted)
+{
+ DBUG_ENTER("ha_ibmdb2i::index_init");
+
+ int& rc = last_index_init_rc;
+ rc = 0;
+
+ invalidDataFound=false;
+ tweakReadSet();
+
+ active_index=idx;
+
+ rc = useIndexFile(idx);
+
+ if (!rc)
+ {
+// THD* thd = ha_thd();
+// if (accessIntent == QMY_UPDATABLE &&
+// thd_tx_isolation(thd) == ISO_REPEATABLE_READ &&
+// !THDVAR(thd, transaction_unsafe))
+// {
+// readAccessIntent = QMY_READ_ONLY;
+// }
+// else
+// {
+ readAccessIntent = accessIntent;
+// }
+
+ if (!rc && accessIntent != QMY_READ_ONLY)
+ rc = prepWriteBuffer(1, db2Table->indexFile(idx));
+
+ if (rc)
+ releaseIndexFile(idx);
+ }
+
+ DBUG_RETURN(rc);
+}
+
+
+
+int ha_ibmdb2i::index_read(uchar * buf, const uchar * key,
+ uint key_len,
+ enum ha_rkey_function find_flag)
+{
+ DBUG_ENTER("ha_ibmdb2i::index_read");
+
+ if (unlikely(last_index_init_rc)) DBUG_RETURN(last_index_init_rc);
+
+ int rc;
+
+ ha_rows estimatedRows = getIndexReadEstimate(active_index);
+ rc = prepReadBuffer(estimatedRows, db2Table->indexFile(active_index), readAccessIntent);
+ if (unlikely(rc)) DBUG_RETURN(rc);
+
+ DBUG_ASSERT(activeReadBuf);
+
+ keyBuf.allocBuf(activeReadBuf->getRowLength(),
+ activeReadBuf->getRowNullOffset(),
+ activeReadBuf->getRowLength());
+ keyBuf.zeroBuf();
+
+ char* db2KeyBufPtr = keyBuf.ptr();
+ char* nullKeyMap = db2KeyBufPtr + activeReadBuf->getRowNullOffset();
+
+ const uchar* keyBegin = key;
+ int partsInUse;
+
+ KEY& curKey = table->key_info[active_index];
+
+ for (partsInUse = 0; partsInUse < curKey.key_parts, key - keyBegin < key_len; ++partsInUse)
+ {
+ Field* field = curKey.key_part[partsInUse].field;
+ if ((curKey.key_part[partsInUse].null_bit) &&
+ (char*)key[0])
+ {
+ if (field->flags & AUTO_INCREMENT_FLAG)
+ {
+ table->status = STATUS_NOT_FOUND;
+ DBUG_RETURN(HA_ERR_END_OF_FILE);
+ }
+ else
+ {
+ nullKeyMap[partsInUse] = __NULL_VALUE_EBCDIC;
+ }
+ }
+ else
+ {
+ nullKeyMap[partsInUse] = __NOT_NULL_VALUE_EBCDIC;
+ convertMySQLtoDB2(field,
+ db2Table->db2Field(field->field_index),
+ db2KeyBufPtr,
+ (uchar*)key+((curKey.key_part[partsInUse].null_bit)? 1 : 0) ); // + (curKey.key_parts+7) / 8);
+ }
+
+ db2KeyBufPtr += db2Table->db2Field(field->field_index).getByteLengthInRecord();
+ key += curKey.key_part[partsInUse].store_length;
+ }
+
+ keyLen = db2KeyBufPtr - (char*)keyBuf.ptr();
+
+ DBUG_PRINT("ha_ibmdb2i::index_read", ("find_flag: %d", find_flag));
+
+ char readDirection = QMY_NEXT;
+
+ switch (find_flag)
+ {
+ case HA_READ_AFTER_KEY:
+ doInitialRead(QMY_AFTER_EQUAL, estimatedRows,
+ keyBuf.ptr(), keyLen, partsInUse);
+ break;
+ case HA_READ_BEFORE_KEY:
+ doInitialRead(QMY_BEFORE_EQUAL, estimatedRows,
+ keyBuf.ptr(), keyLen, partsInUse);
+ break;
+ case HA_READ_KEY_OR_NEXT:
+ doInitialRead(QMY_AFTER_OR_EQUAL, estimatedRows,
+ keyBuf.ptr(), keyLen, partsInUse);
+ break;
+ case HA_READ_KEY_OR_PREV:
+ DBUG_ASSERT(0); // This function is unused
+ doInitialRead(QMY_BEFORE_OR_EQUAL, estimatedRows,
+ keyBuf.ptr(), keyLen, partsInUse);
+ break;
+ case HA_READ_PREFIX_LAST_OR_PREV:
+ doInitialRead(QMY_LAST_PREVIOUS, estimatedRows,
+ keyBuf.ptr(), keyLen, partsInUse);
+ readDirection = QMY_PREVIOUS;
+ break;
+ case HA_READ_PREFIX_LAST:
+ doInitialRead(QMY_PREFIX_LAST, estimatedRows,
+ keyBuf.ptr(), keyLen, partsInUse);
+ readDirection = QMY_PREVIOUS;
+ break;
+ case HA_READ_KEY_EXACT:
+ doInitialRead(QMY_EQUAL, estimatedRows, keyBuf.ptr(), keyLen, partsInUse);
+ break;
+ default:
+ DBUG_ASSERT(0);
+ return HA_ERR_GENERIC;
+ break;
+ }
+
+ ha_statistic_increment(&SSV::ha_read_key_count);
+ rc = readFromBuffer(buf, readDirection);
+
+ table->status= (rc ? STATUS_NOT_FOUND: 0);
+ DBUG_RETURN(rc);
+}
+
+
+int ha_ibmdb2i::index_next(uchar * buf)
+{
+ DBUG_ENTER("ha_ibmdb2i::index_next");
+ ha_statistic_increment(&SSV::ha_read_next_count);
+
+ int rc = readFromBuffer(buf, QMY_NEXT);
+
+ table->status= (rc ? STATUS_NOT_FOUND: 0);
+ DBUG_RETURN(rc);
+}
+
+
+int ha_ibmdb2i::index_next_same(uchar *buf, const uchar *key, uint keylen)
+{
+ DBUG_ENTER("ha_ibmdb2i::index_next_same");
+ ha_statistic_increment(&SSV::ha_read_next_count);
+
+ int rc = readFromBuffer(buf, QMY_NEXT_EQUAL);
+
+ if (rc == HA_ERR_KEY_NOT_FOUND)
+ {
+ rc = HA_ERR_END_OF_FILE;
+ }
+
+ table->status= (rc ? STATUS_NOT_FOUND: 0);
+ DBUG_RETURN(rc);
+}
+
+int ha_ibmdb2i::index_read_last(uchar * buf, const uchar * key, uint key_len)
+{
+ DBUG_ENTER("ha_ibmdb2i::index_read_last");
+ DBUG_RETURN(index_read(buf, key, key_len, HA_READ_PREFIX_LAST));
+}
+
+
+
+int ha_ibmdb2i::index_prev(uchar * buf)
+{
+ DBUG_ENTER("ha_ibmdb2i::index_prev");
+ ha_statistic_increment(&SSV::ha_read_prev_count);
+
+ int rc = readFromBuffer(buf, QMY_PREVIOUS);
+
+ table->status= (rc ? STATUS_NOT_FOUND: 0);
+ DBUG_RETURN(rc);
+}
+
+
+int ha_ibmdb2i::index_first(uchar * buf)
+{
+ DBUG_ENTER("ha_ibmdb2i::index_first");
+
+ if (unlikely(last_index_init_rc)) DBUG_RETURN(last_index_init_rc);
+
+ int rc = prepReadBuffer(DEFAULT_MAX_ROWS_TO_BUFFER,
+ db2Table->indexFile(active_index),
+ readAccessIntent);
+
+ if (rc == 0)
+ {
+ doInitialRead(QMY_FIRST, DEFAULT_MAX_ROWS_TO_BUFFER);
+ ha_statistic_increment(&SSV::ha_read_first_count);
+ rc = readFromBuffer(buf, QMY_NEXT);
+ }
+
+ table->status= (rc ? STATUS_NOT_FOUND: 0);
+ DBUG_RETURN(rc);
+}
+
+
+int ha_ibmdb2i::index_last(uchar * buf)
+{
+ DBUG_ENTER("ha_ibmdb2i::index_last");
+
+ if (unlikely(last_index_init_rc)) DBUG_RETURN(last_index_init_rc);
+
+ int rc = prepReadBuffer(DEFAULT_MAX_ROWS_TO_BUFFER,
+ db2Table->indexFile(active_index),
+ readAccessIntent);
+
+ if (rc == 0)
+ {
+ doInitialRead(QMY_LAST, DEFAULT_MAX_ROWS_TO_BUFFER);
+ ha_statistic_increment(&SSV::ha_read_last_count);
+ rc = readFromBuffer(buf, QMY_PREVIOUS);
+ }
+
+ table->status= (rc ? STATUS_NOT_FOUND: 0);
+ DBUG_RETURN(rc);
+}
+
+
+int ha_ibmdb2i::rnd_init(bool scan)
+{
+ DBUG_ENTER("ha_ibmdb2i::rnd_init");
+
+ int& rc = last_rnd_init_rc;
+ rc = 0;
+
+ tweakReadSet();
+ invalidDataFound=false;
+
+ uint32 rowsToBlockOnRead;
+
+ if (!scan)
+ {
+ rowsToBlockOnRead = 1;
+ }
+ else
+ {
+ rowsToBlockOnRead = DEFAULT_MAX_ROWS_TO_BUFFER;
+ }
+
+ rc = useDataFile();
+
+ if (!rc)
+ {
+// THD* thd = ha_thd();
+// if (accessIntent == QMY_UPDATABLE &&
+// thd_tx_isolation(thd) == ISO_REPEATABLE_READ &&
+// !THDVAR(thd, transaction_unsafe))
+// {
+// readAccessIntent = QMY_READ_ONLY;
+// }
+// else
+// {
+ readAccessIntent = accessIntent;
+// }
+
+ rc = prepReadBuffer(rowsToBlockOnRead, db2Table->dataFile(), readAccessIntent);
+
+ if (!rc && accessIntent != QMY_READ_ONLY)
+ rc = prepWriteBuffer(1, db2Table->dataFile());
+
+ if (!rc && scan)
+ doInitialRead(QMY_FIRST, rowsToBlockOnRead);
+
+ if (rc)
+ releaseDataFile();
+ }
+
+ DBUG_RETURN(0); // MySQL sometimes does not check the return code, causing
+ // an assert in ha_rnd_end later on if we return a non-zero
+ // value here.
+}
+
+int ha_ibmdb2i::rnd_end()
+{
+ DBUG_ENTER("ha_ibmdb2i::rnd_end");
+
+ warnIfInvalidData();
+ if (likely(activeReadBuf))
+ activeReadBuf->endRead();
+ if (last_rnd_init_rc == 0)
+ releaseActiveHandle();
+ last_rnd_init_rc = 0;
+ DBUG_RETURN(0);
+}
+
+
+int32 ha_ibmdb2i::mungeDB2row(uchar* record, const char* dataPtr, const char* nullMapPtr, bool skipLOBs)
+{
+ DBUG_ASSERT(dataPtr);
+
+ my_bitmap_map *old_write_map= dbug_tmp_use_all_columns(table, table->write_set);
+ my_bitmap_map *old_read_map;
+
+ if (unlikely(readAllColumns))
+ old_read_map = tmp_use_all_columns(table, table->read_set);
+
+ resetCharacterConversionBuffers();
+
+ my_ptrdiff_t old_ptr= (my_ptrdiff_t) (record - table->record[0]);
+ int fieldIndex = 0;
+ for (Field **field = table->field; *field; ++field, ++fieldIndex)
+ {
+ if (unlikely(old_ptr))
+ (*field)->move_field_offset(old_ptr);
+ if (nullMapPtr[fieldIndex] == __NULL_VALUE_EBCDIC ||
+ (!bitmap_is_set(table->read_set, fieldIndex)) ||
+ (skipLOBs && db2Table->db2Field(fieldIndex).isBlob()))
+ {
+ (*field)->set_null();
+ }
+ else
+ {
+ (*field)->set_notnull();
+ convertDB2toMySQL(db2Table->db2Field(fieldIndex), *field, dataPtr);
+ }
+ if (unlikely(old_ptr))
+ (*field)->move_field_offset(-old_ptr);
+
+ }
+
+ if (unlikely(readAllColumns))
+ tmp_restore_column_map(table->read_set, old_read_map);
+ dbug_tmp_restore_column_map(table->write_set, old_write_map);
+
+ return 0;
+}
+
+
+int ha_ibmdb2i::rnd_next(uchar *buf)
+{
+ DBUG_ENTER("ha_ibmdb2i::rnd_next");
+
+ if (unlikely(last_rnd_init_rc)) DBUG_RETURN(last_rnd_init_rc);
+ ha_statistic_increment(&SSV::ha_read_rnd_next_count);
+
+ int rc;
+
+ rc = readFromBuffer(buf, QMY_NEXT);
+
+ table->status= (rc ? STATUS_NOT_FOUND: 0);
+ DBUG_RETURN(rc);
+}
+
+
+void ha_ibmdb2i::position(const uchar *record)
+{
+ DBUG_ENTER("ha_ibmdb2i::position");
+ my_store_ptr(ref, ref_length, currentRRN);
+ DBUG_VOID_RETURN;
+}
+
+
+int ha_ibmdb2i::rnd_pos(uchar * buf, uchar *pos)
+{
+ DBUG_ENTER("ha_ibmdb2i::rnd_pos");
+ if (unlikely(last_rnd_init_rc)) DBUG_RETURN( last_rnd_init_rc);
+ ha_statistic_increment(&SSV::ha_read_rnd_count);
+
+ currentRRN = my_get_ptr(pos, ref_length);
+
+ tweakReadSet();
+
+ int rc = 0;
+
+ if (activeHandle != rrnAssocHandle)
+ {
+ if (activeHandle) releaseActiveHandle();
+ rc = useFileByHandle(QMY_UPDATABLE, rrnAssocHandle);
+ }
+
+ if (likely(rc == 0))
+ {
+ rc = prepReadBuffer(1, getFileForActiveHandle(), accessIntent);
+
+ if (likely(rc == 0) && accessIntent == QMY_UPDATABLE)
+ rc = prepWriteBuffer(1, getFileForActiveHandle());
+
+ if (likely(rc == 0))
+ {
+ rc = db2i_ileBridge::getBridgeForThread()->readByRRN(activeHandle,
+ activeReadBuf->ptr(),
+ currentRRN,
+ accessIntent,
+ getCommitLevel());
+
+ if (likely(rc == 0))
+ {
+ rrnAssocHandle = activeHandle;
+ const char* readBuf = activeReadBuf->getRowN(0);
+ rc = mungeDB2row(buf, readBuf, readBuf + activeReadBuf->getRowNullOffset(), false);
+ releaseRowNeeded = TRUE;
+ }
+ }
+ }
+
+ DBUG_RETURN(rc);
+}
+
+
+int ha_ibmdb2i::info(uint flag)
+{
+ DBUG_ENTER("ha_ibmdb2i::info");
+
+ uint16 infoRequested = 0;
+ ValidatedPointer<char> rowKeySpcPtr; // Space pointer passed to DB2
+ uint32 rowKeySpcLen; // Length of space passed to DB2
+ THD* thd = ha_thd();
+ int command = thd_sql_command(thd);
+
+ if (flag & HA_STATUS_AUTO)
+ stats.auto_increment_value = (ulonglong) 0;
+
+ if (flag & HA_STATUS_ERRKEY)
+ {
+ errkey = lastDupKeyID;
+ my_store_ptr(dup_ref, ref_length, lastDupKeyRRN);
+ }
+
+ if (flag & HA_STATUS_TIME)
+ {
+ if ((flag & HA_STATUS_NO_LOCK) &&
+ ibmdb2i_assume_exclusive_use &&
+ share &&
+ (share->cachedStats.isInited(lastModTime)))
+ stats.update_time = share->cachedStats.getUpdateTime();
+ else
+ infoRequested |= lastModTime;
+ }
+
+ if (flag & HA_STATUS_CONST)
+ {
+ stats.block_size=4096;
+ infoRequested |= createTime;
+
+ if (table->s->keys)
+ {
+ infoRequested |= rowsPerKey;
+ rowKeySpcLen = (table->s->keys) * MAX_DB2_KEY_PARTS * sizeof(uint64);
+ rowKeySpcPtr.alloc(rowKeySpcLen);
+ memset(rowKeySpcPtr, 0, rowKeySpcLen); // Clear the allocated space
+ }
+ }
+
+ if (flag & HA_STATUS_VARIABLE)
+ {
+ if ((flag & HA_STATUS_NO_LOCK) &&
+ (command != SQLCOM_SHOW_TABLE_STATUS) &&
+ ibmdb2i_assume_exclusive_use &&
+ share &&
+ (share->cachedStats.isInited(rowCount | deletedRowCount | meanRowLen | ioCount)) &&
+ (share->cachedStats.getRowCount() >= 2))
+ {
+ stats.records = share->cachedStats.getRowCount();
+ stats.deleted = share->cachedStats.getDelRowCount();
+ stats.mean_rec_length = share->cachedStats.getMeanLength();
+ stats.data_file_length = share->cachedStats.getAugmentedDataLength();
+ }
+ else
+ {
+ infoRequested |= rowCount | deletedRowCount | meanRowLen;
+ if (command == SQLCOM_SHOW_TABLE_STATUS)
+ infoRequested |= objLength;
+ else
+ infoRequested |= ioCount;
+ }
+ }
+
+ int rc = 0;
+
+ if (infoRequested)
+ {
+ DBUG_PRINT("ha_ibmdb2i::info",("Retrieving fresh stats %d", flag));
+
+ initBridge(thd);
+ rc = bridge()->retrieveTableInfo((dataHandle ? dataHandle : db2Table->dataFile()->getMasterDefnHandle()),
+ infoRequested,
+ stats,
+ rowKeySpcPtr);
+
+ if (!rc)
+ {
+ if ((flag & HA_STATUS_VARIABLE) &&
+ (command != SQLCOM_SHOW_TABLE_STATUS))
+ stats.data_file_length = stats.data_file_length * IO_SIZE;
+
+ if ((ibmdb2i_assume_exclusive_use) &&
+ (share) &&
+ (command != SQLCOM_SHOW_TABLE_STATUS))
+ {
+ if (flag & HA_STATUS_VARIABLE)
+ {
+ share->cachedStats.cacheRowCount(stats.records);
+ share->cachedStats.cacheDelRowCount(stats.deleted);
+ share->cachedStats.cacheMeanLength(stats.mean_rec_length);
+ share->cachedStats.cacheAugmentedDataLength(stats.data_file_length);
+ }
+
+ if (flag & HA_STATUS_TIME)
+ {
+ share->cachedStats.cacheUpdateTime(stats.update_time);
+ }
+ }
+
+ if (flag & HA_STATUS_CONST)
+ {
+ ulong i; // Loop counter for indexes
+ ulong j; // Loop counter for key parts
+ RowKey* rowKeyPtr; // Pointer to 'number of unique rows' array for this index
+
+ rowKeyPtr = (RowKey_t*)(void*)rowKeySpcPtr; // Address first array of DB2 row counts
+ for (i = 0; i < table->s->keys; i++) // Do for each index, including primary
+ {
+ for (j = 0; j < table->key_info[i].key_parts; j++)
+ {
+ table->key_info[i].rec_per_key[j]= rowKeyPtr->RowKeyArray[j];
+ }
+ rowKeyPtr = rowKeyPtr + 1; // Address next array of DB2 row counts
+ }
+ }
+ }
+ else if (rc == HA_ERR_LOCK_WAIT_TIMEOUT && share)
+ {
+ // If we couldn't retrieve the info because the object was locked,
+ // we'll do our best by returning the most recently cached data.
+ if ((infoRequested & rowCount) &&
+ share->cachedStats.isInited(rowCount))
+ stats.records = share->cachedStats.getRowCount();
+ if ((infoRequested & deletedRowCount) &&
+ share->cachedStats.isInited(deletedRowCount))
+ stats.deleted = share->cachedStats.getDelRowCount();
+ if ((infoRequested & meanRowLen) &&
+ share->cachedStats.isInited(meanRowLen))
+ stats.mean_rec_length = share->cachedStats.getMeanLength();
+ if ((infoRequested & lastModTime) &&
+ share->cachedStats.isInited(lastModTime))
+ stats.update_time = share->cachedStats.getUpdateTime();
+
+ rc = 0;
+ }
+ }
+
+ DBUG_RETURN(rc);
+}
+
+
+ha_rows ha_ibmdb2i::records()
+{
+ DBUG_ENTER("ha_ibmdb2i::records");
+ int rc;
+ rc = bridge()->retrieveTableInfo((dataHandle ? dataHandle : db2Table->dataFile()->getMasterDefnHandle()),
+ rowCount,
+ stats);
+
+ if (unlikely(rc))
+ {
+ if (rc == HA_ERR_LOCK_WAIT_TIMEOUT &&
+ share &&
+ (share->cachedStats.isInited(rowCount)))
+ DBUG_RETURN(share->cachedStats.getRowCount());
+ else
+ DBUG_RETURN(HA_POS_ERROR);
+ }
+ else if (share)
+ {
+ share->cachedStats.cacheRowCount(stats.records);
+ }
+
+ DBUG_RETURN(stats.records);
+}
+
+
+int ha_ibmdb2i::extra(enum ha_extra_function operation)
+{
+ DBUG_ENTER("ha_ibmdb2i::extra");
+
+ switch(operation)
+ {
+ // Can these first five flags be replaced by attending to HA_EXTRA_WRITE_CACHE?
+ case HA_EXTRA_NO_IGNORE_DUP_KEY:
+ case HA_EXTRA_WRITE_CANNOT_REPLACE:
+ {
+ returnDupKeysImmediately = false;
+ onDupUpdate = false;
+ }
+ break;
+ case HA_EXTRA_INSERT_WITH_UPDATE:
+ {
+ returnDupKeysImmediately = true;
+ onDupUpdate = true;
+ }
+ break;
+ case HA_EXTRA_IGNORE_DUP_KEY:
+ case HA_EXTRA_WRITE_CAN_REPLACE:
+ returnDupKeysImmediately = true;
+ break;
+ case HA_EXTRA_FLUSH_CACHE:
+ if (outstanding_start_bulk_insert)
+ finishBulkInsert();
+ break;
+ }
+
+
+ DBUG_RETURN(0);
+}
+
+/**
+ @brief
+ The DB2 storage engine will ignore a MySQL generated value and will generate
+ a new value in SLIC. We arbitrarily set first_value to 1, and set the
+ interval to infinity for better performance on multi-row inserts.
+*/
+void ha_ibmdb2i::get_auto_increment(ulonglong offset, ulonglong increment,
+ ulonglong nb_desired_values,
+ ulonglong *first_value,
+ ulonglong *nb_reserved_values)
+{
+ DBUG_ENTER("ha_ibmdb2i::get_auto_increment");
+ *first_value= 1;
+ *nb_reserved_values= ULONGLONG_MAX;
+}
+
+
+
+void ha_ibmdb2i::update_create_info(HA_CREATE_INFO *create_info)
+{
+ DBUG_ENTER("ha_ibmdb2i::update_create_info");
+
+ if ((!(create_info->used_fields & HA_CREATE_USED_AUTO)) &&
+ (table->found_next_number_field != NULL))
+ {
+ initBridge();
+
+ create_info->auto_increment_value= 1;
+
+ ha_rows rowCount = records();
+
+ if (rowCount == 0)
+ {
+ create_info->auto_increment_value = db2Table->getStartId();
+ DBUG_VOID_RETURN;
+ }
+ else if (rowCount == HA_POS_ERROR)
+ {
+ DBUG_VOID_RETURN;
+ }
+
+ getNextIdVal(&create_info->auto_increment_value);
+ }
+ DBUG_VOID_RETURN;
+}
+
+
+int ha_ibmdb2i::getNextIdVal(ulonglong *value)
+{
+ DBUG_ENTER("ha_ibmdb2i::getNextIdVal");
+
+ char queryBuffer[MAX_DB2_COLNAME_LENGTH + MAX_DB2_QUALIFIEDNAME_LENGTH + 64];
+ strcpy(queryBuffer, " SELECT CAST(MAX( ");
+ convertMySQLNameToDB2Name(table->found_next_number_field->field_name,
+ strend(queryBuffer),
+ MAX_DB2_COLNAME_LENGTH+1);
+ strcat(queryBuffer, ") AS BIGINT) FROM ");
+ db2Table->getDB2QualifiedName(strend(queryBuffer));
+ DBUG_ASSERT(strlen(queryBuffer) < sizeof(queryBuffer));
+
+ SqlStatementStream sqlStream(queryBuffer);
+ DBUG_PRINT("ha_ibmdb2i::getNextIdVal", ("Sent to DB2: %s",queryBuffer));
+
+ int rc = 0;
+ FILE_HANDLE fileHandle2;
+ uint32 db2RowDataLen2;
+ rc = bridge()->prepOpen(sqlStream.getPtrToData(),
+ &fileHandle2,
+ &db2RowDataLen2);
+ if (likely(rc == 0))
+ {
+ IOReadBuffer rowBuffer(1, db2RowDataLen2);
+ rc = bridge()->read(fileHandle2,
+ rowBuffer.ptr(),
+ QMY_READ_ONLY,
+ QMY_NONE,
+ QMY_FIRST);
+
+ if (likely(rc == 0))
+ {
+ /* This check is here for the case where the table is not empty,
+ but the auto_increment starting value has been changed since
+ the last record was written. */
+
+ longlong maxIdVal = *(longlong*)(rowBuffer.getRowN(0));
+ if ((maxIdVal + 1) > db2Table->getStartId())
+ *value = maxIdVal + 1;
+ else
+ *value = db2Table->getStartId();
+ }
+
+ bridge()->deallocateFile(fileHandle2);
+ }
+ DBUG_RETURN(rc);
+}
+
+
+/*
+ Updates index cardinalities.
+*/
+int ha_ibmdb2i::analyze(THD* thd, HA_CHECK_OPT *check_opt)
+{
+ DBUG_ENTER("ha_ibmdb2i::analyze");
+ info(HA_STATUS_TIME | HA_STATUS_CONST | HA_STATUS_VARIABLE);
+ DBUG_RETURN(0);
+}
+
+int ha_ibmdb2i::optimize(THD* thd, HA_CHECK_OPT *check_opt)
+{
+ DBUG_ENTER("ha_ibmdb2i::optimize");
+
+ initBridge(thd);
+
+ if (unlikely(records() == 0))
+ DBUG_RETURN(0); // DB2 doesn't like to reorganize a table with no data.
+
+ quiesceAllFileHandles();
+
+ int32 rc = bridge()->optimizeTable(db2Table->dataFile()->getMasterDefnHandle());
+ info(HA_STATUS_TIME | HA_STATUS_CONST | HA_STATUS_VARIABLE);
+
+ DBUG_RETURN(rc);
+}
+
+
+/**
+ @brief
+ Determines if an ALTER TABLE is allowed to switch the storage engine
+ for this table. If the table has a foreign key or is referenced by a
+ foreign key, then it cannot be switched.
+*/
+bool ha_ibmdb2i::can_switch_engines(void)
+/*=================================*/
+{
+ DBUG_ENTER("ha_ibmdb2i::can_switch_engines");
+
+ int rc = 0;
+ FILE_HANDLE queryFile = 0;
+ uint32 resultRowLen;
+ uint count = 0;
+ bool can_switch = FALSE; // 1 if changing storage engine is allowed
+
+ const char* libName = db2Table->getDB2LibName(db2i_table::ASCII_SQL);
+ const char* fileName = db2Table->getDB2TableName(db2i_table::ASCII_SQL);
+
+ String query(256);
+ query.append(STRING_WITH_LEN(" SELECT COUNT(*) FROM SYSIBM.SQLFOREIGNKEYS WHERE ((PKTABLE_SCHEM = '"));
+ query.append(libName+1, strlen(libName)-2); // Remove quotes from parent schema name
+ query.append(STRING_WITH_LEN("' AND PKTABLE_NAME = '"));
+ query.append(fileName+1,strlen(fileName)-2); // Remove quotes from file name
+ query.append(STRING_WITH_LEN("') OR (FKTABLE_SCHEM = '"));
+ query.append(libName+1,strlen(libName)-2); // Remove quotes from child schema
+ query.append(STRING_WITH_LEN("' AND FKTABLE_NAME = '"));
+ query.append(fileName+1,strlen(fileName)-2); // Remove quotes from child name
+ query.append(STRING_WITH_LEN("'))"));
+
+ SqlStatementStream sqlStream(query);
+
+ rc = bridge()->prepOpen(sqlStream.getPtrToData(),
+ &queryFile,
+ &resultRowLen);
+ if (rc == 0)
+ {
+ IOReadBuffer rowBuffer(1, resultRowLen);
+
+ rc = bridge()->read(queryFile,
+ rowBuffer.ptr(),
+ QMY_READ_ONLY,
+ QMY_NONE,
+ QMY_FIRST);
+ if (!rc)
+ {
+ count = *(uint*)(rowBuffer.getRowN(0));
+ if (count == 0)
+ can_switch = TRUE;
+ }
+
+ bridge()->deallocateFile(queryFile);
+ }
+ DBUG_RETURN(can_switch);
+}
+
+
+
+bool ha_ibmdb2i::check_if_incompatible_data(HA_CREATE_INFO *info,
+ uint table_changes)
+{
+ DBUG_ENTER("ha_ibmdb2i::check_if_incompatible_data");
+ uint i;
+ /* Check that auto_increment value and field definitions were
+ not changed. */
+ if ((info->used_fields & HA_CREATE_USED_AUTO &&
+ info->auto_increment_value != 0) ||
+ table_changes != IS_EQUAL_YES)
+ DBUG_RETURN(COMPATIBLE_DATA_NO);
+ /* Check if any fields were renamed. */
+ for (i= 0; i < table->s->fields; i++)
+ {
+ Field *field= table->field[i];
+ if (field->flags & FIELD_IS_RENAMED)
+ {
+ DBUG_PRINT("info", ("Field has been renamed, copy table"));
+ DBUG_RETURN(COMPATIBLE_DATA_NO);
+ }
+ }
+ DBUG_RETURN(COMPATIBLE_DATA_YES);
+}
+
+int ha_ibmdb2i::reset_auto_increment(ulonglong value)
+ {
+ DBUG_ENTER("ha_ibmdb2i::reset_auto_increment");
+
+ int rc = 0;
+
+ quiesceAllFileHandles();
+
+ const char* libName = db2Table->getDB2LibName(db2i_table::ASCII_SQL);
+ const char* fileName = db2Table->getDB2TableName(db2i_table::ASCII_SQL);
+
+ String query(512);
+ query.append(STRING_WITH_LEN(" ALTER TABLE "));
+ query.append(libName);
+ query.append('.');
+ query.append(fileName);
+ query.append(STRING_WITH_LEN(" ALTER COLUMN "));
+ char colName[MAX_DB2_COLNAME_LENGTH+1];
+ convertMySQLNameToDB2Name(table->found_next_number_field->field_name,
+ colName,
+ sizeof(colName));
+ query.append(colName);
+
+ char restart_value[22];
+ CHARSET_INFO *cs= &my_charset_bin;
+ uint len = (uint)(cs->cset->longlong10_to_str)(cs,restart_value,sizeof(restart_value), 10, value);
+ restart_value[len] = 0;
+
+ query.append(STRING_WITH_LEN(" RESTART WITH "));
+ query.append(restart_value);
+
+ SqlStatementStream sqlStream(query);
+ DBUG_PRINT("ha_ibmdb2i::reset_auto_increment", ("Sent to DB2: %s",query.c_ptr()));
+
+ rc = db2i_ileBridge::getBridgeForThread()->execSQL(sqlStream.getPtrToData(),
+ sqlStream.getStatementCount(),
+ QMY_NONE, //getCommitLevel(),
+ FALSE,
+ FALSE,
+ TRUE, //FALSE,
+ dataHandle);
+ if (rc == 0)
+ db2Table->updateStartId(value);
+
+ DBUG_RETURN(rc);
+}
+
+
+/**
+ @brief
+ This function receives an error code that was previously set by the handler.
+ It returns to MySQL the error string associated with that error.
+*/
+bool ha_ibmdb2i::get_error_message(int error, String *buf)
+{
+ DBUG_ENTER("ha_ibmdb2i::get_error_message");
+ if ((error >= DB2I_FIRST_ERR && error <= DB2I_LAST_ERR) ||
+ (error >= QMY_ERR_MIN && error <= QMY_ERR_MAX))
+ {
+ db2i_ileBridge* bridge = db2i_ileBridge::getBridgeForThread(ha_thd());
+ char* errMsg = bridge->getErrorStorage();
+ buf->copy(errMsg, strlen(errMsg),system_charset_info);
+ bridge->freeErrorStorage();
+ }
+ DBUG_RETURN(FALSE);
+}
+
+
+int ha_ibmdb2i::delete_all_rows()
+{
+ DBUG_ENTER("ha_ibmdb2i::delete_all_rows");
+ int rc = 0;
+ char queryBuffer[MAX_DB2_QUALIFIEDNAME_LENGTH + 64];
+ strcpy(queryBuffer, " DELETE FROM ");
+ db2Table->getDB2QualifiedName(strend(queryBuffer));
+ DBUG_ASSERT(strlen(queryBuffer) < sizeof(queryBuffer));
+
+ SqlStatementStream sqlStream(queryBuffer);
+ DBUG_PRINT("ha_ibmdb2i::delete_all_rows", ("Sent to DB2: %s",queryBuffer));
+ rc = bridge()->execSQL(sqlStream.getPtrToData(),
+ sqlStream.getStatementCount(),
+ getCommitLevel(),
+ false,
+ false,
+ true,
+ dataHandle);
+
+ /* If this method was called on behalf of a TRUNCATE TABLE statement, and if */
+ /* the table has an auto_increment field, then reset the starting value for */
+ /* the auto_increment field to 1.
+ */
+ if (rc == 0 && thd_sql_command(ha_thd()) == SQLCOM_TRUNCATE &&
+ table->found_next_number_field )
+ rc = reset_auto_increment(1);
+
+ invalidateCachedStats();
+
+ DBUG_RETURN(rc);
+}
+
+
+int ha_ibmdb2i::external_lock(THD *thd, int lock_type)
+{
+ int rc = 0;
+
+ DBUG_ENTER("ha_ibmdb2i::external_lock");
+ DBUG_PRINT("ha_ibmdb2i::external_lock",("Lock type: %d", lock_type));
+
+ if (lock_type == F_RDLCK)
+ accessIntent = QMY_READ_ONLY;
+ else if (lock_type == F_WRLCK)
+ accessIntent = QMY_UPDATABLE;
+
+ initBridge(thd);
+ int command = thd_sql_command(thd);
+
+ if (!THDVAR(thd,transaction_unsafe))
+ {
+ if (lock_type != F_UNLCK)
+ {
+ if (autoCommitIsOn(thd) == QMY_YES)
+ {
+ trans_register_ha(thd, FALSE, ibmdb2i_hton);
+ }
+ else
+ {
+ trans_register_ha(thd, TRUE, ibmdb2i_hton);
+ if (likely(command != SQLCOM_CREATE_TABLE))
+ {
+ trans_register_ha(thd, FALSE, ibmdb2i_hton);
+ bridge()->beginStmtTx();
+ }
+ }
+ }
+ }
+
+ if (command == SQLCOM_LOCK_TABLES ||
+ command == SQLCOM_ALTER_TABLE ||
+ command == SQLCOM_UNLOCK_TABLES ||
+ (accessIntent == QMY_UPDATABLE &&
+ (command == SQLCOM_UPDATE ||
+ command == SQLCOM_UPDATE_MULTI ||
+ command == SQLCOM_DELETE ||
+ command == SQLCOM_DELETE_MULTI ||
+ command == SQLCOM_REPLACE ||
+ command == SQLCOM_REPLACE_SELECT) &&
+ getCommitLevel(thd) == QMY_NONE))
+ {
+ char action;
+ char type;
+ if (lock_type == F_UNLCK)
+ {
+ action = QMY_UNLOCK;
+ type = accessIntent == QMY_READ_ONLY ? QMY_LSRD : QMY_LENR;
+ }
+ else
+ {
+ action = QMY_LOCK;
+ type = lock_type == F_RDLCK ? QMY_LSRD : QMY_LENR;
+ }
+
+ DBUG_PRINT("ha_ibmdb2i::external_lock",("%socking table", action==QMY_LOCK ? "L" : "Unl"));
+
+ if (!dataHandle)
+ rc = db2Table->dataFile()->allocateNewInstance(&dataHandle, curConnection);
+
+ rc = bridge()->lockObj(dataHandle,
+ 0,
+ action,
+ type,
+ (command == SQLCOM_LOCK_TABLES ? QMY_NO : QMY_YES));
+
+ }
+
+ // Cache this away so we don't have to access it on each row operation
+ cachedZeroDateOption = (enum_ZeroDate)THDVAR(thd, compat_opt_allow_zero_date_vals);
+
+ DBUG_RETURN(rc);
+}
+
+
+THR_LOCK_DATA **ha_ibmdb2i::store_lock(THD *thd,
+ THR_LOCK_DATA **to,
+ enum thr_lock_type lock_type)
+{
+ if (lock_type != TL_IGNORE && lock.type == TL_UNLOCK)
+ {
+ if ((lock_type >= TL_WRITE_CONCURRENT_INSERT &&
+ lock_type <= TL_WRITE) && !(thd->in_lock_tables && thd_sql_command(thd) == SQLCOM_LOCK_TABLES))
+ lock_type= TL_WRITE_ALLOW_WRITE;
+ lock.type=lock_type;
+ }
+ *to++= &lock;
+ return to;
+}
+
+
+int ha_ibmdb2i::delete_table(const char *name)
+{
+ DBUG_ENTER("ha_ibmdb2i::delete_table");
+ THD* thd = ha_thd();
+ db2i_ileBridge* bridge = db2i_ileBridge::getBridgeForThread(thd);
+
+ char db2Name[MAX_DB2_QUALIFIEDNAME_LENGTH];
+ db2i_table::getDB2QualifiedNameFromPath(name, db2Name);
+
+ String query(128);
+ query.append(STRING_WITH_LEN(" DROP TABLE "));
+ query.append(db2Name);
+
+ if (thd_sql_command(thd) == SQLCOM_DROP_TABLE &&
+ thd->lex->drop_mode == DROP_RESTRICT)
+ query.append(STRING_WITH_LEN(" RESTRICT "));
+ DBUG_PRINT("ha_ibmdb2i::delete_table", ("Sent to DB2: %s",query.c_ptr()));
+
+ SqlStatementStream sqlStream(query);
+
+ db2i_table::getDB2LibNameFromPath(name, db2Name);
+ bool isTemporary = (strcmp(db2Name, DB2I_TEMP_TABLE_SCHEMA) == 0 ? TRUE : FALSE);
+
+ int rc = bridge->execSQL(sqlStream.getPtrToData(),
+ sqlStream.getStatementCount(),
+ (isTemporary ? QMY_NONE : getCommitLevel(thd)),
+ FALSE,
+ FALSE,
+ isTemporary);
+
+ if (rc == HA_ERR_NO_SUCH_TABLE)
+ {
+ warning(thd, DB2I_ERR_TABLE_NOT_FOUND, name);
+ rc = 0;
+ }
+
+ if (rc == 0)
+ {
+ db2i_table::deleteAssocFiles(name);
+ }
+
+ FILE_HANDLE savedHandle = bridge->findAndRemovePreservedHandle(name, &share);
+ while (savedHandle)
+ {
+ bridge->deallocateFile(savedHandle, TRUE);
+ DBUG_ASSERT(share);
+ if (free_share(share))
+ share = NULL;
+ savedHandle = bridge->findAndRemovePreservedHandle(name, &share);
+ }
+
+ my_errno = rc;
+ DBUG_RETURN(rc);
+}
+
+
+int ha_ibmdb2i::rename_table(const char * from, const char * to)
+{
+ DBUG_ENTER("ha_ibmdb2i::rename_table ");
+
+ char db2FromFileName[MAX_DB2_FILENAME_LENGTH + 1];
+ char db2ToFileName[MAX_DB2_FILENAME_LENGTH+1];
+ char db2FromLibName[MAX_DB2_SCHEMANAME_LENGTH+1];
+ char db2ToLibName[MAX_DB2_SCHEMANAME_LENGTH+1];
+
+ db2i_table::getDB2LibNameFromPath(from, db2FromLibName);
+ db2i_table::getDB2LibNameFromPath(to, db2ToLibName);
+
+ if (strcmp(db2FromLibName, db2ToLibName) != 0 )
+ {
+ getErrTxt(DB2I_ERR_RENAME_MOVE,from,to);
+ DBUG_RETURN(DB2I_ERR_RENAME_MOVE);
+ }
+
+ db2i_table::getDB2FileNameFromPath(from, db2FromFileName, db2i_table::ASCII_NATIVE);
+ db2i_table::getDB2FileNameFromPath(to, db2ToFileName);
+
+ char escapedFromFileName[2 * MAX_DB2_FILENAME_LENGTH + 1];
+
+ uint o = 0;
+ uint i = 1;
+ do
+ {
+ escapedFromFileName[o++] = db2FromFileName[i];
+ if (db2FromFileName[i] == '+')
+ escapedFromFileName[o++] = '+';
+ } while (db2FromFileName[++i]);
+ escapedFromFileName[o-1] = 0;
+
+
+ int rc = 0;
+
+ char queryBuffer[sizeof(db2FromLibName) + 2 * sizeof(db2FromFileName) + 256];
+ SafeString selectQuery(queryBuffer, sizeof(queryBuffer));
+ selectQuery.strncat(STRING_WITH_LEN("SELECT CAST(INDEX_NAME AS VARCHAR(128) CCSID 1208) FROM QSYS2.SYSINDEXES WHERE INDEX_NAME LIKE '%+_+_+_%"));
+ selectQuery.strcat(escapedFromFileName);
+ selectQuery.strncat(STRING_WITH_LEN("' ESCAPE '+' AND TABLE_NAME='"));
+ selectQuery.strncat(db2FromFileName+1, strlen(db2FromFileName)-2);
+ selectQuery.strncat(STRING_WITH_LEN("' AND TABLE_SCHEMA='"));
+ selectQuery.strncat(db2FromLibName+1, strlen(db2FromLibName)-2);
+ selectQuery.strcat('\'');
+ DBUG_ASSERT(!selectQuery.overflowed());
+
+ SqlStatementStream indexQuery(selectQuery.ptr());
+
+ FILE_HANDLE queryFile = 0;
+ uint32 resultRowLen;
+
+ initBridge();
+ rc = bridge()->prepOpen(indexQuery.getPtrToData(),
+ &queryFile,
+ &resultRowLen);
+
+ if (unlikely(rc))
+ DBUG_RETURN(rc);
+
+ IOReadBuffer rowBuffer(1, resultRowLen);
+
+ int tableNameLen = strlen(db2FromFileName) - 2;
+
+ SqlStatementStream renameQuery(64);
+ String query;
+ while (rc == 0)
+ {
+ query.length(0);
+
+ rc = bridge()->read(queryFile,
+ rowBuffer.ptr(),
+ QMY_READ_ONLY,
+ QMY_NONE,
+ QMY_NEXT);
+
+ if (!rc)
+ {
+ const char* rowData = rowBuffer.getRowN(0);
+ char indexFileName[MAX_DB2_FILENAME_LENGTH];
+ memset(indexFileName, 0, sizeof(indexFileName));
+
+ uint16 fileNameLen = *(uint16*)(rowData);
+ strncpy(indexFileName, rowData + sizeof(uint16), fileNameLen);
+
+ int bytesToRetain = fileNameLen - tableNameLen;
+ if (bytesToRetain <= 0)
+ /* We can't handle index names in which the MySQL index name and
+ the table name together are longer than the max index name. */
+ {
+ getErrTxt(DB2I_ERR_INVALID_NAME,"index","*generated*");
+ DBUG_RETURN(DB2I_ERR_INVALID_NAME);
+ }
+ char indexName[MAX_DB2_FILENAME_LENGTH];
+ memset(indexName, 0, sizeof(indexName));
+
+ strncpy(indexName,
+ indexFileName,
+ bytesToRetain);
+
+ char db2IndexName[MAX_DB2_FILENAME_LENGTH+1];
+
+ convertMySQLNameToDB2Name(indexFileName, db2IndexName, sizeof(db2IndexName));
+
+ query.append(STRING_WITH_LEN("RENAME INDEX "));
+ query.append(db2FromLibName);
+ query.append('.');
+ query.append(db2IndexName);
+ query.append(STRING_WITH_LEN(" TO "));
+ if (db2i_table::appendQualifiedIndexFileName(indexName, db2ToFileName, query, db2i_table::ASCII_SQL, typeNone) == -1)
+ {
+ getErrTxt(DB2I_ERR_INVALID_NAME,"index","*generated*");
+ DBUG_RETURN(DB2I_ERR_INVALID_NAME );
+ }
+ renameQuery.addStatement(query);
+ DBUG_PRINT("ha_ibmdb2i::rename_table", ("Sent to DB2: %s",query.c_ptr_safe()));
+ }
+ }
+
+
+ if (queryFile)
+ bridge()->deallocateFile(queryFile);
+
+ if (rc != HA_ERR_END_OF_FILE)
+ DBUG_RETURN(rc);
+
+ char db2Name[MAX_DB2_QUALIFIEDNAME_LENGTH];
+
+ /* Rename the table */
+ query.length(0);
+ query.append(STRING_WITH_LEN(" RENAME TABLE "));
+ db2i_table::getDB2QualifiedNameFromPath(from, db2Name);
+ query.append(db2Name);
+ query.append(STRING_WITH_LEN(" TO "));
+ query.append(db2ToFileName);
+ DBUG_PRINT("ha_ibmdb2i::rename_table", ("Sent to DB2: %s",query.c_ptr_safe()));
+ renameQuery.addStatement(query);
+ rc = bridge()->execSQL(renameQuery.getPtrToData(),
+ renameQuery.getStatementCount(),
+ getCommitLevel());
+
+ if (!rc)
+ db2i_table::renameAssocFiles(from, to);
+
+ DBUG_RETURN(rc);
+}
+
+
+int ha_ibmdb2i::create(const char *name, TABLE *table_arg,
+ HA_CREATE_INFO *create_info)
+{
+ DBUG_ENTER("ha_ibmdb2i::create");
+
+ int rc;
+ char fileSortSequence[11] = "*HEX";
+ char fileSortSequenceLibrary[11] = "";
+ char fileSortSequenceType = ' ';
+ char libName[MAX_DB2_SCHEMANAME_LENGTH+1];
+ char fileName[MAX_DB2_FILENAME_LENGTH+1];
+ char colName[MAX_DB2_COLNAME_LENGTH+1];
+ bool isTemporary;
+ ulong auto_inc_value;
+
+ db2i_table::getDB2LibNameFromPath(name, libName);
+ db2i_table::getDB2FileNameFromPath(name, fileName);
+
+ if (osVersion.v < 6)
+ {
+ if (strlen(libName) >
+ MAX_DB2_V5R4_LIBNAME_LENGTH + (isUpperOrQuote(system_charset_info, libName) ? 2 : 0))
+ {
+ getErrTxt(DB2I_ERR_TOO_LONG_SCHEMA,libName, MAX_DB2_V5R4_LIBNAME_LENGTH);
+ DBUG_RETURN(DB2I_ERR_TOO_LONG_SCHEMA);
+ }
+ }
+ else if (strlen(libName) > MAX_DB2_V6R1_LIBNAME_LENGTH)
+ {
+ getErrTxt(DB2I_ERR_TOO_LONG_SCHEMA,libName, MAX_DB2_V6R1_LIBNAME_LENGTH);
+ DBUG_RETURN(DB2I_ERR_TOO_LONG_SCHEMA);
+ }
+
+ String query(256);
+
+ if (strcmp(libName, DB2I_TEMP_TABLE_SCHEMA))
+ {
+ query.append(STRING_WITH_LEN("CREATE TABLE "));
+ query.append(libName);
+ query.append('.');
+ query.append(fileName);
+ isTemporary = FALSE;
+ }
+ else
+ {
+ query.append(STRING_WITH_LEN("DECLARE GLOBAL TEMPORARY TABLE "));
+ query.append(fileName);
+ isTemporary = TRUE;
+ }
+ query.append(STRING_WITH_LEN(" ("));
+
+ THD* thd = ha_thd();
+ enum_TimeFormat timeFormat = (enum_TimeFormat)(THDVAR(thd, compat_opt_time_as_duration));
+ enum_YearFormat yearFormat = (enum_YearFormat)(THDVAR(thd, compat_opt_year_as_int));
+ enum_BlobMapping blobMapping = (enum_BlobMapping)(THDVAR(thd, compat_opt_blob_cols));
+ enum_ZeroDate zeroDate = (enum_ZeroDate)(THDVAR(thd, compat_opt_allow_zero_date_vals));
+ bool propagateDefaults = THDVAR(thd, propagate_default_col_vals);
+
+ Field **field;
+ for (field= table_arg->field; *field; field++)
+ {
+ if ( field != table_arg->field ) // Not the first one
+ query.append(STRING_WITH_LEN(" , "));
+
+ if (!convertMySQLNameToDB2Name((*field)->field_name, colName, sizeof(colName)))
+ {
+ getErrTxt(DB2I_ERR_INVALID_NAME,"field",(*field)->field_name);
+ DBUG_RETURN(DB2I_ERR_INVALID_NAME );
+ }
+
+ query.append(colName);
+ query.append(' ');
+
+ if (rc = getFieldTypeMapping(*field,
+ query,
+ timeFormat,
+ blobMapping,
+ zeroDate,
+ propagateDefaults,
+ yearFormat))
+ DBUG_RETURN(rc);
+
+ if ( (*field)->flags & NOT_NULL_FLAG )
+ {
+ query.append(STRING_WITH_LEN(" NOT NULL "));
+ }
+ if ( (*field)->flags & AUTO_INCREMENT_FLAG )
+ {
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+ if (table_arg->part_info)
+ {
+ getErrTxt(DB2I_ERR_PART_AUTOINC);
+ DBUG_RETURN(DB2I_ERR_PART_AUTOINC);
+ }
+#endif
+ query.append(STRING_WITH_LEN(" GENERATED BY DEFAULT AS IDENTITY ") );
+ if (create_info->auto_increment_value != 0)
+ {
+ /* Query was ALTER TABLE...AUTO_INCREMENT = x; or
+ CREATE TABLE ...AUTO_INCREMENT = x; Set the starting
+ value for the auto_increment column. */
+ char stringValue[22];
+ CHARSET_INFO *cs= &my_charset_bin;
+ uint len = (uint)(cs->cset->longlong10_to_str)(cs,stringValue,sizeof(stringValue), 10, create_info->auto_increment_value);
+ stringValue[len] = 0;
+ query.append(STRING_WITH_LEN(" (START WITH "));
+ query.append(stringValue);
+
+ uint64 maxValue=maxValueForField(*field);
+
+ if (maxValue)
+ {
+ len = (uint)(cs->cset->longlong10_to_str)(cs,stringValue,sizeof(stringValue), 10, maxValue);
+ stringValue[len] = 0;
+ query.append(STRING_WITH_LEN(" MAXVALUE "));
+ query.append(stringValue);
+ }
+
+ query.append(STRING_WITH_LEN(") "));
+ }
+
+ }
+ }
+
+ bool primaryHasStringField = false;
+
+ if (table_arg->s->primary_key != MAX_KEY && !isTemporary)
+ {
+ KEY& curKey = table_arg->key_info[table_arg->s->primary_key];
+ query.append(STRING_WITH_LEN(", PRIMARY KEY( "));
+ for (int j = 0; j < curKey.key_parts; ++j)
+ {
+ if (j != 0)
+ {
+ query.append( STRING_WITH_LEN(" , ") );
+ }
+ Field* field = curKey.key_part[j].field;
+ convertMySQLNameToDB2Name(field->field_name, colName, sizeof(colName));
+ query.append(colName);
+ enum_field_types type = field->real_type();
+ if (type == MYSQL_TYPE_VARCHAR || type == MYSQL_TYPE_BLOB ||
+ type == MYSQL_TYPE_STRING)
+ {
+ rc = updateAssociatedSortSequence(field->charset(),
+ &fileSortSequenceType,
+ fileSortSequence,
+ fileSortSequenceLibrary);
+ if (rc) DBUG_RETURN (rc);
+ primaryHasStringField = true;
+ }
+ }
+ query.append(STRING_WITH_LEN(" ) "));
+ }
+
+ rc = buildDB2ConstraintString(thd->lex,
+ query,
+ name,
+ table_arg->field,
+ &fileSortSequenceType,
+ fileSortSequence,
+ fileSortSequenceLibrary);
+ if (rc) DBUG_RETURN (rc);
+
+ query.append(STRING_WITH_LEN(" ) "));
+
+ if (isTemporary)
+ query.append(STRING_WITH_LEN(" ON COMMIT PRESERVE ROWS "));
+
+ DBUG_PRINT("ha_ibmdb2i::create", ("Sent to DB2: %s",query.c_ptr()));
+ SqlStatementStream sqlStream(query.length());
+ sqlStream.addStatement(query,fileSortSequence,fileSortSequenceLibrary);
+
+ for (uint i = 0; i < table_arg->s->keys; ++i)
+ {
+ if (i != table_arg->s->primary_key || isTemporary)
+ {
+ rc = buildCreateIndexStatement(sqlStream,
+ table_arg->key_info[i],
+ false,
+ libName,
+ fileName);
+ if (rc) DBUG_RETURN (rc);
+ }
+ }
+
+ bool noCommit = isTemporary || ((!autoCommitIsOn(thd)) && (thd_sql_command(thd) == SQLCOM_ALTER_TABLE));
+
+ initBridge();
+
+// if (THDVAR(thd, discovery_mode) == 1)
+// bridge()->expectErrors(QMY_ERR_TABLE_EXISTS);
+
+ rc = bridge()->execSQL(sqlStream.getPtrToData(),
+ sqlStream.getStatementCount(),
+ (isTemporary ? QMY_NONE : getCommitLevel(thd)),
+ TRUE,
+ FALSE,
+ noCommit );
+
+ if (unlikely(rc == QMY_ERR_MSGID) &&
+ memcmp(bridge()->getErrorMsgID(), DB2I_SQL0350, 7) == 0)
+ {
+ my_error(ER_BLOB_USED_AS_KEY, MYF(0), "*unknown*");
+ rc = ER_BLOB_USED_AS_KEY;
+ }
+/* else if (unlikely(rc == QMY_ERR_TABLE_EXISTS) &&
+ THDVAR(thd, discovery_mode) == 1)
+ {
+ db2i_table* temp = new db2i_table(table_arg->s, name);
+ int32 rc = temp->fastInitForCreate(name);
+ delete temp;
+
+ if (!rc)
+ warning(thd, DB2I_ERR_WARN_CREATE_DISCOVER);
+
+ DBUG_RETURN(rc);
+ }
+*/
+
+ if (!rc && !isTemporary)
+ {
+ db2i_table* temp = new db2i_table(table_arg->s, name);
+ int32 rc = temp->fastInitForCreate(name);
+ delete temp;
+ if (rc)
+ delete_table(name);
+ }
+
+ DBUG_RETURN(rc);
+}
+
+
+/**
+ @brief
+ Add an index on-line to a table. This method is called on behalf of
+ a CREATE INDEX or ALTER TABLE statement.
+ It is implemented via a composed DDL statement passed to DB2.
+*/
+int ha_ibmdb2i::add_index(TABLE *table_arg,
+ KEY *key_info,
+ uint num_of_keys)
+{
+ DBUG_ENTER("ha_ibmdb2i::add_index");
+
+ int rc;
+ SqlStatementStream sqlStream(256);
+ const char* libName = db2Table->getDB2LibName(db2i_table::ASCII_SQL);
+ const char* fileName = db2Table->getDB2TableName(db2i_table::ASCII_SQL);
+
+ quiesceAllFileHandles();
+
+ uint primaryKey = MAX_KEY;
+ if (table_arg->s->primary_key >= MAX_KEY && !db2Table->isTemporary())
+ {
+ for (int i = 0; i < num_of_keys; ++i)
+ {
+ if (strcmp(key_info[i].name, "PRIMARY") == 0)
+ {
+ primaryKey = i;
+ break;
+ }
+ else if (primaryKey == MAX_KEY &&
+ key_info[i].flags & HA_NOSAME)
+ {
+ primaryKey = i;
+ for (int j=0 ; j < key_info[i].key_parts ;j++)
+ {
+ uint fieldnr= key_info[i].key_part[j].fieldnr;
+ if (table_arg->s->field[fieldnr]->null_ptr ||
+ table_arg->s->field[fieldnr]->key_length() !=
+ key_info[i].key_part[j].length)
+ {
+ primaryKey = MAX_KEY;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+
+ for (int i = 0; i < num_of_keys; ++i)
+ {
+ KEY& curKey= key_info[i];
+ rc = buildCreateIndexStatement(sqlStream,
+ curKey,
+ (i == primaryKey),
+ libName,
+ fileName);
+ if (rc) DBUG_RETURN (rc);
+ }
+
+ rc = bridge()->execSQL(sqlStream.getPtrToData(),
+ sqlStream.getStatementCount(),
+ getCommitLevel(),
+ FALSE,
+ FALSE,
+ FALSE,
+ dataHandle);
+
+ /* Handle the case where a unique index is being created but an error occurs
+ because the file contains duplicate key values. */
+ if (rc == ER_DUP_ENTRY)
+ print_keydup_error(MAX_KEY,ER(ER_DUP_ENTRY_WITH_KEY_NAME));
+
+ DBUG_RETURN(rc);
+}
+
+/**
+ @brief
+ Drop an index on-line from a table. This method is called on behalf of
+ a DROP INDEX or ALTER TABLE statement.
+ It is implemented via a composed DDL statement passed to DB2.
+*/
+int ha_ibmdb2i::prepare_drop_index(TABLE *table_arg,
+ uint *key_num, uint num_of_keys)
+{
+ DBUG_ENTER("ha_ibmdb2i::prepare_drop_index");
+ int rc;
+ int i = 0;
+ String query(64);
+ SqlStatementStream sqlStream(64 * num_of_keys);
+ SqlStatementStream shadowStream(64 * num_of_keys);
+
+ quiesceAllFileHandles();
+
+ const char* libName = db2Table->getDB2LibName(db2i_table::ASCII_SQL);
+ const char* fileName = db2Table->getDB2TableName(db2i_table::ASCII_SQL);
+
+ while (i < num_of_keys)
+ {
+ query.length(0);
+ DBUG_PRINT("info", ("ha_ibmdb2i::prepare_drop_index %u", key_num[i]));
+ KEY& curKey= table_arg->key_info[key_num[i]];
+ if (key_num[i] == table->s->primary_key && !db2Table->isTemporary())
+ {
+ query.append(STRING_WITH_LEN("ALTER TABLE "));
+ query.append(libName);
+ query.append(STRING_WITH_LEN("."));
+ query.append(fileName);
+ query.append(STRING_WITH_LEN(" DROP PRIMARY KEY"));
+ }
+ else
+ {
+ query.append(STRING_WITH_LEN("DROP INDEX "));
+ query.append(libName);
+ query.append(STRING_WITH_LEN("."));
+ db2i_table::appendQualifiedIndexFileName(curKey.name, fileName, query);
+ }
+ DBUG_PRINT("ha_ibmdb2i::prepare_drop_index", ("Sent to DB2: %s",query.c_ptr_safe()));
+ sqlStream.addStatement(query);
+
+ query.length(0);
+ query.append(STRING_WITH_LEN("DROP INDEX "));
+ query.append(libName);
+ query.append(STRING_WITH_LEN("."));
+ db2i_table::appendQualifiedIndexFileName(curKey.name, fileName, query, db2i_table::ASCII_SQL, typeHex);
+
+ DBUG_PRINT("ha_ibmdb2i::prepare_drop_index", ("Sent to DB2: %s",query.c_ptr_safe()));
+ shadowStream.addStatement(query);
+
+ ++i;
+ }
+
+ rc = bridge()->execSQL(sqlStream.getPtrToData(),
+ sqlStream.getStatementCount(),
+ getCommitLevel(),
+ FALSE,
+ FALSE,
+ FALSE,
+ dataHandle);
+
+ if (rc == 0)
+ bridge()->execSQL(shadowStream.getPtrToData(),
+ shadowStream.getStatementCount(),
+ getCommitLevel());
+
+ DBUG_RETURN(rc);
+}
+
+
+void
+ha_ibmdb2i::unlock_row()
+{
+ DBUG_ENTER("ha_ibmdb2i::unlock_row");
+ DBUG_VOID_RETURN;
+}
+
+int
+ha_ibmdb2i::index_end()
+{
+ DBUG_ENTER("ha_ibmdb2i::index_end");
+ warnIfInvalidData();
+ last_index_init_rc = 0;
+ if (likely(activeReadBuf))
+ activeReadBuf->endRead();
+ if (likely(!last_index_init_rc))
+ releaseIndexFile(active_index);
+ active_index= MAX_KEY;
+ DBUG_RETURN (0);
+}
+
+int ha_ibmdb2i::doCommit(handlerton *hton, THD *thd, bool all)
+{
+ if (!THDVAR(thd, transaction_unsafe))
+ {
+ if (all || autoCommitIsOn(thd))
+ {
+ DBUG_PRINT("ha_ibmdb2i::doCommit",("Committing all"));
+ return (db2i_ileBridge::getBridgeForThread(thd)->commitmentControl(QMY_COMMIT));
+ }
+ else
+ {
+ DBUG_PRINT("ha_ibmdb2i::doCommit",("Committing stmt"));
+ return (db2i_ileBridge::getBridgeForThread(thd)->commitStmtTx());
+ }
+ }
+
+ return (0);
+}
+
+
+int ha_ibmdb2i::doRollback(handlerton *hton, THD *thd, bool all)
+{
+ if (!THDVAR(thd,transaction_unsafe))
+ {
+ if (all || autoCommitIsOn(thd))
+ {
+ DBUG_PRINT("ha_ibmdb2i::doRollback",("Rolling back all"));
+ return ( db2i_ileBridge::getBridgeForThread(thd)->commitmentControl(QMY_ROLLBACK));
+ }
+ else
+ {
+ DBUG_PRINT("ha_ibmdb2i::doRollback",("Rolling back stmt"));
+ return (db2i_ileBridge::getBridgeForThread(thd)->rollbackStmtTx());
+ }
+ }
+ return (0);
+}
+
+
+void ha_ibmdb2i::start_bulk_insert(ha_rows rows)
+{
+ DBUG_ENTER("ha_ibmdb2i::start_bulk_insert");
+ DBUG_PRINT("ha_ibmdb2i::start_bulk_insert",("Rows hinted %d", rows));
+ int rc;
+ THD* thd = ha_thd();
+ int command = thd_sql_command(thd);
+
+ if (db2Table->hasBlobs() ||
+ (command == SQLCOM_REPLACE || command == SQLCOM_REPLACE_SELECT))
+ rows = 1;
+ else if (rows == 0)
+ rows = DEFAULT_MAX_ROWS_TO_BUFFER; // Shoot the moon
+
+ // If we're doing a multi-row insert, binlogging is active, and the table has an
+ // auto_increment column, then we'll attempt to lock the file while we perform a 'fast path' blocked
+ // insert. If we can't get the lock, then we'll do a row-by-row 'slow path' insert instead. The reason is
+ // because the MI generates the auto_increment (identity value), and if we can't lock the file,
+ // then we can't predetermine what that value will be for insertion into the MySQL write buffer.
+
+ if ((rows > 1) && // Multi-row insert
+ (thd->options & OPTION_BIN_LOG) && // Binlogging is on
+ (table->found_next_number_field)) // Table has an auto_increment column
+ {
+ if (!dataHandle)
+ rc = db2Table->dataFile()->allocateNewInstance(&dataHandle, curConnection);
+
+ rc = bridge()->lockObj(dataHandle, 1, QMY_LOCK, QMY_LEAR, QMY_YES);
+ if (rc==0) // Got the lock
+ {
+ autoIncLockAcquired = TRUE;
+ got_auto_inc_values = FALSE;
+ }
+ else // Didn't get the lock
+ rows = 1; // No problem, but don't block inserts
+ }
+
+ if (activeHandle == 0)
+ {
+ last_start_bulk_insert_rc = useDataFile();
+ if (last_start_bulk_insert_rc == 0)
+ last_start_bulk_insert_rc = prepWriteBuffer(rows, db2Table->dataFile());
+ }
+
+ if (last_start_bulk_insert_rc == 0)
+ outstanding_start_bulk_insert = true;
+ else
+ {
+ if (autoIncLockAcquired == TRUE)
+ {
+ bridge()->lockObj(dataHandle, 0, QMY_UNLOCK, QMY_LEAR, QMY_YES);
+ autoIncLockAcquired = FALSE;
+ }
+ }
+
+ DBUG_VOID_RETURN;
+}
+
+
+int ha_ibmdb2i::end_bulk_insert()
+{
+ DBUG_ENTER("ha_ibmdb2i::end_bulk_insert");
+ int rc = 0;
+
+ if (outstanding_start_bulk_insert)
+ {
+ rc = finishBulkInsert();
+ }
+
+ my_errno = rc;
+
+ DBUG_RETURN(rc);
+}
+
+
+int ha_ibmdb2i::prepReadBuffer(ha_rows rowsToRead, const db2i_file* file, char intent)
+{
+ DBUG_ENTER("ha_ibmdb2i::prepReadBuffer");
+ DBUG_ASSERT(rowsToRead > 0);
+
+ THD* thd = ha_thd();
+ char cmtLvl = getCommitLevel(thd);
+
+ const db2i_file::RowFormat* format;
+ int rc = file->obtainRowFormat(activeHandle, intent, cmtLvl, &format);
+
+ if (unlikely(rc)) DBUG_RETURN(rc);
+
+ if (lobFieldsRequested())
+ {
+ forceSingleRowRead = true;
+ rowsToRead = 1;
+ }
+
+ rowsToRead = min(stats.records+1,min(rowsToRead, DEFAULT_MAX_ROWS_TO_BUFFER));
+
+ uint bufSize = min((format->readRowLen * rowsToRead), THDVAR(thd, max_read_buffer_size));
+ multiRowReadBuf.allocBuf(format->readRowLen, format->readRowNullOffset, bufSize);
+ activeReadBuf = &multiRowReadBuf;
+
+ if (db2Table->hasBlobs())
+ {
+ if (!blobReadBuffers)
+ blobReadBuffers = new BlobCollection(db2Table, THDVAR(thd, lob_alloc_size));
+ rc = prepareReadBufferForLobs();
+ if (rc) DBUG_RETURN(rc);
+ }
+
+// if (accessIntent == QMY_UPDATABLE &&
+// thd_tx_isolation(thd) == ISO_REPEATABLE_READ &&
+// !THDVAR(thd, transaction_unsafe))
+// activeReadBuf->update(QMY_READ_ONLY, &releaseRowNeeded, QMY_REPEATABLE_READ);
+// else
+ activeReadBuf->update(intent, &releaseRowNeeded, cmtLvl);
+
+ DBUG_RETURN(rc);
+}
+
+
+int ha_ibmdb2i::prepWriteBuffer(ha_rows rowsToWrite, const db2i_file* file)
+{
+ DBUG_ENTER("ha_ibmdb2i::prepWriteBuffer");
+ DBUG_ASSERT(accessIntent == QMY_UPDATABLE && rowsToWrite > 0);
+
+ const db2i_file::RowFormat* format;
+ int rc = file->obtainRowFormat(activeHandle,
+ QMY_UPDATABLE,
+ getCommitLevel(ha_thd()),
+ &format);
+
+ if (unlikely(rc)) DBUG_RETURN(rc);
+
+ rowsToWrite = min(rowsToWrite, DEFAULT_MAX_ROWS_TO_BUFFER);
+
+ uint bufSize = min((format->writeRowLen * rowsToWrite), THDVAR(ha_thd(), max_write_buffer_size));
+ multiRowWriteBuf.allocBuf(format->writeRowLen, format->writeRowNullOffset, bufSize);
+ activeWriteBuf = &multiRowWriteBuf;
+
+ if (!blobWriteBuffers && db2Table->hasBlobs())
+ {
+ blobWriteBuffers = new ValidatedPointer<char>[db2Table->getBlobCount()];
+ }
+ DBUG_RETURN(rc);
+}
+
+
+int ha_ibmdb2i::flushWrite(FILE_HANDLE fileHandle, uchar* buf )
+{
+ DBUG_ENTER("ha_ibmdb2i::flushWrite");
+ int rc;
+ int64 generatedIdValue = 0;
+ bool IdValueWasGenerated = FALSE;
+ char* lastDupKeyNamePtr = NULL;
+ uint32 lastDupKeyNameLen = 0;
+ int loopCnt = 0;
+ bool retry_dup = FALSE;
+
+ while (loopCnt == 0 || retry_dup == TRUE)
+ {
+ rc = bridge()->writeRows(fileHandle,
+ activeWriteBuf->ptr(),
+ getCommitLevel(),
+ &generatedIdValue,
+ &IdValueWasGenerated,
+ &lastDupKeyRRN,
+ &lastDupKeyNamePtr,
+ &lastDupKeyNameLen,
+ &incrementByValue);
+ loopCnt++;
+ retry_dup = FALSE;
+ invalidateCachedStats();
+ if (lastDupKeyNameLen)
+ {
+ rrnAssocHandle = fileHandle;
+
+ int command = thd_sql_command(ha_thd());
+
+ if (command == SQLCOM_REPLACE ||
+ command == SQLCOM_REPLACE_SELECT)
+ lastDupKeyID = 0;
+ else
+ {
+ lastDupKeyID = getKeyFromName(lastDupKeyNamePtr, lastDupKeyNameLen);
+
+ if (likely(lastDupKeyID != MAX_KEY))
+ {
+ uint16 failedRow = activeWriteBuf->rowsWritten()+1;
+
+ if (buf && (failedRow != activeWriteBuf->rowCount()))
+ {
+ const char* badRow = activeWriteBuf->getRowN(failedRow-1);
+ bool savedReadAllColumns = readAllColumns;
+ readAllColumns = true;
+ mungeDB2row(buf,
+ badRow,
+ badRow + activeWriteBuf->getRowNullOffset(),
+ true);
+ readAllColumns = savedReadAllColumns;
+
+ if (table->found_next_number_field)
+ {
+ table->next_number_field->store(next_identity_value - (incrementByValue * (activeWriteBuf->rowCount() - (failedRow - 1))));
+ }
+ }
+
+ if (default_identity_value && // Table has ID colm and generating a value
+ (!autoIncLockAcquired || !got_auto_inc_values) &&
+ // Writing first or only row in block
+ loopCnt == 1 && // Didn't already retry
+ lastDupKeyID == table->s->next_number_index) // Autoinc column is in failed index
+ {
+ if (alterStartWith() == 0) // Reset next Identity value to max+1
+ retry_dup = TRUE; // Rtry the write operation
+ }
+ }
+ else
+ {
+ char unknownIndex[MAX_DB2_FILENAME_LENGTH+1];
+ convFromEbcdic(lastDupKeyNamePtr, unknownIndex, min(lastDupKeyNameLen, MAX_DB2_FILENAME_LENGTH));
+ unknownIndex[min(lastDupKeyNameLen, MAX_DB2_FILENAME_LENGTH)] = 0;
+ getErrTxt(DB2I_ERR_UNKNOWN_IDX, unknownIndex);
+ }
+ }
+ }
+ }
+
+ if ((rc == 0 || rc == HA_ERR_FOUND_DUPP_KEY)
+ && default_identity_value && IdValueWasGenerated &&
+ (!autoIncLockAcquired || !got_auto_inc_values))
+ {
+ /* Save the generated identity value for the MySQL last_insert_id() function. */
+ insert_id_for_cur_row = generatedIdValue;
+
+ /* Store the value into MySQL's buf for row-based replication
+ or for an 'on duplicate key update' clause. */
+ table->next_number_field->store((longlong) generatedIdValue, TRUE);
+ if (autoIncLockAcquired)
+ {
+ got_auto_inc_values = TRUE;
+ next_identity_value = generatedIdValue + incrementByValue;
+ }
+ }
+ else
+ {
+ if (!autoIncLockAcquired) // Don't overlay value for first row of a block
+ insert_id_for_cur_row = 0;
+ }
+
+
+ activeWriteBuf->resetAfterWrite();
+ DBUG_RETURN(rc);
+}
+
+int ha_ibmdb2i::alterStartWith()
+{
+ DBUG_ENTER("ha_ibmdb2i::alterStartWith");
+ int rc = 0;
+ ulonglong nextIdVal;
+ if (!dataHandle)
+ rc = db2Table->dataFile()->allocateNewInstance(&dataHandle, curConnection);
+ if (!rc) {rc = bridge()->lockObj(dataHandle, 1, QMY_LOCK, QMY_LENR, QMY_YES);}
+ if (!rc)
+ {
+ rc = getNextIdVal(&nextIdVal);
+ if (!rc) {rc = reset_auto_increment(nextIdVal);}
+ bridge()->lockObj(dataHandle, 0, QMY_UNLOCK, QMY_LENR, QMY_YES);
+ }
+ DBUG_RETURN(rc);
+}
+
+bool ha_ibmdb2i::lobFieldsRequested()
+{
+ if (!db2Table->hasBlobs())
+ {
+ DBUG_PRINT("ha_ibmdb2i::lobFieldsRequested",("No LOBs"));
+ return (false);
+ }
+
+ if (readAllColumns)
+ {
+ DBUG_PRINT("ha_ibmdb2i::lobFieldsRequested",("All cols requested"));
+ return (true);
+ }
+
+ for (int i = 0; i < db2Table->getBlobCount(); ++i)
+ {
+ if (bitmap_is_set(table->read_set, db2Table->blobFields[i]))
+ {
+ DBUG_PRINT("ha_ibmdb2i::lobFieldsRequested",("LOB requested"));
+ return (true);
+ }
+ }
+
+ DBUG_PRINT("ha_ibmdb2i::lobFieldsRequested",("No LOBs requested"));
+ return (false);
+}
+
+
+int ha_ibmdb2i::prepareReadBufferForLobs()
+{
+ DBUG_ENTER("ha_ibmdb2i::prepareReadBufferForLobs");
+ DBUG_ASSERT(db2Table->hasBlobs());
+
+ uint32 activeLobFields = 0;
+ DB2LobField* lobField;
+ uint16 blobCount = db2Table->getBlobCount();
+
+ char* readBuf = activeReadBuf->getRowN(0);
+
+ for (int i = 0; i < blobCount; ++i)
+ {
+ int fieldID = db2Table->blobFields[i];
+ DB2Field& db2Field = db2Table->db2Field(fieldID);
+ lobField = db2Field.asBlobField(readBuf);
+ if (readAllColumns ||
+ bitmap_is_set(table->read_set, fieldID))
+ {
+ lobField->dataHandle = (ILEMemHandle)blobReadBuffers->getBufferPtr(fieldID);
+ activeLobFields++;
+ }
+ else
+ {
+ lobField->dataHandle = NULL;
+ }
+ }
+
+ if (activeLobFields == 0)
+ {
+ for (int i = 0; i < blobCount; ++i)
+ {
+ DB2Field& db2Field = db2Table->db2Field(db2Table->blobFields[i]);
+ uint16 offset = db2Field.getBufferOffset() + db2Field.calcBlobPad();
+
+ for (int r = 1; r < activeReadBuf->getRowCapacity(); ++r)
+ {
+ lobField = (DB2LobField*)(activeReadBuf->getRowN(r) + offset);
+ lobField->dataHandle = NULL;
+ }
+ }
+ }
+
+ activeReadBuf->setRowsToProcess((activeLobFields ? 1 : activeReadBuf->getRowCapacity()));
+ int rc = bridge()->objectOverride(activeHandle,
+ activeReadBuf->ptr(),
+ activeReadBuf->getRowLength());
+ DBUG_RETURN(rc);
+}
+
+
+uint32 ha_ibmdb2i::adjustLobBuffersForRead()
+{
+ DBUG_ENTER("ha_ibmdb2i::adjustLobBuffersForRead");
+
+ char* readBuf = activeReadBuf->getRowN(0);
+
+ for (int i = 0; i < db2Table->getBlobCount(); ++i)
+ {
+ DB2Field& db2Field = db2Table->db2Field(db2Table->blobFields[i]);
+ DB2LobField* lobField = db2Field.asBlobField(readBuf);
+ if (readAllColumns ||
+ bitmap_is_set(table->read_set, db2Table->blobFields[i]))
+ {
+ lobField->dataHandle = (ILEMemHandle)blobReadBuffers->reallocBuffer(db2Table->blobFields[i], lobField->length);
+
+ if (lobField->dataHandle == NULL)
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ else
+ {
+ lobField->dataHandle = 0;
+ }
+ }
+
+ int32 rc = bridge()->objectOverride(activeHandle,
+ activeReadBuf->ptr());
+ DBUG_RETURN(rc);
+}
+
+
+
+int ha_ibmdb2i::reset()
+{
+ DBUG_ENTER("ha_ibmdb2i::reset");
+
+ if (outstanding_start_bulk_insert)
+ {
+ finishBulkInsert();
+ }
+
+ if (activeHandle != 0)
+ {
+ releaseActiveHandle();
+ }
+
+ cleanupBuffers();
+
+ db2i_ileBridge::getBridgeForThread(ha_thd())->freeErrorStorage();
+
+ last_rnd_init_rc = last_index_init_rc = last_start_bulk_insert_rc = 0;
+
+ returnDupKeysImmediately = false;
+ onDupUpdate = false;
+ forceSingleRowRead = false;
+
+#ifndef DBUG_OFF
+ cachedBridge=NULL;
+#endif
+
+ DBUG_RETURN(0);
+}
+
+
+int32 ha_ibmdb2i::buildCreateIndexStatement(SqlStatementStream& sqlStream,
+ KEY& key,
+ bool isPrimary,
+ const char* db2LibName,
+ const char* db2FileName)
+{
+ DBUG_ENTER("ha_ibmdb2i::buildCreateIndexStatement");
+
+ char fileSortSequence[11] = "*HEX";
+ char fileSortSequenceLibrary[11] = "";
+ char fileSortSequenceType = ' ';
+ String query(256);
+ query.length(0);
+ int rc = 0;
+
+ if (isPrimary)
+ {
+ query.append(STRING_WITH_LEN("ALTER TABLE "));
+ query.append(db2LibName);
+ query.append('.');
+ query.append(db2FileName);
+ query.append(STRING_WITH_LEN(" ADD PRIMARY KEY "));
+ }
+ else
+ {
+ query.append(STRING_WITH_LEN("CREATE"));
+
+ if (key.flags & HA_NOSAME)
+ query.append(STRING_WITH_LEN(" UNIQUE WHERE NOT NULL"));
+
+ query.append(STRING_WITH_LEN(" INDEX "));
+
+ query.append(db2LibName);
+ query.append('.');
+ if (db2i_table::appendQualifiedIndexFileName(key.name, db2FileName, query))
+ {
+ getErrTxt(DB2I_ERR_INVALID_NAME,"index","*generated*");
+ DBUG_RETURN(DB2I_ERR_INVALID_NAME );
+ }
+
+ query.append(STRING_WITH_LEN(" ON "));
+
+ query.append(db2LibName);
+ query.append('.');
+ query.append(db2FileName);
+ }
+
+ String fieldDefinition(128);
+ fieldDefinition.length(0);
+ fieldDefinition.append(STRING_WITH_LEN(" ( "));
+ for (int j = 0; j < key.key_parts; ++j)
+ {
+ char colName[MAX_DB2_COLNAME_LENGTH+1];
+ if (j != 0)
+ {
+ fieldDefinition.append(STRING_WITH_LEN(" , "));
+ }
+ Field* field = key.key_part[j].field;
+ convertMySQLNameToDB2Name(field->field_name, colName, sizeof(colName));
+ fieldDefinition.append(colName);
+ rc = updateAssociatedSortSequence(field->charset(),
+ &fileSortSequenceType,
+ fileSortSequence,
+ fileSortSequenceLibrary);
+ if (rc) DBUG_RETURN (rc);
+ }
+ fieldDefinition.append(STRING_WITH_LEN(" ) "));
+
+ query.append(fieldDefinition);
+
+ if ((THDVAR(ha_thd(), create_index_option)==1) &&
+ (fileSortSequenceType != 'B'))
+ {
+ String shadowQuery(256);
+ shadowQuery.length(0);
+
+ shadowQuery.append(STRING_WITH_LEN("CREATE INDEX "));
+
+ shadowQuery.append(db2LibName);
+ shadowQuery.append('.');
+ if (db2i_table::appendQualifiedIndexFileName(key.name, db2FileName, shadowQuery, db2i_table::ASCII_SQL, typeHex))
+ {
+ getErrTxt(DB2I_ERR_INVALID_NAME,"index","*generated*");
+ DBUG_RETURN(DB2I_ERR_INVALID_NAME );
+ }
+
+ shadowQuery.append(STRING_WITH_LEN(" ON "));
+
+ shadowQuery.append(db2LibName);
+ shadowQuery.append('.');
+ shadowQuery.append(db2FileName);
+ shadowQuery.append(fieldDefinition);
+ DBUG_PRINT("ha_ibmdb2i::buildCreateIndexStatement", ("Sent to DB2: %s",shadowQuery.c_ptr_safe()));
+ sqlStream.addStatement(shadowQuery,"*HEX","QSYS");
+ }
+
+ DBUG_PRINT("ha_ibmdb2i::buildCreateIndexStatement", ("Sent to DB2: %s",query.c_ptr_safe()));
+ sqlStream.addStatement(query,fileSortSequence,fileSortSequenceLibrary);
+
+ DBUG_RETURN(0);
+}
+
+
+void ha_ibmdb2i::doInitialRead(char orientation,
+ uint32 rowsToBuffer,
+ ILEMemHandle key,
+ int keyLength,
+ int keyParts)
+{
+ DBUG_ENTER("ha_ibmdb2i::doInitialRead");
+
+ if (forceSingleRowRead)
+ rowsToBuffer = 1;
+ else
+ rowsToBuffer = min(rowsToBuffer, activeReadBuf->getRowCapacity());
+
+ activeReadBuf->newReadRequest(activeHandle,
+ orientation,
+ rowsToBuffer,
+ THDVAR(ha_thd(), async_enabled),
+ key,
+ keyLength,
+ keyParts);
+ DBUG_VOID_RETURN;
+}
+
+
+int ha_ibmdb2i::start_stmt(THD *thd, thr_lock_type lock_type)
+{
+ DBUG_ENTER("ha_ibmdb2i::start_stmt");
+ initBridge(thd);
+ if (!THDVAR(thd, transaction_unsafe))
+ {
+ trans_register_ha(thd, FALSE, ibmdb2i_hton);
+
+ if (!autoCommitIsOn(thd))
+ {
+ bridge()->beginStmtTx();
+ }
+ }
+
+ DBUG_RETURN(0);
+}
+
+int32 ha_ibmdb2i::handleLOBReadOverflow()
+{
+ DBUG_ENTER("ha_ibmdb2i::handleLOBReadOverflow");
+ DBUG_ASSERT(db2Table->hasBlobs() && (activeReadBuf->getRowCapacity() == 1));
+
+ int32 rc = adjustLobBuffersForRead();
+
+ if (!rc)
+ {
+ activeReadBuf->rewind();
+ rc = bridge()->expectErrors(QMY_ERR_END_OF_BLOCK)
+ ->read(activeHandle,
+ activeReadBuf->ptr(),
+ accessIntent,
+ getCommitLevel(),
+ QMY_SAME);
+ releaseRowNeeded = TRUE;
+
+ }
+ DBUG_RETURN(rc);
+}
+
+
+int32 ha_ibmdb2i::finishBulkInsert()
+{
+ int32 rc = 0;
+
+ if (activeWriteBuf->rowCount() && activeHandle)
+ rc = flushWrite(activeHandle, table->record[0]);
+
+ if (activeHandle)
+ releaseActiveHandle();
+
+ if (autoIncLockAcquired == TRUE)
+ {
+ // We could check the return code on the unlock, but beware not
+ // to overlay the return code from the flushwrite or we will mask
+ // duplicate key errors..
+ bridge()->lockObj(dataHandle, 0, QMY_UNLOCK, QMY_LEAR, QMY_YES);
+ autoIncLockAcquired = FALSE;
+ }
+ outstanding_start_bulk_insert = false;
+ multiRowWriteBuf.freeBuf();
+ last_start_bulk_insert_rc = 0;
+
+ resetCharacterConversionBuffers();
+
+ return rc;
+}
+
+int ha_ibmdb2i::getKeyFromName(const char* name, size_t len)
+{
+ for (int i = 0; i < table_share->keys; ++i)
+ {
+ const char* indexName = db2Table->indexFile(i)->getDB2FileName();
+ if ((strncmp(name, indexName, len) == 0) &&
+ (strlen(indexName) == len))
+ {
+ return i;
+ }
+ }
+ return MAX_KEY;
+}
+
+/*
+Determine the number of I/O's it takes to read through the table.
+ */
+double ha_ibmdb2i::scan_time()
+ {
+ DBUG_ENTER("ha_ibmdb2i::scan_time");
+ DBUG_RETURN(ulonglong2double((stats.data_file_length)/IO_SIZE));
+ }
+
+
+/**
+ Estimate the number of I/O's it takes to read a set of ranges through
+ an index.
+
+ @param index
+ @param ranges
+ @param rows
+
+ @return The estimate number of I/Os
+*/
+
+double ha_ibmdb2i::read_time(uint index, uint ranges, ha_rows rows)
+{
+ DBUG_ENTER("ha_ibmdb2i::read_time");
+ int rc;
+ uint64 idxPageCnt = 0;
+ double cost;
+
+ if (unlikely(rows == HA_POS_ERROR))
+ DBUG_RETURN(double(rows) + ranges);
+
+ rc = bridge()->retrieveIndexInfo(db2Table->indexFile(index)->getMasterDefnHandle(),
+ &idxPageCnt);
+ if (!rc)
+ {
+ if ((idxPageCnt == 1) || // Retrieving rows in requested order or
+ (ranges == rows)) // 'Sweep' full records retrieval
+ cost = idxPageCnt/4;
+ else
+ {
+ uint64 totalRecords = stats.records + 1;
+ double dataPageCount = stats.data_file_length/IO_SIZE;
+
+ cost = (rows * dataPageCount / totalRecords) +
+ min(idxPageCnt, (log_2(idxPageCnt) * ranges +
+ rows * (log_2(idxPageCnt) + log_2(rows) - log_2(totalRecords))));
+ }
+ }
+ else
+ {
+ cost = rows2double(ranges+rows); // Use default costing
+ }
+ DBUG_RETURN(cost);
+}
+
+int ha_ibmdb2i::useIndexFile(int idx)
+{
+ DBUG_ENTER("ha_ibmdb2i::useIndexFile");
+
+ if (activeHandle)
+ releaseActiveHandle();
+
+ int rc = 0;
+
+ if (!indexHandles[idx])
+ rc = db2Table->indexFile(idx)->allocateNewInstance(&indexHandles[idx], curConnection);
+
+ if (rc == 0)
+ {
+ activeHandle = indexHandles[idx];
+ bumpInUseCounter(1);
+ }
+
+ DBUG_RETURN(rc);
+}
+
+
+ulong ha_ibmdb2i::index_flags(uint inx, uint part, bool all_parts) const
+{
+ return HA_READ_NEXT | HA_READ_PREV | HA_KEYREAD_ONLY | HA_READ_ORDER | HA_READ_RANGE;
+}
+
+
+static struct st_mysql_sys_var* ibmdb2i_system_variables[] = {
+ MYSQL_SYSVAR(rdb_name),
+ MYSQL_SYSVAR(transaction_unsafe),
+ MYSQL_SYSVAR(lob_alloc_size),
+ MYSQL_SYSVAR(max_read_buffer_size),
+ MYSQL_SYSVAR(max_write_buffer_size),
+ MYSQL_SYSVAR(async_enabled),
+ MYSQL_SYSVAR(assume_exclusive_use),
+ MYSQL_SYSVAR(compat_opt_blob_cols),
+ MYSQL_SYSVAR(compat_opt_time_as_duration),
+ MYSQL_SYSVAR(compat_opt_allow_zero_date_vals),
+ MYSQL_SYSVAR(compat_opt_year_as_int),
+ MYSQL_SYSVAR(propagate_default_col_vals),
+ MYSQL_SYSVAR(create_index_option),
+// MYSQL_SYSVAR(discovery_mode),
+ MYSQL_SYSVAR(system_trace_level),
+ NULL
+};
+
+
+struct st_mysql_storage_engine ibmdb2i_storage_engine=
+{ MYSQL_HANDLERTON_INTERFACE_VERSION };
+
+mysql_declare_plugin(ibmdb2i)
+{
+ MYSQL_STORAGE_ENGINE_PLUGIN,
+ &ibmdb2i_storage_engine,
+ "IBMDB2I",
+ "The IBM development team in Rochester, Minnesota",
+ "IBM DB2 for i Storage Engine",
+ PLUGIN_LICENSE_GPL,
+ ibmdb2i_init_func, /* Plugin Init */
+ ibmdb2i_done_func, /* Plugin Deinit */
+ 0x0100 /* 1.0 */,
+ NULL, /* status variables */
+ ibmdb2i_system_variables, /* system variables */
+ NULL /* config options */
+}
+mysql_declare_plugin_end;
diff --git a/storage/ibmdb2i/ha_ibmdb2i.h b/storage/ibmdb2i/ha_ibmdb2i.h
new file mode 100644
index 00000000000..e90f152919c
--- /dev/null
+++ b/storage/ibmdb2i/ha_ibmdb2i.h
@@ -0,0 +1,750 @@
+/*
+Licensed Materials - Property of IBM
+DB2 Storage Engine Enablement
+Copyright IBM Corporation 2007,2008
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ (a) Redistributions of source code must retain this list of conditions, the
+ copyright notice in section {d} below, and the disclaimer following this
+ list of conditions.
+ (b) Redistributions in binary form must reproduce this list of conditions, the
+ copyright notice in section (d) below, and the disclaimer following this
+ list of conditions, in the documentation and/or other materials provided
+ with the distribution.
+ (c) The name of IBM may not be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ (d) The text of the required copyright notice is:
+ Licensed Materials - Property of IBM
+ DB2 Storage Engine Enablement
+ Copyright IBM Corporation 2007,2008
+ All rights reserved
+
+THIS SOFTWARE IS PROVIDED BY IBM CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL IBM CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+*/
+
+/** @file ha_ibmdb2i.h
+
+ @brief
+
+ @note
+
+ @see
+*/
+
+#ifdef USE_PRAGMA_INTERFACE
+#pragma interface /* gcc class implementation */
+#endif
+
+#include "as400_types.h"
+#include "as400_protos.h"
+#include "db2i_global.h"
+#include "db2i_ileBridge.h"
+#include "builtins.h"
+#include "db2i_misc.h"
+#include "db2i_file.h"
+#include "db2i_blobCollection.h"
+#include "db2i_collationSupport.h"
+#include "db2i_validatedPointer.h"
+#include "db2i_ioBuffers.h"
+#include "db2i_errors.h"
+#include "db2i_sqlStatementStream.h"
+
+/** @brief
+ IBMDB2I_SHARE is a structure that will be shared among all open handlers.
+ It is used to describe the underlying table definition, and it caches
+ table statistics.
+*/
+struct IBMDB2I_SHARE {
+ char *table_name;
+ uint table_name_length,use_count;
+ pthread_mutex_t mutex;
+ THR_LOCK lock;
+
+ db2i_table* db2Table;
+
+ class CStats
+ {
+ public:
+ void cacheUpdateTime(time_t time)
+ {update_time = time; initFlag |= lastModTime;}
+ time_t getUpdateTime() const
+ {return update_time;}
+ void cacheRowCount(ha_rows rows)
+ {records = rows; initFlag |= rowCount;}
+ ha_rows getRowCount() const
+ {return records;}
+ void cacheDelRowCount(ha_rows rows)
+ {deleted = rows; initFlag |= deletedRowCount;}
+ ha_rows getDelRowCount() const
+ {return deleted;}
+ void cacheMeanLength(ulong len)
+ {mean_rec_length = len; initFlag |= meanRowLen;}
+ ulong getMeanLength()
+ {return mean_rec_length;}
+ void cacheAugmentedDataLength(ulong len)
+ {data_file_length = len; initFlag |= ioCount;}
+ ulong getAugmentedDataLength()
+ {return data_file_length;}
+ bool isInited(uint flags)
+ {return initFlag & flags;}
+ void invalidate(uint flags)
+ {initFlag &= ~flags;}
+
+ private:
+ uint initFlag;
+ time_t update_time;
+ ha_rows records;
+ ha_rows deleted;
+ ulong mean_rec_length;
+ ulong data_file_length;
+ } cachedStats;
+
+};
+
+class ha_ibmdb2i: public handler
+{
+ THR_LOCK_DATA lock; ///< MySQL lock
+ IBMDB2I_SHARE *share; ///< Shared lock info
+
+ // The record we are positioned on, together with the handle used to get
+ // i.
+ uint32 currentRRN;
+ uint32 rrnAssocHandle;
+
+ // Dup key values needed by info()
+ uint32 lastDupKeyRRN;
+ uint32 lastDupKeyID;
+
+ bool returnDupKeysImmediately;
+
+ // Dup key value need by update()
+ bool onDupUpdate;
+
+
+ db2i_table* db2Table;
+
+ // The file handle of the PF or LF being accessed by the current operation.
+ FILE_HANDLE activeHandle;
+
+ // The file handle of the underlying PF
+ FILE_HANDLE dataHandle;
+
+ // Array of file handles belonging to the underlying LFs
+ FILE_HANDLE* indexHandles;
+
+ // Flag to indicate whether a call needs to be made to unlock a row when
+ // a read operation has ended. DB2 will handle row unlocking as we move
+ // through rows, but if an operation ends before we reach the end of a file,
+ // DB2 needs to know to unlock the last row read.
+ bool releaseRowNeeded;
+
+ // Pointer to a definition of the layout of the row buffer for the file
+ // described by activeHandle
+ const db2i_file::RowFormat* activeFormat;
+
+ IORowBuffer keyBuf;
+ uint32 keyLen;
+
+ IOWriteBuffer multiRowWriteBuf;
+ IOAsyncReadBuffer multiRowReadBuf;
+
+ IOAsyncReadBuffer* activeReadBuf;
+ IOWriteBuffer* activeWriteBuf;
+
+ BlobCollection* blobReadBuffers; // Dynamically allocated per query and used
+ // to manage the buffers used for reading LOBs
+ ValidatedPointer<char>* blobWriteBuffers;
+
+ // Return codes are not used/honored by rnd_init and start_bulk_insert
+ // so we need a way to signal the failure "downstream" to subsequent
+ // functions.
+ int last_rnd_init_rc;
+ int last_index_init_rc;
+ int last_start_bulk_insert_rc;
+
+ // end_bulk_insert may get called twice for a single start_bulk_insert
+ // This is our way to do cleanup only once.
+ bool outstanding_start_bulk_insert;
+
+ // Auto_increment 'increment by' value needed by write_row()
+ uint32 incrementByValue;
+ bool default_identity_value;
+
+ // Flags and values used during write operations for auto_increment processing
+ bool autoIncLockAcquired;
+ bool got_auto_inc_values;
+ uint64 next_identity_value;
+
+ // The access intent indicated by the last external_locks() call.
+ // May be either QMY_READ or QMY_UPDATABLE
+ char accessIntent;
+ char readAccessIntent;
+
+ ha_rows* indexReadSizeEstimates;
+
+ MEM_ROOT conversionBufferMemroot;
+
+ bool forceSingleRowRead;
+
+ bool readAllColumns;
+
+ bool invalidDataFound;
+
+ db2i_ileBridge* cachedBridge;
+
+ ValidatedObject<volatile uint32> curConnection;
+ uint16 activeReferences;
+
+public:
+
+ ha_ibmdb2i(handlerton *hton, TABLE_SHARE *table_arg);
+ ~ha_ibmdb2i();
+
+ const char *table_type() const { return "IBMDB2I"; }
+ const char *index_type(uint inx) { return "RADIX"; }
+ const key_map *keys_to_use_for_scanning() { return &key_map_full; }
+ const char **bas_ext() const;
+
+ ulonglong table_flags() const
+ {
+ return HA_NULL_IN_KEY | HA_REC_NOT_IN_SEQ | HA_AUTO_PART_KEY |
+ HA_PARTIAL_COLUMN_READ |
+ HA_DUPLICATE_POS | HA_NO_PREFIX_CHAR_KEYS |
+ HA_HAS_RECORDS | HA_BINLOG_ROW_CAPABLE | HA_REQUIRES_KEY_COLUMNS_FOR_DELETE |
+ HA_CAN_INDEX_BLOBS;
+ }
+
+ ulong index_flags(uint inx, uint part, bool all_parts) const;
+
+// Note that we do not implement max_supported_record_length.
+// We'll let create fail accordingly if the row is
+// too long. This allows us to hide the fact that varchars > 32K are being
+// implemented as DB2 LOBs.
+
+ uint max_supported_keys() const { return 4000; }
+ uint max_supported_key_parts() const { return MAX_DB2_KEY_PARTS; }
+ uint max_supported_key_length() const { return 32767; }
+ uint max_supported_key_part_length() const { return 32767; }
+ double read_time(uint index, uint ranges, ha_rows rows);
+ double scan_time();
+ int open(const char *name, int mode, uint test_if_locked);
+ int close(void);
+ int write_row(uchar * buf);
+ int update_row(const uchar * old_data, uchar * new_data);
+ int delete_row(const uchar * buf);
+ int index_init(uint idx, bool sorted);
+ int index_read(uchar * buf, const uchar * key,
+ uint key_len, enum ha_rkey_function find_flag);
+ int index_next(uchar * buf);
+ int index_read_last(uchar * buf, const uchar * key, uint key_len);
+ int index_next_same(uchar *buf, const uchar *key, uint keylen);
+ int index_prev(uchar * buf);
+ int index_first(uchar * buf);
+ int index_last(uchar * buf);
+ int rnd_init(bool scan);
+ int rnd_end();
+ int rnd_next(uchar *buf);
+ int rnd_pos(uchar * buf, uchar *pos);
+ void position(const uchar *record);
+ int info(uint);
+ ha_rows records();
+ int extra(enum ha_extra_function operation);
+ int external_lock(THD *thd, int lock_type);
+ int delete_all_rows(void);
+ ha_rows records_in_range(uint inx, key_range *min_key,
+ key_range *max_key);
+ int delete_table(const char *from);
+ int rename_table(const char * from, const char * to);
+ int create(const char *name, TABLE *form,
+ HA_CREATE_INFO *create_info);
+ int updateFrm(TABLE *table_def, File file);
+ int openTableDef(TABLE *table_def);
+ int add_index(TABLE *table_arg, KEY *key_info, uint num_of_keys);
+ int prepare_drop_index(TABLE *table_arg, uint *key_num, uint num_of_keys);
+ int final_drop_index(TABLE *table_arg) {return 0;}
+ void get_auto_increment(ulonglong offset, ulonglong increment,
+ ulonglong nb_desired_values,
+ ulonglong *first_value,
+ ulonglong *nb_reserved_values);
+ int reset_auto_increment(ulonglong value);
+ void restore_auto_increment(ulonglong prev_insert_id) {return;}
+ void update_create_info(HA_CREATE_INFO *create_info);
+ int getNextIdVal(ulonglong *value);
+ int analyze(THD* thd,HA_CHECK_OPT* check_opt);
+ int optimize(THD* thd, HA_CHECK_OPT* check_opt);
+ bool can_switch_engines();
+ void free_foreign_key_create_info(char* str);
+ char* get_foreign_key_create_info();
+ int get_foreign_key_list(THD *thd, List<FOREIGN_KEY_INFO> *f_key_list);
+ uint referenced_by_foreign_key();
+ bool check_if_incompatible_data(HA_CREATE_INFO *info, uint table_changes);
+ virtual bool get_error_message(int error, String *buf);
+
+ THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to,
+ enum thr_lock_type lock_type);
+
+ bool low_byte_first() const { return 0; }
+ void unlock_row();
+ int index_end();
+ int reset();
+ static int doCommit(handlerton *hton, THD *thd, bool all);
+ static int doRollback(handlerton *hton, THD *thd, bool all);
+ void start_bulk_insert(ha_rows rows);
+ int end_bulk_insert();
+ int start_stmt(THD *thd, thr_lock_type lock_type);
+
+ void initBridge(THD* thd = NULL)
+ {
+ if (thd == NULL) thd = ha_thd();
+ DBUG_PRINT("ha_ibmdb2i::initBridge",("Initing bridge. Conn ID=%d", thd->thread_id));
+ cachedBridge = db2i_ileBridge::getBridgeForThread(thd);
+ }
+
+ db2i_ileBridge* bridge() {DBUG_ASSERT(cachedBridge); return cachedBridge;}
+
+ static uint8 autoCommitIsOn(THD* thd)
+ { return (thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN) ? QMY_NO : QMY_YES); }
+
+ uint8 getCommitLevel();
+ uint8 getCommitLevel(THD* thd);
+
+ static int doSavepointSet(THD* thd, char* name)
+ {
+ return db2i_ileBridge::getBridgeForThread(thd)->savepoint(QMY_SET_SAVEPOINT,
+ name);
+ }
+
+ static int doSavepointRollback(THD* thd, char* name)
+ {
+ return db2i_ileBridge::getBridgeForThread(thd)->savepoint(QMY_ROLLBACK_SAVEPOINT,
+ name);
+ }
+
+ static int doSavepointRelease(THD* thd, char* name)
+ {
+ return db2i_ileBridge::getBridgeForThread(thd)->savepoint(QMY_RELEASE_SAVEPOINT,
+ name);
+ }
+
+ // We can't guarantee that the rows we know about when this is called
+ // will be the same number of rows that read returns (since DB2 activity
+ // may insert additional rows). Therefore, we do as the Federated SE and
+ // return the max possible.
+ ha_rows estimate_rows_upper_bound()
+ {
+ return HA_POS_ERROR;
+ }
+
+
+private:
+
+ enum enum_TimeFormat
+ {
+ TIME_OF_DAY,
+ DURATION
+ };
+
+ enum enum_BlobMapping
+ {
+ AS_BLOB,
+ AS_VARCHAR
+ };
+
+ enum enum_ZeroDate
+ {
+ NO_SUBSTITUTE,
+ SUBSTITUTE_0001_01_01
+ };
+
+ enum enum_YearFormat
+ {
+ CHAR4,
+ SMALLINT
+ };
+
+ enum_ZeroDate cachedZeroDateOption;
+
+ IBMDB2I_SHARE *get_share(const char *table_name, TABLE *table);
+ int free_share(IBMDB2I_SHARE *share);
+ int32 mungeDB2row(uchar* record, const char* dataPtr, const char* nullMapPtr, bool skipLOBs);
+ int prepareRowForWrite(char* data, char* nulls, bool honorIdentCols);
+ int prepareReadBufferForLobs();
+ int32 prepareWriteBufferForLobs();
+ uint32 adjustLobBuffersForRead();
+ bool lobFieldsRequested();
+ int convertFieldChars(enum_conversionDirection direction, uint16 fieldID, const char* input, char* output, size_t ilen, size_t olen, size_t* outDataLen);
+
+ /**
+ Fast integer log2 function
+ */
+ uint64 log_2(uint64 val)
+ {
+ uint64 exp = 0;
+ while( (val >> exp) != 0)
+ {
+ exp++;
+ }
+ DBUG_ASSERT(exp-1 == (uint64)log2(val));
+ return exp-1;
+ }
+
+ void bumpInUseCounter(uint16 amount)
+ {
+ activeReferences += amount;
+ DBUG_PRINT("ha_ibmdb2i::bumpInUseCounter", ("activeReferences = %d", activeReferences));
+ if (activeReferences)
+ curConnection = (uint32)(ha_thd()->thread_id);
+ else
+ curConnection = 0;
+ }
+
+
+ int useDataFile()
+ {
+ DBUG_ENTER("ha_ibmdb2i::useDataFile");
+
+ int rc = 0;
+ if (!dataHandle)
+ rc = db2Table->dataFile()->allocateNewInstance(&dataHandle, curConnection);
+ else if (activeHandle == dataHandle)
+ DBUG_RETURN(0);
+
+ DBUG_ASSERT(activeHandle == 0);
+
+ if (likely(rc == 0))
+ {
+ activeHandle = dataHandle;
+ bumpInUseCounter(1);
+ }
+
+ DBUG_RETURN(rc);
+ }
+
+ void releaseAnyLockedRows()
+ {
+ if (releaseRowNeeded)
+ {
+ DBUG_PRINT("ha_ibmdb2i::releaseAnyLockedRows", ("Releasing rows"));
+ db2i_ileBridge::getBridgeForThread()->rrlslck(activeHandle, accessIntent);
+ releaseRowNeeded = FALSE;
+ }
+ }
+
+
+ void releaseDataFile()
+ {
+ DBUG_ENTER("ha_ibmdb2i::releaseDataFile");
+ releaseAnyLockedRows();
+ bumpInUseCounter(-1);
+ DBUG_ASSERT((volatile int)activeReferences >= 0);
+ activeHandle = 0;
+ DBUG_VOID_RETURN;
+ }
+
+ int useIndexFile(int idx);
+
+ void releaseIndexFile(int idx)
+ {
+ DBUG_ENTER("ha_ibmdb2i::releaseIndexFile");
+ releaseAnyLockedRows();
+ bumpInUseCounter(-1);
+ DBUG_ASSERT((volatile int)activeReferences >= 0);
+ activeHandle = 0;
+ DBUG_VOID_RETURN;
+ }
+
+ FILE_HANDLE allocateFileHandle(char* database, char* table, int* activityReference, bool hasBlobs);
+
+ int updateBuffers(const db2i_file::RowFormat* format, uint rowsToRead, uint rowsToWrite);
+
+ int flushWrite(FILE_HANDLE fileHandle, uchar* buf = NULL);
+
+ int alterStartWith();
+
+ int buildDB2ConstraintString(LEX* lex,
+ String& appendHere,
+ const char* database,
+ Field** fields,
+ char* fileSortSequenceType,
+ char* fileSortSequence,
+ char* fileSortSequenceLibrary);
+
+ void releaseWriteBuffer();
+
+ void setIndexReadEstimate(uint index, ha_rows rows)
+ {
+ if (!indexReadSizeEstimates)
+ {
+ indexReadSizeEstimates = (ha_rows*)my_malloc(sizeof(ha_rows) * table->s->keys, MYF(MY_WME | MY_ZEROFILL));
+ }
+ indexReadSizeEstimates[index] = rows;
+ }
+
+ ha_rows getIndexReadEstimate(uint index)
+ {
+ if (indexReadSizeEstimates)
+ return max(indexReadSizeEstimates[index], 1);
+
+ return 10000; // Assume index scan if no estimate exists.
+ }
+
+
+ void quiesceAllFileHandles()
+ {
+ db2i_ileBridge* bridge = db2i_ileBridge::getBridgeForThread();
+ if (dataHandle)
+ {
+ bridge->quiesceFileInstance(dataHandle);
+ }
+
+ for (int idx = 0; idx < table_share->keys; ++idx)
+ {
+ if (indexHandles[idx] != 0)
+ {
+ bridge->quiesceFileInstance(indexHandles[idx]);
+ }
+ }
+ }
+
+ int32 buildCreateIndexStatement(SqlStatementStream& sqlStream,
+ KEY& key,
+ bool isPrimary,
+ const char* db2LibName,
+ const char* db2FileName);
+
+ // Specify NULL for data when using the data pointed to by field
+ int32 convertMySQLtoDB2(Field* field, const DB2Field& db2Field, char* db2Buf, const uchar* data = NULL);
+
+ int32 convertDB2toMySQL(const DB2Field& db2Field, Field* field, const char* buf);
+ int getFieldTypeMapping(Field* field,
+ String& mapping,
+ enum_TimeFormat timeFormate,
+ enum_BlobMapping blobMapping,
+ enum_ZeroDate zeroDateHandling,
+ bool propagateDefaults,
+ enum_YearFormat yearFormat);
+
+ int getKeyFromName(const char* name, size_t len);
+
+ void releaseActiveHandle()
+ {
+ if (activeHandle == dataHandle)
+ releaseDataFile();
+ else
+ releaseIndexFile(active_index);
+ }
+
+
+ int32 finishBulkInsert();
+
+ void doInitialRead(char orientation,
+ uint32 rowsToBuffer,
+ ILEMemHandle key = 0,
+ int keyLength = 0,
+ int keyParts = 0);
+
+
+ int32 readFromBuffer(uchar* destination, char orientation)
+ {
+ char* row;
+ int32 rc = 0;
+ row = activeReadBuf->readNextRow(orientation, currentRRN);
+
+ if (unlikely(!row))
+ {
+ rc = activeReadBuf->lastrc();
+ if (rc == QMY_ERR_LOB_SPACE_TOO_SMALL)
+ {
+ rc = handleLOBReadOverflow();
+ if (rc == 0)
+ {
+ DBUG_ASSERT(activeReadBuf->rowCount() == 1);
+ row = activeReadBuf->readNextRow(orientation, currentRRN);
+
+ if (unlikely(!row))
+ rc = activeReadBuf->lastrc();
+ }
+ }
+ }
+
+ if (likely(rc == 0))
+ {
+ rrnAssocHandle = activeHandle;
+ rc = mungeDB2row(destination, row, row+activeReadBuf->getRowNullOffset(), false);
+ }
+ return rc;
+ }
+
+ int32 handleLOBReadOverflow();
+
+ char* getCharacterConversionBuffer(int fieldId, int length)
+ {
+ if (unlikely(!alloc_root_inited(&conversionBufferMemroot)))
+ init_alloc_root(&conversionBufferMemroot, 8192, 0);
+
+ return (char*)alloc_root(&conversionBufferMemroot, length);;
+ }
+
+ void resetCharacterConversionBuffers()
+ {
+ if (alloc_root_inited(&conversionBufferMemroot))
+ {
+ free_root(&conversionBufferMemroot, MYF(MY_MARK_BLOCKS_FREE));
+ }
+ }
+
+ void tweakReadSet()
+ {
+ THD* thd = ha_thd();
+ int command = thd_sql_command(thd);
+ if ((command == SQLCOM_UPDATE ||
+ command == SQLCOM_UPDATE_MULTI) ||
+ ((command == SQLCOM_DELETE ||
+ command == SQLCOM_DELETE_MULTI) &&
+ thd->options & OPTION_BIN_LOG))
+ readAllColumns = TRUE;
+ else
+ readAllColumns = FALSE;
+ }
+
+ /**
+
+ */
+ int useFileByHandle(char intent,
+ FILE_HANDLE handle)
+ {
+ DBUG_ENTER("ha_ibmdb2i::useFileByHandle");
+
+ const db2i_file* file;
+ if (handle == dataHandle)
+ file = db2Table->dataFile();
+ else
+ {
+ for (uint i = 0; i < table_share->keys; ++i)
+ {
+ if (indexHandles[i] == handle)
+ {
+ file = db2Table->indexFile(i);
+ active_index = i;
+ }
+ }
+ }
+
+ int rc = file->obtainRowFormat(handle, intent, getCommitLevel(), &activeFormat);
+ if (likely(rc == 0))
+ {
+ activeHandle = handle;
+ bumpInUseCounter(1);
+ }
+
+ DBUG_RETURN(rc);
+ }
+
+ const db2i_file* getFileForActiveHandle() const
+ {
+ if (activeHandle == dataHandle)
+ return db2Table->dataFile();
+ else
+ for (uint i = 0; i < table_share->keys; ++i)
+ if (indexHandles[i] == activeHandle)
+ return db2Table->indexFile(i);
+ DBUG_ASSERT(0);
+ return NULL;
+ }
+
+ int prepReadBuffer(ha_rows rowsToRead, const db2i_file* file, char intent);
+ int prepWriteBuffer(ha_rows rowsToWrite, const db2i_file* file);
+
+ void invalidateCachedStats()
+ {
+ share->cachedStats.invalidate(rowCount | deletedRowCount | objLength |
+ meanRowLen | ioCount);
+ }
+
+ void warnIfInvalidData()
+ {
+ if (unlikely(invalidDataFound))
+ {
+ warning(ha_thd(), DB2I_ERR_INVALID_DATA, table->alias);
+ }
+ }
+
+ /**
+ Calculate the maximum value that a particular field can hold.
+
+ This is used to anticipate overflows in the auto_increment processing.
+
+ @param field The Field to be analyzed
+
+ @return The maximum value
+ */
+ static uint64 maxValueForField(const Field* field)
+ {
+ uint64 maxValue=0;
+ switch (field->type())
+ {
+ case MYSQL_TYPE_TINY:
+ if (((const Field_num*)field)->unsigned_flag)
+ maxValue = (1 << 8) - 1;
+ else
+ maxValue = (1 << 7) - 1;
+ break;
+ case MYSQL_TYPE_SHORT:
+ if (((const Field_num*)field)->unsigned_flag)
+ maxValue = (1 << 16) - 1;
+ else
+ maxValue = (1 << 15) - 1;
+ break;
+ case MYSQL_TYPE_INT24:
+ if (((const Field_num*)field)->unsigned_flag)
+ maxValue = (1 << 24) - 1;
+ else
+ maxValue = (1 << 23) - 1;
+ break;
+ case MYSQL_TYPE_LONG:
+ if (((const Field_num*)field)->unsigned_flag)
+ maxValue = (1LL << 32) - 1;
+ else
+ maxValue = (1 << 31) - 1;
+ break;
+ case MYSQL_TYPE_LONGLONG:
+ if (((const Field_num*)field)->unsigned_flag)
+ maxValue = ~(0LL);
+ else
+ maxValue = 1 << 63 - 1;
+ break;
+ }
+
+ return maxValue;
+ }
+
+ void cleanupBuffers()
+ {
+ if (blobReadBuffers)
+ {
+ delete blobReadBuffers;
+ blobReadBuffers = NULL;
+ }
+ if (blobWriteBuffers)
+ {
+ delete[] blobWriteBuffers;
+ blobWriteBuffers = NULL;
+ }
+ if (alloc_root_inited(&conversionBufferMemroot))
+ {
+ free_root(&conversionBufferMemroot, MYF(0));
+ }
+ }
+
+};
diff --git a/storage/ibmdb2i/plug.in b/storage/ibmdb2i/plug.in
new file mode 100644
index 00000000000..0913d72aabf
--- /dev/null
+++ b/storage/ibmdb2i/plug.in
@@ -0,0 +1,12 @@
+MYSQL_STORAGE_ENGINE([ibmdb2i], [], [IBM DB2 for i Storage Engine],
+ [IBM DB2 for i Storage Engine], [max,max-no-ndb])
+MYSQL_PLUGIN_DYNAMIC([ibmdb2i], [ha_ibmdb2i.la])
+
+AC_CHECK_HEADER([qlgusr.h],
+ # qlgusr.h is just one of the headers from the i5/OS PASE environment; the
+ # EBCDIC headers are in /QIBM/include, and have to be converted to ASCII
+ # before cpp gets to them
+ [:],
+ # Missing PASE environment, can't build this engine
+ [mysql_plugin_ibmdb2i=no
+ with_plugin_ibmdb2i=no])
diff --git a/storage/innobase/btr/btr0sea.c b/storage/innobase/btr/btr0sea.c
index 3482e16497a..84ad0e27110 100644
--- a/storage/innobase/btr/btr0sea.c
+++ b/storage/innobase/btr/btr0sea.c
@@ -1105,12 +1105,20 @@ btr_search_drop_page_hash_when_freed(
page = buf_page_get_gen(space, page_no, RW_S_LATCH, NULL,
BUF_GET_IF_IN_POOL, __FILE__, __LINE__,
&mtr);
+ /* Because the buffer pool mutex was released by
+ buf_page_peek_if_search_hashed(), it is possible that the
+ block was removed from the buffer pool by another thread
+ before buf_page_get_gen() got a chance to acquire the buffer
+ pool mutex again. Thus, we must check for a NULL return. */
+
+ if (UNIV_LIKELY(page != NULL)) {
#ifdef UNIV_SYNC_DEBUG
- buf_page_dbg_add_level(page, SYNC_TREE_NODE_FROM_HASH);
+ buf_page_dbg_add_level(page, SYNC_TREE_NODE_FROM_HASH);
#endif /* UNIV_SYNC_DEBUG */
- btr_search_drop_page_hash_index(page);
+ btr_search_drop_page_hash_index(page);
+ }
mtr_commit(&mtr);
}
diff --git a/storage/innobase/dict/dict0load.c b/storage/innobase/dict/dict0load.c
index f594e64f517..65f1c9536bd 100644
--- a/storage/innobase/dict/dict0load.c
+++ b/storage/innobase/dict/dict0load.c
@@ -868,11 +868,11 @@ err_exit:
of the error condition, since the user may want to dump data from the
clustered index. However we load the foreign key information only if
all indexes were loaded. */
- if (err != DB_SUCCESS && !srv_force_recovery) {
- dict_mem_table_free(table);
- table = NULL;
- } else if (err == DB_SUCCESS) {
+ if (err == DB_SUCCESS) {
err = dict_load_foreigns(table->name, TRUE);
+ } else if (!srv_force_recovery) {
+ dict_table_remove_from_cache(table);
+ table = NULL;
}
#if 0
if (err != DB_SUCCESS && table != NULL) {
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index 50c3917c43c..a019b95a2bb 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -953,6 +953,12 @@ innobase_next_autoinc(
/* Should never be 0. */
ut_a(increment > 0);
+ /* According to MySQL documentation, if the offset is greater than
+ the increment then the offset is ignored. */
+ if (offset > increment) {
+ offset = 0;
+ }
+
if (max_value <= current) {
next_value = max_value;
} else if (offset <= 1) {
@@ -3312,8 +3318,8 @@ build_template(
goto include_field;
}
- if (bitmap_is_set(table->read_set, i) ||
- bitmap_is_set(table->write_set, i)) {
+ if (bitmap_is_set(table->read_set, i) ||
+ bitmap_is_set(table->write_set, i)) {
/* This field is needed in the query */
goto include_field;
@@ -3405,7 +3411,7 @@ skip_field:
}
/************************************************************************
-Get the upper limit of the MySQL integral type. */
+Get the upper limit of the MySQL integral and floating-point type. */
ulonglong
ha_innobase::innobase_get_int_col_max_value(
@@ -3416,7 +3422,7 @@ ha_innobase::innobase_get_int_col_max_value(
switch(field->key_type()) {
/* TINY */
- case HA_KEYTYPE_BINARY:
+ case HA_KEYTYPE_BINARY:
max_value = 0xFFULL;
break;
case HA_KEYTYPE_INT8:
@@ -3430,7 +3436,7 @@ ha_innobase::innobase_get_int_col_max_value(
max_value = 0x7FFFULL;
break;
/* MEDIUM */
- case HA_KEYTYPE_UINT24:
+ case HA_KEYTYPE_UINT24:
max_value = 0xFFFFFFULL;
break;
case HA_KEYTYPE_INT24:
@@ -3444,12 +3450,20 @@ ha_innobase::innobase_get_int_col_max_value(
max_value = 0x7FFFFFFFULL;
break;
/* BIG */
- case HA_KEYTYPE_ULONGLONG:
+ case HA_KEYTYPE_ULONGLONG:
max_value = 0xFFFFFFFFFFFFFFFFULL;
break;
case HA_KEYTYPE_LONGLONG:
max_value = 0x7FFFFFFFFFFFFFFFULL;
break;
+ case HA_KEYTYPE_FLOAT:
+ /* We use the maximum as per IEEE754-2008 standard, 2^24 */
+ max_value = 0x1000000ULL;
+ break;
+ case HA_KEYTYPE_DOUBLE:
+ /* We use the maximum as per IEEE754-2008 standard, 2^53 */
+ max_value = 0x20000000000000ULL;
+ break;
default:
ut_error;
}
@@ -3772,7 +3786,7 @@ no_commit:
will be 0 if get_auto_increment() was not called.*/
if (auto_inc <= col_max_value
- && auto_inc > prebuilt->autoinc_last_value) {
+ && auto_inc >= prebuilt->autoinc_last_value) {
set_max_autoinc:
ut_a(prebuilt->autoinc_increment > 0);
@@ -4252,7 +4266,6 @@ convert_search_mode_to_innobase(
case HA_READ_MBR_WITHIN:
case HA_READ_MBR_DISJOINT:
case HA_READ_MBR_EQUAL:
- my_error(ER_TABLE_CANT_HANDLE_SPKEYS, MYF(0));
return(PAGE_CUR_UNSUPP);
/* do not use "default:" in order to produce a gcc warning:
enumeration value '...' not handled in switch
@@ -5803,7 +5816,7 @@ ha_innobase::records_in_range(
mode2);
} else {
- n_rows = 0;
+ n_rows = HA_POS_ERROR;
}
dtuple_free_for_mysql(heap1);
@@ -7651,11 +7664,13 @@ ha_innobase::get_auto_increment(
prebuilt->autoinc_last_value = next_value;
- ut_a(prebuilt->autoinc_last_value >= *first_value);
-
- /* Update the table autoinc variable */
- dict_table_autoinc_update_if_greater(
- prebuilt->table, prebuilt->autoinc_last_value);
+ if (prebuilt->autoinc_last_value < *first_value) {
+ *first_value = (~(ulonglong) 0);
+ } else {
+ /* Update the table autoinc variable */
+ dict_table_autoinc_update_if_greater(
+ prebuilt->table, prebuilt->autoinc_last_value);
+ }
} else {
/* This will force write_row() into attempting an update
of the table's AUTOINC counter. */
diff --git a/storage/innobase/include/rem0rec.h b/storage/innobase/include/rem0rec.h
index 43ef6650e90..abc204bb583 100644
--- a/storage/innobase/include/rem0rec.h
+++ b/storage/innobase/include/rem0rec.h
@@ -365,8 +365,9 @@ rec_set_field_extern_bits(
/***************************************************************
This is used to modify the value of an already existing field in a record.
The previous value must have exactly the same size as the new value. If len
-is UNIV_SQL_NULL then the field is treated as an SQL null for old-style
-records. For new-style records, len must not be UNIV_SQL_NULL. */
+is UNIV_SQL_NULL then the field is treated as an SQL null.
+For records in ROW_FORMAT=COMPACT (new-style records), len must not be
+UNIV_SQL_NULL unless the field already is SQL null. */
UNIV_INLINE
void
rec_set_nth_field(
@@ -375,11 +376,7 @@ rec_set_nth_field(
const ulint* offsets,/* in: array returned by rec_get_offsets() */
ulint n, /* in: index number of the field */
const void* data, /* in: pointer to the data if not SQL null */
- ulint len); /* in: length of the data or UNIV_SQL_NULL.
- If not SQL null, must have the same
- length as the previous value.
- If SQL null, previous value must be
- SQL null. */
+ ulint len); /* in: length of the data or UNIV_SQL_NULL */
/**************************************************************
The following function returns the data size of an old-style physical
record, that is the sum of field lengths. SQL null fields
diff --git a/storage/innobase/include/rem0rec.ic b/storage/innobase/include/rem0rec.ic
index 5a4a0a0b5df..d91fb4c4391 100644
--- a/storage/innobase/include/rem0rec.ic
+++ b/storage/innobase/include/rem0rec.ic
@@ -1219,8 +1219,9 @@ rec_get_nth_field_size(
/***************************************************************
This is used to modify the value of an already existing field in a record.
The previous value must have exactly the same size as the new value. If len
-is UNIV_SQL_NULL then the field is treated as an SQL null for old-style
-records. For new-style records, len must not be UNIV_SQL_NULL. */
+is UNIV_SQL_NULL then the field is treated as an SQL null.
+For records in ROW_FORMAT=COMPACT (new-style records), len must not be
+UNIV_SQL_NULL unless the field already is SQL null. */
UNIV_INLINE
void
rec_set_nth_field(
@@ -1230,11 +1231,7 @@ rec_set_nth_field(
ulint n, /* in: index number of the field */
const void* data, /* in: pointer to the data
if not SQL null */
- ulint len) /* in: length of the data or UNIV_SQL_NULL.
- If not SQL null, must have the same
- length as the previous value.
- If SQL null, previous value must be
- SQL null. */
+ ulint len) /* in: length of the data or UNIV_SQL_NULL */
{
byte* data2;
ulint len2;
@@ -1242,9 +1239,11 @@ rec_set_nth_field(
ut_ad(rec);
ut_ad(rec_offs_validate(rec, NULL, offsets));
- if (len == UNIV_SQL_NULL) {
- ut_ad(!rec_offs_comp(offsets));
- rec_set_nth_field_sql_null(rec, n);
+ if (UNIV_UNLIKELY(len == UNIV_SQL_NULL)) {
+ if (!rec_offs_nth_sql_null(offsets, n)) {
+ ut_a(!rec_offs_comp(offsets));
+ rec_set_nth_field_sql_null(rec, n);
+ }
return;
}
diff --git a/storage/innobase/include/trx0roll.h b/storage/innobase/include/trx0roll.h
index 25546430ba0..c1eca3d5753 100644
--- a/storage/innobase/include/trx0roll.h
+++ b/storage/innobase/include/trx0roll.h
@@ -15,6 +15,8 @@ Created 3/26/1996 Heikki Tuuri
#include "mtr0mtr.h"
#include "trx0sys.h"
+#define trx_roll_free_all_savepoints(s) trx_roll_savepoints_free((s), NULL)
+
/***********************************************************************
Returns a transaction savepoint taken at this point in time. */
@@ -237,7 +239,17 @@ trx_release_savepoint_for_mysql(
const char* savepoint_name); /* in: savepoint name */
/***********************************************************************
-Frees savepoint structs. */
+Frees a single savepoint struct. */
+
+void
+trx_roll_savepoint_free(
+/*=====================*/
+ trx_t* trx, /* in: transaction handle */
+ trx_named_savept_t* savep); /* in: savepoint to free */
+
+/***********************************************************************
+Frees savepoint structs starting from savep, if savep == NULL then
+free all savepoints. */
void
trx_roll_savepoints_free(
diff --git a/storage/innobase/lock/lock0lock.c b/storage/innobase/lock/lock0lock.c
index 173d074cb82..d9bc8ba09e4 100644
--- a/storage/innobase/lock/lock0lock.c
+++ b/storage/innobase/lock/lock0lock.c
@@ -681,7 +681,10 @@ lock_is_table_exclusive(
lock_t* lock;
ibool ok = FALSE;
- ut_ad(table && trx);
+ ut_ad(table);
+ ut_ad(trx);
+
+ lock_mutex_enter_kernel();
for (lock = UT_LIST_GET_FIRST(table->locks);
lock;
@@ -689,7 +692,7 @@ lock_is_table_exclusive(
if (lock->trx != trx) {
/* A lock on the table is held
by some other transaction. */
- return(FALSE);
+ goto not_ok;
}
if (!(lock_get_type(lock) & LOCK_TABLE)) {
@@ -706,11 +709,16 @@ lock_is_table_exclusive(
auto_increment lock. */
break;
default:
+not_ok:
/* Other table locks than LOCK_IX are not allowed. */
- return(FALSE);
+ ok = FALSE;
+ goto func_exit;
}
}
+func_exit:
+ lock_mutex_exit_kernel();
+
return(ok);
}
@@ -3664,6 +3672,7 @@ lock_table_has_to_wait_in_queue(
dict_table_t* table;
lock_t* lock;
+ ut_ad(mutex_own(&kernel_mutex));
ut_ad(lock_get_wait(wait_lock));
table = wait_lock->un_member.tab_lock.table;
diff --git a/storage/innobase/trx/trx0roll.c b/storage/innobase/trx/trx0roll.c
index 91dcf035f96..8934fe87c7e 100644
--- a/storage/innobase/trx/trx0roll.c
+++ b/storage/innobase/trx/trx0roll.c
@@ -185,7 +185,25 @@ trx_rollback_last_sql_stat_for_mysql(
}
/***********************************************************************
-Frees savepoint structs. */
+Frees a single savepoint struct. */
+
+void
+trx_roll_savepoint_free(
+/*=====================*/
+ trx_t* trx, /* in: transaction handle */
+ trx_named_savept_t* savep) /* in: savepoint to free */
+{
+ ut_a(savep != NULL);
+ ut_a(UT_LIST_GET_LEN(trx->trx_savepoints) > 0);
+
+ UT_LIST_REMOVE(trx_savepoints, trx->trx_savepoints, savep);
+ mem_free(savep->name);
+ mem_free(savep);
+}
+
+/***********************************************************************
+Frees savepoint structs starting from savep, if savep == NULL then
+free all savepoints. */
void
trx_roll_savepoints_free(
@@ -206,9 +224,7 @@ trx_roll_savepoints_free(
while (savep != NULL) {
next_savep = UT_LIST_GET_NEXT(trx_savepoints, savep);
- UT_LIST_REMOVE(trx_savepoints, trx->trx_savepoints, savep);
- mem_free(savep->name);
- mem_free(savep);
+ trx_roll_savepoint_free(trx, savep);
savep = next_savep;
}
@@ -343,8 +359,8 @@ trx_savepoint_for_mysql(
}
/***********************************************************************
-Releases a named savepoint. Savepoints which
-were set after this savepoint are deleted. */
+Releases only the named savepoint. Savepoints which were set after this
+savepoint are left as is. */
ulint
trx_release_savepoint_for_mysql(
@@ -360,31 +376,16 @@ trx_release_savepoint_for_mysql(
savep = UT_LIST_GET_FIRST(trx->trx_savepoints);
+ /* Search for the savepoint by name and free if found. */
while (savep != NULL) {
if (0 == ut_strcmp(savep->name, savepoint_name)) {
- /* Found */
- break;
+ trx_roll_savepoint_free(trx, savep);
+ return(DB_SUCCESS);
}
savep = UT_LIST_GET_NEXT(trx_savepoints, savep);
}
- if (savep == NULL) {
-
- return(DB_NO_SAVEPOINT);
- }
-
- /* We can now free all savepoints strictly later than this one */
-
- trx_roll_savepoints_free(trx, savep);
-
- /* Now we can free this savepoint too */
-
- UT_LIST_REMOVE(trx_savepoints, trx->trx_savepoints, savep);
-
- mem_free(savep->name);
- mem_free(savep);
-
- return(DB_SUCCESS);
+ return(DB_NO_SAVEPOINT);
}
/***********************************************************************
diff --git a/storage/innobase/trx/trx0trx.c b/storage/innobase/trx/trx0trx.c
index 1fceaa3562c..43456865903 100644
--- a/storage/innobase/trx/trx0trx.c
+++ b/storage/innobase/trx/trx0trx.c
@@ -930,8 +930,8 @@ trx_commit_off_kernel(
mutex_enter(&kernel_mutex);
}
- /* Free savepoints */
- trx_roll_savepoints_free(trx, NULL);
+ /* Free all savepoints */
+ trx_roll_free_all_savepoints(trx);
trx->conc_state = TRX_NOT_STARTED;
trx->rseg = NULL;
diff --git a/storage/myisam/ha_myisam.cc b/storage/myisam/ha_myisam.cc
index ad06ea4b7f0..2bf55f55730 100644
--- a/storage/myisam/ha_myisam.cc
+++ b/storage/myisam/ha_myisam.cc
@@ -1753,7 +1753,7 @@ int ha_myisam::info(uint flag)
if (share->key_parts)
memcpy((char*) table->key_info[0].rec_per_key,
(char*) misam_info.rec_per_key,
- sizeof(table->key_info[0].rec_per_key)*share->key_parts);
+ sizeof(table->key_info[0].rec_per_key[0])*share->key_parts);
if (share->tmp_table == NO_TMP_TABLE)
pthread_mutex_unlock(&share->mutex);
@@ -1789,6 +1789,8 @@ int ha_myisam::extra(enum ha_extra_function operation)
{
if ((specialflag & SPECIAL_SAFE_MODE) && operation == HA_EXTRA_KEYREAD)
return 0;
+ if (operation == HA_EXTRA_MMAP && !opt_myisam_use_mmap)
+ return 0;
return mi_extra(file, operation, 0);
}
diff --git a/storage/myisam/myisamchk.c b/storage/myisam/myisamchk.c
index f8fcdcb6fab..8165bd191b1 100644
--- a/storage/myisam/myisamchk.c
+++ b/storage/myisam/myisamchk.c
@@ -363,6 +363,7 @@ static void usage(void)
-#, --debug=... Output debug log. Often this is 'd:t:o,filename'.\n");
#endif
printf("\
+ -H, --HELP Display this help and exit.\n\
-?, --help Display this help and exit.\n\
-O, --set-variable var=option.\n\
Change the value of a variable. Please note that\n\
diff --git a/storage/myisammrg/ha_myisammrg.cc b/storage/myisammrg/ha_myisammrg.cc
index d674f6bc150..839dfbdb683 100644
--- a/storage/myisammrg/ha_myisammrg.cc
+++ b/storage/myisammrg/ha_myisammrg.cc
@@ -872,6 +872,16 @@ int ha_myisammrg::info(uint flag)
table->s->crashed= 1;
#endif
stats.data_file_length= mrg_info.data_file_length;
+ if (mrg_info.errkey >= (int) table_share->keys)
+ {
+ /*
+ If value of errkey is higher than the number of keys
+ on the table set errkey to MAX_KEY. This will be
+ treated as unknown key case and error message generator
+ won't try to locate key causing segmentation fault.
+ */
+ mrg_info.errkey= MAX_KEY;
+ }
errkey= mrg_info.errkey;
table->s->keys_in_use.set_prefix(table->s->keys);
stats.mean_rec_length= mrg_info.reclength;
diff --git a/support-files/Makefile.am b/support-files/Makefile.am
index a6001e635e6..77eddea3227 100644
--- a/support-files/Makefile.am
+++ b/support-files/Makefile.am
@@ -119,6 +119,7 @@ SUFFIXES = .sh
-e 's!@''SHARED_LIB_VERSION''@!@SHARED_LIB_VERSION@!' \
-e 's!@''MYSQL_BASE_VERSION''@!@MYSQL_BASE_VERSION@!' \
-e 's!@''MYSQL_NO_DASH_VERSION''@!@MYSQL_NO_DASH_VERSION@!' \
+ -e 's!@''MYSQL_COPYRIGHT_YEAR''@!@MYSQL_COPYRIGHT_YEAR@!' \
-e 's!@''MYSQL_TCP_PORT''@!@MYSQL_TCP_PORT@!' \
-e 's!@''PERL_DBI_VERSION''@!@PERL_DBI_VERSION@!' \
-e 's!@''PERL_DBD_VERSION''@!@PERL_DBD_VERSION@!' \
diff --git a/support-files/mysql.spec.sh b/support-files/mysql.spec.sh
index 7c08fdf4734..778b04b30fe 100644
--- a/support-files/mysql.spec.sh
+++ b/support-files/mysql.spec.sh
@@ -41,7 +41,7 @@
%else
%define release 0.glibc23
%endif
-%define license GPL
+%define mysql_license GPL
%define mysqld_user mysql
%define mysqld_group mysql
%define server_suffix -standard
@@ -75,7 +75,7 @@ Summary: MySQL: a very fast and reliable SQL database server
Group: Applications/Databases
Version: @MYSQL_NO_DASH_VERSION@
Release: %{release}
-License: Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Under %{license} license as shown in the Description field.
+License: Copyright 2000-2008 MySQL AB, @MYSQL_COPYRIGHT_YEAR@ Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Under %{mysql_license} license as shown in the Description field.
Source: http://www.mysql.com/Downloads/MySQL-@MYSQL_BASE_VERSION@/mysql-%{mysql_version}.tar.gz
URL: http://www.mysql.com/
Packager: Sun Microsystems, Inc. Product Engineering Team <build@mysql.com>
@@ -96,7 +96,7 @@ is intended for mission-critical, heavy-load production systems as well
as for embedding into mass-deployed software. MySQL is a trademark of
Sun Microsystems, Inc.
-Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc. All rights reserved.
+Copyright 2000-2008 MySQL AB, @MYSQL_COPYRIGHT_YEAR@ Sun Microsystems, Inc. All rights reserved.
Use is subject to license terms.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
@@ -120,7 +120,7 @@ is intended for mission-critical, heavy-load production systems as well
as for embedding into mass-deployed software. MySQL is a trademark of
Sun Microsystems, Inc.
-Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc. All rights reserved.
+Copyright 2000-2008 MySQL AB, @MYSQL_COPYRIGHT_YEAR@ Sun Microsystems, Inc. All rights reserved.
Use is subject to license terms.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
@@ -366,7 +366,7 @@ CFLAGS="$CFLAGS" \
CXXFLAGS="$CXXFLAGS" \
BuildMySQL "\
--with-debug \
- --with-comment=\"MySQL Community Server - Debug (%{license})\"")
+ --with-comment=\"MySQL Community Server - Debug (%{mysql_license})\"")
# We might want to save the config log file
if test -n "$MYSQL_DEBUGCONFLOG_DEST"
@@ -387,7 +387,7 @@ CFLAGS="$CFLAGS" \
CXXFLAGS="$CXXFLAGS" \
BuildMySQL "\
--with-embedded-server \
- --with-comment=\"MySQL Community Server (%{license})\"")
+ --with-comment=\"MySQL Community Server (%{mysql_license})\"")
# We might want to save the config log file
if test -n "$MYSQL_CONFLOG_DEST"
then
diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c
index 0d32a7fc4ce..cd40c409234 100644
--- a/tests/mysql_client_test.c
+++ b/tests/mysql_client_test.c
@@ -723,6 +723,7 @@ static void do_verify_prepare_field(MYSQL_RES *result,
{
MYSQL_FIELD *field;
CHARSET_INFO *cs;
+ ulonglong expected_field_length;
if (!(field= mysql_fetch_field_direct(result, no)))
{
@@ -731,6 +732,8 @@ static void do_verify_prepare_field(MYSQL_RES *result,
}
cs= get_charset(field->charsetnr, 0);
DIE_UNLESS(cs);
+ if ((expected_field_length= length * cs->mbmaxlen) > UINT_MAX32)
+ expected_field_length= UINT_MAX32;
if (!opt_silent)
{
fprintf(stdout, "\n field[%d]:", no);
@@ -745,8 +748,8 @@ static void do_verify_prepare_field(MYSQL_RES *result,
fprintf(stdout, "\n org_table:`%s`\t(expected: `%s`)",
field->org_table, org_table);
fprintf(stdout, "\n database :`%s`\t(expected: `%s`)", field->db, db);
- fprintf(stdout, "\n length :`%lu`\t(expected: `%lu`)",
- field->length, length * cs->mbmaxlen);
+ fprintf(stdout, "\n length :`%lu`\t(expected: `%llu`)",
+ field->length, expected_field_length);
fprintf(stdout, "\n maxlength:`%ld`", field->max_length);
fprintf(stdout, "\n charsetnr:`%d`", field->charsetnr);
fprintf(stdout, "\n default :`%s`\t(expected: `%s`)",
@@ -782,11 +785,11 @@ static void do_verify_prepare_field(MYSQL_RES *result,
as utf8. Field length is calculated as number of characters * maximum
number of bytes a character can occupy.
*/
- if (length && field->length != length * cs->mbmaxlen)
+ if (length && (field->length != expected_field_length))
{
- fprintf(stderr, "Expected field length: %d, got length: %d\n",
- (int) (length * cs->mbmaxlen), (int) field->length);
- DIE_UNLESS(field->length == length * cs->mbmaxlen);
+ fprintf(stderr, "Expected field length: %llu, got length: %lu\n",
+ expected_field_length, field->length);
+ DIE_UNLESS(field->length == expected_field_length);
}
if (def)
DIE_UNLESS(strcmp(field->def, def) == 0);